Pythonを言語にしてjupyter notebookでコードをかいています。
3銘柄のポートフォリオでリバランスを一か月に1回、四半期に1回で実施したリターン出したいと、思っています。
Teratailで質問して、3銘柄のデイリーリバランスリターンを出すことはできました。
これを応用して、一か月に1回、四半期に1回リバランスしてリターンをだしたいのですが、画像のようにリバランスしたリターンの線グラフが消えてしまいます。
どのようにコードを修正すればよろしいのでしょうか。
python
1import numpy as np 2import pandas_datareader.data as web 3import pandas as pd 4import matplotlib.pyplot as plt 5import scipy.stats as ss 6from matplotlib.animation import FuncAnimation 7import pandas_datareader.data as web #データのダウンロードライブラリ 8 9TQQQ=web.DataReader("TQQQ", "yahoo","2019/1/1")['Adj Close'] 10TECL=web.DataReader("TECL", "yahoo","2019/1/1")['Adj Close'] 11SOXL=web.DataReader("SOXL", "yahoo","2019/1/1")['Adj Close'] 12 13TQQQ=TQQQ/TQQQ.iloc[0]#株価の指数化 14lnTQQQ=np.log(TQQQ) 15dlnTQQQ=lnTQQQ.diff().dropna() 16 17TECL=TECL/TECL.iloc[0] 18TECL 19lnTECL=np.log(TECL) 20dlnTECL=lnTECL.diff().dropna() 21 22SOXL=SOXL/SOXL.iloc[0] 23SOXL 24lnSOXL=np.log(SOXL) 25dlnSOXL=lnSOXL.diff().dropna() 26 27def portfolio_rebalance(tsd1,tsd2,tsd3): 28 port=pd.concat([tsd1,tsd2,tsd3],axis=1).dropna() 29 port.columns=('p1','p2','p3') 30 port['a1']=0 31 port['a2']=0 32 port['a3']=0 33 port['v']=1 34 35 n=len(port) 36 37 p1=port['p1'].iloc[0] 38 p2=port['p2'].iloc[0] 39 p3=port['p3'].iloc[0] 40 v=port['v'].iloc[0] 41 42 a1=float(v/3/p1) 43 a2=float(v/3/p2) 44 a3=float(v/3/p3) 45 46 port.iloc[0,3]=a1 47 port.iloc[0,4]=a2 48 port.iloc[0,5]=a3 49 50 for i in range(1,len(port)): 51 p1=port['p1'].iloc[i]#今日のTQQQの株価 52 p2=port['p2'].iloc[i]#今日のTECLの株価 53 p3=port['p3'].iloc[i]#今日のSOXLの株価 54 55 p1_0=port['p1'].iloc[i-22]#22日前のTQQQの株価 56 p2_0=port['p2'].iloc[i-22]#22日前のTECLの株価 57 p3_0=port['p3'].iloc[i-22]#22日前のSOXLの株価 58 59 a1_0=port['a1'].iloc[i-22]#22日前のTQQQの保有株数 60 a2_0=port['a2'].iloc[i-22]#22日前のTECLの保有枚数 61 a3_0=port['a3'].iloc[i-22]#22日前のSOXLの保有枚数 62 63 v_0=port['v'].iloc[i-22]#22日前のリバランスポートフォリオの価値 64 65 #v=a1_0*(p1-p1_0)+a2_0*(p2-p2_0)+v_0#今日のリバランスポートフォリオの価値 66 67 v=a1_0*p1+a2_0*p2+a3_0*p3#今日のリバランスポートフォリオの価値 68 69 port.iloc[i,6]=v#リバランスポートフォリオの価値のアップデート 70 71 a1=float(v/3/p1)#調整後のTQQQの株数 72 a2=float(v/3/p2)#調整後のTECLの株数 73 a3=float(v/3/p3)#調整後のSOXLの株数 74 75 port.iloc[i,3]=a1#TQQQの株数のアップデート 76 port.iloc[i,4]=a2#TECLの株数のアップデート 77 port.iloc[i,5]=a3#SOXLの株数のアップデート 78 79 port['v2']=0.418*port.p1+0.363*port.p2+0.219*port.p3#リバランスの無いポートフォリオの価値 80 return port 81port=portfolio_rebalance(TQQQ,TECL,SOXL) 82 83lnport=np.log(port) 84lnport.v.plot(label="port Monthly rebalance",linewidth=1.0) 85lnTQQQ.plot(label='TQQQ',style='-.') 86lnTECL.plot(label='TECL',linestyle='--') 87lnSOXL.plot(label='SOXL',linestyle='--') 88plt.legend(loc="upper left") 89plt.show()
あなたの回答
tips
プレビュー