質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

970閲覧

3銘柄に投資しリバランスしていったリターンの計算

mufufu

総合スコア37

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/07/25 04:12

3銘柄に株式投資したリバランスリターンの計算をpythonのjupyter notebookで書いていますが、リバランス後のリターンのグラフが「0」で横ばいになってしまいます。

色々なweb記事でコードはいろいろと参考にさせていただきました。2銘柄でリバランスしたリターンのグラフは表示されましたが、これを応用して3銘柄でリバランスリターンのグラフを出そうとしましたが、画像のようにイメージ説明うまくいきませんでした。

どこを改修したらいいのでしょうか。

よろしくお願いします。

python

1 2コード 3```#TQQQとTECLとSOXLで41.8%:36.3%:21.9%としてリバランスありのパフォーマンス 4 5%matplotlib inline 6import numpy as np 7import pandas_datareader.data as web 8import pandas as pd 9import matplotlib.pyplot as plt 10import scipy.stats as ss 11from matplotlib.animation import FuncAnimation 12import pandas_datareader.data as web #データのダウンロードライブラリ 13 14TQQQ=web.DataReader("TQQQ", "yahoo","2019/1/1")['Adj Close'] 15TECL=web.DataReader("TECL", "yahoo","2019/1/1")['Adj Close'] 16SOXL=web.DataReader("SOXL", "yahoo","2019/1/1")['Adj Close'] 17 18TQQQ=TQQQ/TQQQ.iloc[0]#株価の指数化 19lnTQQQ=np.log(TQQQ) 20dlnTQQQ=lnTQQQ.diff().dropna() 21 22TECL=TECL/TECL.iloc[0] 23TECL 24lnTECL=np.log(TECL) 25dlnTECL=lnTECL.diff().dropna() 26 27SOXL=SOXL/SOXL.iloc[0] 28SOXL 29lnSOXL=np.log(SOXL) 30dlnSOXL=lnSOXL.diff().dropna() 31 32 33def portfolio_rebalance(tsd1,tsd2,tsd3): 34 port=pd.concat([tsd1,tsd2,tsd3],axis=1).dropna() 35 port.columns=('p1','p2','p3') 36 port['a1']=0 37 port['a2']=0 38 port['a3']=0 39 port['v']=1 40 41 n=len(port) 42 43 p1=port['p1'].iloc[0] 44 p2=port['p2'].iloc[0] 45 p3=port['p3'].iloc[0] 46 v=port['v'].iloc[0] 47 48 a1=float(v/3/p1) 49 a2=float(v/3/p2) 50 a3=float(v/3/p3) 51 52 port.iloc[0,2]=a1 53 port.iloc[0,3]=a2 54 port.iloc[0,4]=a3 55 56 for i in range(1,len(port)): 57 p1=port['p1'].iloc[i]#今日のTQQQの株価 58 p2=port['p2'].iloc[i]#今日のTECLの株価 59 p3=port['p3'].iloc[i]#今日のSOXLの株価 60 61 p1_0=port['p1'].iloc[i-1]#前日のTQQQの株価 62 p2_0=port['p2'].iloc[i-1]#前日のTECLの株価 63 p3_0=port['p3'].iloc[i-1]#前日のSOXLの株価 64 65 a1_0=port['a1'].iloc[i-1]#前日のTQQQの保有株数 66 a2_0=port['a2'].iloc[i-1]#前日のTECLの保有枚数 67 a3_0=port['a3'].iloc[i-1]#前日のSOXLの保有枚数 68 69 v_0=port['v'].iloc[i-1]#前日のリバランスポートフォリオの価値 70 71 #v=a1_0*(p1-p1_0)+a2_0*(p2-p2_0)+v_0#今日のリバランスポートフォリオの価値 72 73 v=a1_0*p1+a2_0*p2+a3_0*p3#今日のリバランスポートフォリオの価値 74 75 port.iloc[i,4]=v#リバランスポートフォリオの価値のアップデート 76 77 a1=float(v/3/p1)#調整後のTQQQの株数 78 a2=float(v/3/p2)#調整後のTECLの株数 79 a3=float(v/3/p3)#調整後のSOXLの株数 80 81 port.iloc[i,2]=a1#TQQQの株数のアップデート 82 port.iloc[i,3]=a2#TECLの株数のアップデート 83 port.iloc[i,4]=a3#SOXLの株数のアップデート 84 85 port['v2']=0.418*port.p1+0.363*port.p2+0.219*port.p3#リバランスの無いポートフォリオの価値 86 return port 87port=portfolio_rebalance(TQQQ,TECL,SOXL) 88 89lnport=np.log(port) 90lnport.v.plot(label="port daily rebalance",linewidth=1.0) 91lnTQQQ.plot(label='TQQQ',style='-.') 92lnTECL.plot(label='TECL',linestyle='--') 93lnSOXL.plot(label='SOXL',linestyle='--') 94plt.legend(loc="upper left")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーの原因は、2銘柄の時のコードに、列数を考えずそのまま3銘柄目を追加しちゃってるからじゃないですかね。

port.columns=('p1','p2','p3')

とすると、
iloc[0,0]→p1
iloc[0,1]→p2
iloc[0,2]→p3
となると思います。

その後で

port.iloc[0,2]=a1 port.iloc[0,3]=a2 port.iloc[0,4]=a3

としちゃうと、p3の列がa1の値で上書きされることなります。

その後

port.iloc[i,4]=v#リバランスポートフォリオの価値のアップデート

の所でも、a3の値を設定しているはずの5列目を、vで上書きしています。

それぞれの列がかぶらないように列のインデックスを変える必要があるんじゃないですかね。

py

1# TQQQとTECLとSOXLで41.8%:36.3%:21.9%としてリバランスありのパフォーマンス 2#%matplotlib inline 3import numpy as np 4import pandas_datareader.data as web 5import pandas as pd 6import matplotlib.pyplot as plt 7import scipy.stats as ss 8from matplotlib.animation import FuncAnimation 9import pandas_datareader.data as web #データのダウンロードライブラリ 10 11TQQQ=web.DataReader("TQQQ", "yahoo","2019/1/1")['Adj Close'] 12TECL=web.DataReader("TECL", "yahoo","2019/1/1")['Adj Close'] 13SOXL=web.DataReader("SOXL", "yahoo","2019/1/1")['Adj Close'] 14 15TQQQ=TQQQ/TQQQ.iloc[0]#株価の指数化 16lnTQQQ=np.log(TQQQ) 17dlnTQQQ=lnTQQQ.diff().dropna() 18 19TECL=TECL/TECL.iloc[0] 20TECL 21lnTECL=np.log(TECL) 22dlnTECL=lnTECL.diff().dropna() 23 24SOXL=SOXL/SOXL.iloc[0] 25SOXL 26lnSOXL=np.log(SOXL) 27dlnSOXL=lnSOXL.diff().dropna() 28 29def portfolio_rebalance(tsd1,tsd2,tsd3): 30 port=pd.concat([tsd1,tsd2,tsd3],axis=1).dropna() 31 port.columns=('p1','p2','p3') 32 port['a1']=0 33 port['a2']=0 34 port['a3']=0 35 port['v']=1 36 37 n=len(port) 38 39 p1=port['p1'].iloc[0] 40 p2=port['p2'].iloc[0] 41 p3=port['p3'].iloc[0] 42 v=port['v'].iloc[0] 43 44 a1=float(v/3/p1) 45 a2=float(v/3/p2) 46 a3=float(v/3/p3) 47 48 port.iloc[0,3]=a1 49 port.iloc[0,4]=a2 50 port.iloc[0,5]=a3 51 52 for i in range(1,len(port)): 53 p1=port['p1'].iloc[i]#今日のTQQQの株価 54 p2=port['p2'].iloc[i]#今日のTECLの株価 55 p3=port['p3'].iloc[i]#今日のSOXLの株価 56 57 p1_0=port['p1'].iloc[i-1]#前日のTQQQの株価 58 p2_0=port['p2'].iloc[i-1]#前日のTECLの株価 59 p3_0=port['p3'].iloc[i-1]#前日のSOXLの株価 60 61 a1_0=port['a1'].iloc[i-1]#前日のTQQQの保有株数 62 a2_0=port['a2'].iloc[i-1]#前日のTECLの保有枚数 63 a3_0=port['a3'].iloc[i-1]#前日のSOXLの保有枚数 64 65 v_0=port['v'].iloc[i-1]#前日のリバランスポートフォリオの価値 66 67 # v=a1_0*(p1-p1_0)+a2_0*(p2-p2_0)+v_0#今日のリバランスポートフォリオの価値 68 v=a1_0*p1+a2_0*p2+a3_0*p3#今日のリバランスポートフォリオの価値 69 70 port.iloc[i,6]=v#リバランスポートフォリオの価値のアップデート 71 72 a1=float(v/3/p1)#調整後のTQQQの株数 73 a2=float(v/3/p2)#調整後のTECLの株数 74 a3=float(v/3/p3)#調整後のSOXLの株数 75 76 port.iloc[i,3]=a1#TQQQの株数のアップデート 77 port.iloc[i,4]=a2#TECLの株数のアップデート 78 port.iloc[i,5]=a3#SOXLの株数のアップデート 79 80 port['v2']=0.418*port.p1+0.363*port.p2+0.219*port.p3#リバランスの無いポートフォリオの価値 81 return port 82port=portfolio_rebalance(TQQQ,TECL,SOXL) 83 84lnport=np.log(port) 85lnport.v.plot(label="port daily rebalance",linewidth=1.0) 86lnTQQQ.plot(label='TQQQ',style='-.') 87lnTECL.plot(label='TECL',linestyle='--') 88lnSOXL.plot(label='SOXL',linestyle='--') 89plt.legend(loc="upper left") 90plt.show()

投稿2021/07/25 06:22

編集2021/07/28 12:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mufufu

2021/07/27 02:04

ご回答ありがとうございます。 自分は、コードを完全に理解しながら書いているわけではなく、使えそうなコードをパート毎にもってくることで書いています。ですので、いろいろと、ご指摘の件を試してみましたが、うまくいきませんでした。 具体的に、どのようにコードをなおせばいいのですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問