Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import pandas as pd
- import os
- import openpyxl
- import csv
- from scipy.optimize import minimize
- from tkinter import *
- stocksymbols = []
- #begin gui
- window = Tk()
- window.title("Portfolio Entry")
- window.configure(background="black")
- possibles = (pd.read_json('https://api.iextrading.com/1.0/ref-data/symbols').loc[:, ("symbol")]).tolist()
- Label (window, text="Enter a ticker: ", bg="black", fg="white", font="none 12 bold") .grid(row=1, column=0, sticky=W)
- textentry = Entry(window, width=12, bg="white")
- textentry.grid(row=2, column=0, sticky=W)
- def addsymbol():
- entered_text = textentry.get().upper()
- if entered_text in possibles:
- stocksymbols.append(entered_text)
- textentry.delete(0, END)
- portfolio.delete(0, END)
- portfolio.insert(0, stocksymbols)
- else:
- print("\n Sorry, invalid ticker \n")
- def removesymbol():
- stocksymbols.pop()
- portfolio.delete(0, END)
- portfolio.insert(0, stocksymbols)
- Button(window, text="SUBMIT SYMBOL", width=13, command=addsymbol) .grid(row=3, column=0, sticky=W)
- Button(window, text="REMOVE SYMBOL", width=13, command=removesymbol) .grid(row=3, column=1, sticky=W)
- Label (window, text="Your portfolio: ", bg="black", fg="white", font="none 12 bold") . grid(row=5, column=0, sticky=W)
- portfolio = Entry(window, width=50, bg="white")
- portfolio.grid(row=6, column=0, sticky=W)
- window.mainloop()#end gui and continue script with created portfolio
- thebigdict = {'Ticker': stocksymbols}
- dfbig = pd.DataFrame(thebigdict)
- dfbig.rename(index=str)
- print(dfbig)
- #create list of returns and list of standard deviations
- returnslist=[]
- standdevlist=[]
- for symbolmain in stocksymbols:
- dfmain = pd.DataFrame()
- try:
- dfmain = pd.read_json('https://api.iextrading.com/1.0/stock/'+symbolmain+'/chart/5y')
- except Exception: pass #some symbols don't have json urls
- try:
- dailyreturnavgmain = '{:f}'.format((dfmain.changePercent-(1.76/365)).mean())
- standdevmain = '{:f}'.format((dfmain.changePercent-(1.76/365)).std())
- except AttributeError: pass #some symbol jsons don't have changePercent attributes
- returnslist.append(float(dailyreturnavgmain))
- standdevlist.append(float(standdevmain))
- correlationlist=[]#for the correlations of the symbol in stocksymbols with all other symbols
- for symbolsecond in stocksymbols:
- dfsecond = pd.DataFrame()
- try:
- dfsecond = pd.read_json('https://api.iextrading.com/1.0/stock/'+symbolsecond+'/chart/5y')
- except Exception: pass #some symbols don't have json urls
- try:
- dailyreturnavgsecond = '{:f}'.format((dfsecond.changePercent-(1.76/365)).mean())
- standdevsecond = '{:f}'.format((dfsecond.changePercent-(1.76/365)).std())
- except AttributeError: pass #some symbol jsons don't have changePercent attributes
- try:
- covariance = ((((dfmain.changePercent)-((dfmain.changePercent-(1.76/365)).mean()))*((dfsecond.changePercent)-((dfsecond.changePercent-(1.76/365)).mean()))).mean())
- correlation = (((((dfmain.changePercent)-((dfmain.changePercent-(1.76/365)).mean()))*((dfsecond.changePercent)-((dfsecond.changePercent-(1.76/365)).mean()))).mean())/(((dfmain.changePercent-(1.76/365)).std())*((dfsecond.changePercent-(1.76/365)).std())))
- correlationlist.append(correlation)
- print(correlationlist)
- except AttributeError: pass #missing attribute
- dfcorrelation = pd.DataFrame(correlationlist)
- dfcorrelation.rename(index=str)
- dfbig = pd.concat([dfbig, dfcorrelation], axis=1, join='inner')
- #create dfreturns and dfstanddev, concatenate them on dfbig
- dfreturns = pd.DataFrame(returnslist)
- dfstanddev = pd.DataFrame(standdevlist)
- dfbig2 = pd.concat([dfbig, dfreturns], axis=1, join='inner')
- dfbig2 = pd.concat([dfbig2, dfstanddev], axis=1, join='inner')
- #correlation matrix columns so they line up
- spacelist=[""]
- headers = spacelist + stocksymbols
- morenameslist=["Returns", "Standard Deviation"]
- headers = headers + morenameslist
- dfbig2.columns = headers
- dfbig2.Returns = dfbig2.Returns.astype(float)
- print(dfbig2)#For doing the rest in Excel, dfbig2.to_excel
- weightlist = []
- for stock in stocksymbols:
- weight = (1/len(stocksymbols))
- weightlist.append(weight)
- weightdict = {'Ticker': stocksymbols}
- dfweight = pd.DataFrame(weightdict)
- dfweight['Weight'] = weightlist
- portfolioreturns = (dfbig2["Returns"] * dfweight["Weight"])
- print("Portfolio Return: ", sum(portfolioreturns))
- dfbig = dfbig.drop(columns='Ticker')
- weightlistlist = []
- for x in weightlist:
- weightlistlist.append([x])
- weightarray = (np.array(weightlistlist).T)
- standdevarray = (np.array([standdevlist]).T)
- weightedstd = np.dot(weightarray, standdevarray)
- portfoliovariance = np.dot((weightarray),(np.dot(dfbig, weightarray.T)))
- print("Portfolio variance: ", portfoliovariance)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement