stocks-list
Reference : https://github.com/akashgiri/stocks-list
nav_change.py
#!/usr/bin/python
import json
import re
import requests
from fuzzywuzzy import fuzz
from price_changes import get_stock_price_data
GOOGLE_FINANCE_URL = "http://finance.google.com/finance/info?client=ig&q=NSE:"
class MutualFundNavAnalysis:
matched_stocks_data = {}
def __init__(self):
MutualFundNavAnalysis.matched_stocks_data = {}
def get_mf_stock_data(self):
stocks_data = open("stocks-list.json", "r")
stocks = json.load(stocks_data)
stocks_data.close()
return stocks
def get_listed_stocks_dict(self):
#stocks_data = open("new-formatted.json", "r")
stocks_data = open("letter_wise_formatting.json", "r")
stocks = json.load(stocks_data)
stocks_data.close()
return stocks
def get_matched_stocks_list(self):
mf_stocks = self.get_mf_stock_data()
listed_stocks = self.get_listed_stocks_dict()
all_mf_stocks = []
## file to store matched and unmatched stocks data
data_file = open("analysis_data.txt", "w")
for key in mf_stocks.keys():
all_mf_stocks = mf_stocks[key]["stocks-data"]
misc_data = mf_stocks[key]["miscellaneous"]
print "Total stocks in mf: " + key + " : " + str(len(all_mf_stocks))
MutualFundNavAnalysis.matched_stocks_data.setdefault(key, [])
match_count = 0
matched_stocks = []
data_file.write("MATCHED STOCKS\n")
## loop to generate the matching stocks and the stock codes
## which will be used to fetch the stock data from google finance
for stock in all_mf_stocks:
stock_name = stock["stock"]
first_letter = stock_name[0].upper()
## Branch directly to stocks starting letter
## The data for stocks is segregated based on first letter of stock name
for current_stock in listed_stocks[first_letter]:
if self.is_fuzzy_matching_valid(stock_name, current_stock):
data_file.write(stock_name+" ==> "+current_stock+"\n")
match_count += 1
matched_stocks.append(stock_name)
## Prepare data for matched stocks
## stock data appended to matched_stocks_data
## in format: [[STOCK_CODE_1, WEIGHTING_1], [STOCK_CODE_2, WEIGHTING_2], ..]
stock_code = listed_stocks[first_letter][current_stock]
append_data = [stock_name, misc_data["cash_allocation"], stock_code, stock["weighting"]]
self.append_matched_data(key, append_data)
self.dump_matching_analysis(data_file, match_count, all_mf_stocks, matched_stocks)
self.append_price_change_data_in_matched_stocks()
def is_fuzzy_matching_valid(self, stock_name, current_stock):
## Get the token sort ratio from fuzzywuzzy
ratio = fuzz.token_sort_ratio(stock_name, current_stock)
return ratio > 95
def append_matched_data(self, key, append_data):
size = len(MutualFundNavAnalysis.matched_stocks_data[key])
MutualFundNavAnalysis.matched_stocks_data[key].append([])
## add all data
for data in append_data:
MutualFundNavAnalysis.matched_stocks_data[key][size].append(data)
def dump_matching_analysis(self, data_file, match_count, all_mf_stocks, matched_stocks):
#data_file = open("analysis_data.txt", "a")
print "Total matches : " + str(match_count)
print "Stocks not matched are: \n"
data_file.write("\n\nNOT MATCHED STOCKS\n")
## write all non-matched stocks for analysis
for s in all_mf_stocks:
stock = s["stock"]
if stock not in matched_stocks:
print stock
data_file.write(stock+"\n")
print "\n"
data_file.close()
def append_price_change_data_in_matched_stocks(self):
## Fetch all the price changes for matched stocks with stock codes
for key in MutualFundNavAnalysis.matched_stocks_data.keys():
print "\nPrice changes in MF %s \n" % key
for data in MutualFundNavAnalysis.matched_stocks_data[key]:
name = data[0]
code = data[2]
url = GOOGLE_FINANCE_URL + code
received_data = get_stock_price_data(url, name, code)
percent_change = received_data[0]
time = received_data[1]
data.append(percent_change)
data.append(time)
#print matched_stocks_data
with open("change_data.json", "w") as out:
json.dump(MutualFundNavAnalysis.matched_stocks_data, out)
#return matched_stocks_data
def nav_change_analysis(self):
data_file = open("change_data.json", "r")
content = json.load(data_file)
print "Read from file!"
total, total_w, total_change, cash = 0, 0, 0, 0
for key in content.keys():
total, total_w, total_change, cash = 0, 0, 0, 0
for current in content[key]:
# get cash allocation
cash = current[1]
weighting = current[3]
weighting = float(weighting)
total_w += weighting
change = current[4]
change = float(change)
total += (weighting * change)
#print content
#total_change = str((total / 100) + (cash / 100))
total_change = str(total / 100)
print "Expected NAV change for %s :: %s%%" % (key ,total_change)
def get_complete_nav_analysis(self):
self.get_matched_stocks_list()
self.nav_change_analysis()
if __name__ == "__main__":
mf_nav = MutualFundNavAnalysis()
mf_nav.get_complete_nav_analysis()Last updated
Was this helpful?