teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

こーどついか

2021/07/28 12:19

投稿

退会済みユーザー
answer CHANGED
@@ -29,4 +29,97 @@
29
29
  の所でも、a3の値を設定しているはずの5列目を、vで上書きしています。
30
30
 
31
31
 
32
- それぞれの列がかぶらないように列のインデックスを変える必要があるんじゃないですかね。
32
+ それぞれの列がかぶらないように列のインデックスを変える必要があるんじゃないですかね。
33
+
34
+ ```py
35
+ # TQQQとTECLとSOXLで41.8%:36.3%:21.9%としてリバランスありのパフォーマンス
36
+ #%matplotlib inline
37
+ import numpy as np
38
+ import pandas_datareader.data as web
39
+ import pandas as pd
40
+ import matplotlib.pyplot as plt
41
+ import scipy.stats as ss
42
+ from matplotlib.animation import FuncAnimation
43
+ import pandas_datareader.data as web #データのダウンロードライブラリ
44
+
45
+ TQQQ=web.DataReader("TQQQ", "yahoo","2019/1/1")['Adj Close']
46
+ TECL=web.DataReader("TECL", "yahoo","2019/1/1")['Adj Close']
47
+ SOXL=web.DataReader("SOXL", "yahoo","2019/1/1")['Adj Close']
48
+
49
+ TQQQ=TQQQ/TQQQ.iloc[0]#株価の指数化
50
+ lnTQQQ=np.log(TQQQ)
51
+ dlnTQQQ=lnTQQQ.diff().dropna()
52
+
53
+ TECL=TECL/TECL.iloc[0]
54
+ TECL
55
+ lnTECL=np.log(TECL)
56
+ dlnTECL=lnTECL.diff().dropna()
57
+
58
+ SOXL=SOXL/SOXL.iloc[0]
59
+ SOXL
60
+ lnSOXL=np.log(SOXL)
61
+ dlnSOXL=lnSOXL.diff().dropna()
62
+
63
+ def portfolio_rebalance(tsd1,tsd2,tsd3):
64
+ port=pd.concat([tsd1,tsd2,tsd3],axis=1).dropna()
65
+ port.columns=('p1','p2','p3')
66
+ port['a1']=0
67
+ port['a2']=0
68
+ port['a3']=0
69
+ port['v']=1
70
+
71
+ n=len(port)
72
+
73
+ p1=port['p1'].iloc[0]
74
+ p2=port['p2'].iloc[0]
75
+ p3=port['p3'].iloc[0]
76
+ v=port['v'].iloc[0]
77
+
78
+ a1=float(v/3/p1)
79
+ a2=float(v/3/p2)
80
+ a3=float(v/3/p3)
81
+
82
+ port.iloc[0,3]=a1
83
+ port.iloc[0,4]=a2
84
+ port.iloc[0,5]=a3
85
+
86
+ for i in range(1,len(port)):
87
+ p1=port['p1'].iloc[i]#今日のTQQQの株価
88
+ p2=port['p2'].iloc[i]#今日のTECLの株価
89
+ p3=port['p3'].iloc[i]#今日のSOXLの株価
90
+
91
+ p1_0=port['p1'].iloc[i-1]#前日のTQQQの株価
92
+ p2_0=port['p2'].iloc[i-1]#前日のTECLの株価
93
+ p3_0=port['p3'].iloc[i-1]#前日のSOXLの株価
94
+
95
+ a1_0=port['a1'].iloc[i-1]#前日のTQQQの保有株数
96
+ a2_0=port['a2'].iloc[i-1]#前日のTECLの保有枚数
97
+ a3_0=port['a3'].iloc[i-1]#前日のSOXLの保有枚数
98
+
99
+ v_0=port['v'].iloc[i-1]#前日のリバランスポートフォリオの価値
100
+
101
+ # v=a1_0*(p1-p1_0)+a2_0*(p2-p2_0)+v_0#今日のリバランスポートフォリオの価値
102
+ v=a1_0*p1+a2_0*p2+a3_0*p3#今日のリバランスポートフォリオの価値
103
+
104
+ port.iloc[i,6]=v#リバランスポートフォリオの価値のアップデート
105
+
106
+ a1=float(v/3/p1)#調整後のTQQQの株数
107
+ a2=float(v/3/p2)#調整後のTECLの株数
108
+ a3=float(v/3/p3)#調整後のSOXLの株数
109
+
110
+ port.iloc[i,3]=a1#TQQQの株数のアップデート
111
+ port.iloc[i,4]=a2#TECLの株数のアップデート
112
+ port.iloc[i,5]=a3#SOXLの株数のアップデート
113
+
114
+ port['v2']=0.418*port.p1+0.363*port.p2+0.219*port.p3#リバランスの無いポートフォリオの価値
115
+ return port
116
+ port=portfolio_rebalance(TQQQ,TECL,SOXL)
117
+
118
+ lnport=np.log(port)
119
+ lnport.v.plot(label="port daily rebalance",linewidth=1.0)
120
+ lnTQQQ.plot(label='TQQQ',style='-.')
121
+ lnTECL.plot(label='TECL',linestyle='--')
122
+ lnSOXL.plot(label='SOXL',linestyle='--')
123
+ plt.legend(loc="upper left")
124
+ plt.show()
125
+ ```