データフレーム作成2

データフレーム作成の続き。

 

参考にしたサイト

ajhjhaf.hatenablog.com

使用データ

基準価額

対象期間は、20190101-20191231

為替

baacash.com

このサイトを参考に、ドル円についてデータ取得。

かいてみた

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ってやつは。とういことで調べていく。

note.nkmk.me

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:]

まずこの部分から。

note.nkmk.me

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]の意味はわからんかった。なくても、出力されるものは一見変わらなかったけど、なんなんだろう、今度調べてみる。