データフレーム作成2
データフレーム作成の続き。
参考にしたサイト
使用データ
基準価額
レオス-ひふみプラス: モーニングスターより
対象期間は、20190101-20191231
為替
このサイトを参考に、ドル円についてデータ取得。
かいてみた
diff=90 for i,o in enumerate(order): ds=df[o].dropna() rds=(ds.iloc[diff:].reset_index(drop=True)-ds.iloc[:-diff].reset_index(drop=True))/ds.iloc[:-diff].reset_index(drop=True)*100 rds.index=ds.index[diff:] rdf=pd.DataFrame(rds) if i==0: r=rdf else: r=r.join(rdf,how="outer") r=r.join(date)
1行ずつどういう処理してるのか調べつつメモしていく。
for i,o in enumerate(order):
なんだこのenumerate
ってやつは。とういことで調べていく。
Pythonのenumerate()関数を使うと、forループの中でリスト(配列)などのイテラブルオブジェクトの要素と同時にインデックス番号(カウント、順番)を取得できる。
らしい。今、order
ってリストはorder=["hifumi","index","vti"]
ってやつだから、hifumiがインデックス番号1、indexがインデックス番号2、、ってことかあ。っていうか、indexって名付けたの間違いだったな、インデックス番号とかのインデックスとかぶるってわかりづらい。。
ds=df[o].dropna()
こりゃNaN
は落とすってことか。収益率を計算する上で、90日間ではなく90営業日での収益率を算出するってことだな!
rds=(ds.iloc[diff:].reset_index(drop=True)-ds.iloc[:-diff].reset_index(drop=True))/ds.iloc[:-diff].reset_index(drop=True)*100
ひいいいい。長え。とりあえず収益率の公式の形に近いから、このrds
は収益率が入るリストなんだろう。
ds.iloc[diff:]
まずこの部分から。
pandas.DataFrameの任意の位置のデータを取り出したり変更(代入)したりする場合、pandas.DataFrameのプロパティ、at, iat, loc, ilocを使う。at()ではなくat[]のように記述する。
このiloc
ってやつはpandas
でデータいじってるときに使えるやつなんすね。
で、ds.iloc[diff:]
ってのは、ds
ってリストの90番目から最後のやつまで取ってくるってことかと。
そして、ds.iloc[diff:].reset_index(drop=True)
のreset_index(drop=True)
はなんなんだろうかと。まあ多分、reset_indexっていってるんだから、indexとして入っている日付の値をなくすんだろう。
実際、下記のコードを実行したら、
print (ds.iloc[diff:])
の出力結果には下記の通りindexに日付が入ってた。
2019-05-23 36544.0 2019-05-24 36419.0 2019-05-27 36625.0 2019-05-28 36836.0 2019-05-29 36560.0 2019-05-30 36369.0 2019-05-31 36141.0 2019-06-03 35491.0 2019-06-04 35360.0 2019-06-05 36205.0 2019-06-06 36021.0 2019-06-07 36296.0 2019-06-10 36807.0 2019-06-11 37021.0 2019-06-12 36971.0 2019-06-13 36661.0 2019-06-14 36942.0 2019-06-17 36716.0 2019-06-18 36289.0 2019-06-19 36947.0 2019-06-20 37181.0 2019-06-21 36903.0 2019-06-24 36932.0 2019-06-25 36744.0 2019-06-26 36322.0 2019-06-27 36768.0 2019-06-28 36898.0 2019-07-01 37701.0 2019-07-02 38021.0 2019-07-03 37831.0 ... 2019-11-19 40041.0 2019-11-20 39950.0 2019-11-21 39837.0 2019-11-22 39895.0 2019-11-25 40036.0 2019-11-26 40158.0 2019-11-27 40374.0 2019-11-28 40348.0 2019-11-29 40205.0 2019-12-02 40375.0 2019-12-03 40175.0 2019-12-04 40034.0 2019-12-05 40142.0 2019-12-06 40298.0 2019-12-09 40376.0 2019-12-10 40471.0 2019-12-11 40279.0 2019-12-12 40305.0 2019-12-13 40589.0 2019-12-16 40626.0 2019-12-17 40832.0 2019-12-18 40637.0 2019-12-19 40647.0 2019-12-20 40822.0 2019-12-23 40687.0 2019-12-24 40827.0 2019-12-25 40759.0 2019-12-26 40979.0 2019-12-27 41160.0 2019-12-30 40951.0 Name: hifumi, Length: 151, dtype: float64
一方、以下を実行すると、
rds=(ds.iloc[diff:].reset_index(drop=True)-ds.iloc[:-diff].reset_index(drop=True))/ds.iloc[:-diff].reset_index(drop=True)*100` print (rds)
出力結果はこの通りで、indexは数字が0から振られていた。
0 12.623274 1 8.167751 2 8.159589 3 8.188440 4 8.712459 5 7.457527 6 5.799180 7 3.799134 8 2.725001 9 3.831484 10 2.787924 11 4.382837 12 6.724078 13 6.876642 14 5.543978 15 4.859562 16 5.627037 17 5.919686 18 2.372489 19 3.719611 20 2.483462 21 1.379083 22 1.111537 23 1.505566 24 1.990846 25 0.872428 26 -0.124513 27 1.894595 28 3.981950 29 2.003343 ... 121 5.246419 122 5.886718 123 6.317054 124 6.483211 125 6.594957 126 7.377203 127 8.488513 128 8.658067 129 10.386580 130 9.195402 131 9.218682 132 7.702241 133 7.558747 134 7.101472 135 7.183435 136 7.330204 137 6.448373 138 6.892802 139 7.894947 140 10.264901 141 13.324637 142 13.666751 143 13.545449 144 14.427470 145 13.902186 146 16.253310 147 14.266891 148 16.865821 149 17.301718 150 15.798552 Name: hifumi, Length: 151, dtype: float64
そして、このように収益率が入ったリストに対して、以下の1行でindexを追加すると。
rds.index=ds.index[diff:] rdf=pd.DataFrame(rds) if i==0: r=rdf else: r=r.join(rdf,how="outer")
あとはデータフレームを作成。そして、iが0の時はjoinする先がないからrdf
そのものがr
になって、それ以外は、joinすると。
その後、平均と分散、シャープレシオもそれぞれ計算し、データフレーム作成。最後に今日作ったものをまとめておくう。
import pandas as pd import numpy as np exchange=pd.read_csv("rowdata/usd_jpy.csv",index_col=0,parse_dates=True) exchange=exchange[["JPY/USD"]] hifumi=pd.read_csv("rowdata/hifumi.csv",index_col=0,parse_dates=True) hifumi.columns=["hifumi"] index=pd.read_csv("rowdata/index.csv",index_col=0,parse_dates=True) index.columns=["index"] vti=pd.read_csv("rowdata/VTI.csv",index_col=0,parse_dates=True) vti=vti[["Adj Close"]] vti.columns=["vti"] vti=pd.DataFrame(vti["vti"]*exchange["JPY/USD"],columns=["vti"]) vti=vti.dropna() df=pd.DataFrame([]) df=df.join([hifumi,index,vti],how="outer") date=pd.DataFrame(index=pd.date_range(start=df.index[0],end="2019-12-30")) df=df.join(date,how="outer") order=["hifumi","index","vti"] df=df[order] diff=90 for i,o in enumerate(order): ds=df[o].dropna() rds=(ds.iloc[diff:].reset_index(drop=True)-ds.iloc[:-diff].reset_index(drop=True))/ds.iloc[:-diff].reset_index(drop=True)*100 rds.index=ds.index[diff:] rdf=pd.DataFrame(rds) if i==0: r=rdf else: r=r.join(rdf,how="outer") r=r.join(date) ave_return_list=[] std_return_list=[] sharp_ratio_list=[] term=90 for i in range(len(r)-term): ave_return_list.append(r.iloc[i:term+i].mean()) std_return_list.append(r.iloc[i:term+i].std()) sharp_ratio_list.append(r.iloc[i:term+i].mean()/r.iloc[i:term+i].std()) ave_return_df=pd.DataFrame(ave_return_list,index=r.index[term:])[order] std_return_df=pd.DataFrame(std_return_list,index=r.index[term:])[order] sharp_ratio_df=pd.DataFrame(sharp_ratio_list,index=r.index[term:])[order]
最後の行の
ave_return_df=pd.DataFrame(ave_return_list,index=r.index[term:])[order]
の最後に入っている[order]
の意味はわからんかった。なくても、出力されるものは一見変わらなかったけど、なんなんだろう、今度調べてみる。