Advertisement
Guest User

Untitled

a guest
Apr 26th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.92 KB | None | 0 0
  1. import numpy as np
  2. import pandas as pd
  3. import os
  4. import openpyxl
  5. import csv
  6. from scipy.optimize import minimize
  7. from tkinter import *
  8.  
  9. stocksymbols = []
  10.  
  11. #begin gui
  12.  
  13. window = Tk()
  14. window.title("Portfolio Entry")
  15. window.configure(background="black")
  16.  
  17. possibles = (pd.read_json('https://api.iextrading.com/1.0/ref-data/symbols').loc[:, ("symbol")]).tolist()
  18.  
  19. Label (window, text="Enter a ticker: ", bg="black", fg="white", font="none 12 bold") .grid(row=1, column=0, sticky=W)
  20.  
  21. textentry = Entry(window, width=12, bg="white")
  22. textentry.grid(row=2, column=0, sticky=W)
  23.  
  24. def addsymbol():
  25. entered_text = textentry.get().upper()
  26. if entered_text in possibles:
  27. stocksymbols.append(entered_text)
  28. textentry.delete(0, END)
  29. portfolio.delete(0, END)
  30. portfolio.insert(0, stocksymbols)
  31. else:
  32. print("\n Sorry, invalid ticker \n")
  33.  
  34. def removesymbol():
  35. stocksymbols.pop()
  36. portfolio.delete(0, END)
  37. portfolio.insert(0, stocksymbols)
  38.  
  39. Button(window, text="SUBMIT SYMBOL", width=13, command=addsymbol) .grid(row=3, column=0, sticky=W)
  40. Button(window, text="REMOVE SYMBOL", width=13, command=removesymbol) .grid(row=3, column=1, sticky=W)
  41.  
  42. Label (window, text="Your portfolio: ", bg="black", fg="white", font="none 12 bold") . grid(row=5, column=0, sticky=W)
  43. portfolio = Entry(window, width=50, bg="white")
  44. portfolio.grid(row=6, column=0, sticky=W)
  45.  
  46.  
  47. window.mainloop()#end gui and continue script with created portfolio
  48.  
  49.  
  50.  
  51.  
  52. thebigdict = {'Ticker': stocksymbols}
  53. dfbig = pd.DataFrame(thebigdict)
  54. dfbig.rename(index=str)
  55. print(dfbig)
  56.  
  57. #create list of returns and list of standard deviations
  58.  
  59. returnslist=[]
  60. standdevlist=[]
  61. for symbolmain in stocksymbols:
  62. dfmain = pd.DataFrame()
  63. try:
  64. dfmain = pd.read_json('https://api.iextrading.com/1.0/stock/'+symbolmain+'/chart/5y')
  65. except Exception: pass #some symbols don't have json urls
  66. try:
  67. dailyreturnavgmain = '{:f}'.format((dfmain.changePercent-(1.76/365)).mean())
  68. standdevmain = '{:f}'.format((dfmain.changePercent-(1.76/365)).std())
  69. except AttributeError: pass #some symbol jsons don't have changePercent attributes
  70. returnslist.append(float(dailyreturnavgmain))
  71. standdevlist.append(float(standdevmain))
  72.  
  73. correlationlist=[]#for the correlations of the symbol in stocksymbols with all other symbols
  74. for symbolsecond in stocksymbols:
  75. dfsecond = pd.DataFrame()
  76. try:
  77. dfsecond = pd.read_json('https://api.iextrading.com/1.0/stock/'+symbolsecond+'/chart/5y')
  78. except Exception: pass #some symbols don't have json urls
  79. try:
  80. dailyreturnavgsecond = '{:f}'.format((dfsecond.changePercent-(1.76/365)).mean())
  81. standdevsecond = '{:f}'.format((dfsecond.changePercent-(1.76/365)).std())
  82. except AttributeError: pass #some symbol jsons don't have changePercent attributes
  83. try:
  84. covariance = ((((dfmain.changePercent)-((dfmain.changePercent-(1.76/365)).mean()))*((dfsecond.changePercent)-((dfsecond.changePercent-(1.76/365)).mean()))).mean())
  85. 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())))
  86. correlationlist.append(correlation)
  87. print(correlationlist)
  88. except AttributeError: pass #missing attribute
  89. dfcorrelation = pd.DataFrame(correlationlist)
  90. dfcorrelation.rename(index=str)
  91. dfbig = pd.concat([dfbig, dfcorrelation], axis=1, join='inner')
  92.  
  93.  
  94. #create dfreturns and dfstanddev, concatenate them on dfbig
  95. dfreturns = pd.DataFrame(returnslist)
  96. dfstanddev = pd.DataFrame(standdevlist)
  97. dfbig2 = pd.concat([dfbig, dfreturns], axis=1, join='inner')
  98. dfbig2 = pd.concat([dfbig2, dfstanddev], axis=1, join='inner')
  99.  
  100. #correlation matrix columns so they line up
  101. spacelist=[""]
  102. headers = spacelist + stocksymbols
  103. morenameslist=["Returns", "Standard Deviation"]
  104. headers = headers + morenameslist
  105. dfbig2.columns = headers
  106. dfbig2.Returns = dfbig2.Returns.astype(float)
  107. print(dfbig2)#For doing the rest in Excel, dfbig2.to_excel
  108.  
  109.  
  110. weightlist = []
  111. for stock in stocksymbols:
  112. weight = (1/len(stocksymbols))
  113. weightlist.append(weight)
  114.  
  115. weightdict = {'Ticker': stocksymbols}
  116. dfweight = pd.DataFrame(weightdict)
  117. dfweight['Weight'] = weightlist
  118.  
  119. portfolioreturns = (dfbig2["Returns"] * dfweight["Weight"])
  120. print("Portfolio Return: ", sum(portfolioreturns))
  121.  
  122. dfbig = dfbig.drop(columns='Ticker')
  123.  
  124. weightlistlist = []
  125. for x in weightlist:
  126. weightlistlist.append([x])
  127. weightarray = (np.array(weightlistlist).T)
  128. standdevarray = (np.array([standdevlist]).T)
  129.  
  130. weightedstd = np.dot(weightarray, standdevarray)
  131.  
  132. portfoliovariance = np.dot((weightarray),(np.dot(dfbig, weightarray.T)))
  133. print("Portfolio variance: ", portfoliovariance)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement