リターンインデックスと累積リターン
昨日に引き続き金融データの分析をしていきます。
株式ポートフォリオの分析にあたりリターンは資産価格のパーセント変化を通常示します。 Yahoo! ファイナンスの Apple の株式価格から株価のパーセント変化を求めます。
pandas のデータフレームには頻度変換のための強力な関数が備わっています。
関数 | 説明 |
---|---|
resample | データを固定頻度に変換する |
reindex | 新しいインデックスにデータを割り当てる |
その他のデータフレームの関数についてはリファレンスを参照すると良いでしょう。
調整後終値 (Adjusted Closing Values) とは株式分割や配当の前後でデータを連続的にとらえるために分割後の値に調整したものです。
リターンインデックスとは銘柄の配当も加味した場合のパフォーマンスを示す指数で、投資単位を表す値を持つ時系列なデータです。 Apple のリターンインデックスは cumprod メソッドで求まります。
import pandas as pd
import pandas.io.data as web
# 2010 年以降の Apple 株の調整後終値を取得
price = web.get_data_yahoo('AAPL', '2009-12-31')['Adj Close']
returns = price.pct_change()
ret_index = (1 + returns).cumprod() # リターンインデックスの算出
ret_index[0] = 1 # 1 行目が NaN なので 1.0 に
print ( ret_index )
# =>
# Date
# 2009-12-31 1.000000
# 2010-01-04 1.015602
# 2010-01-05 1.017330
# 2010-01-06 1.001136
# 2010-01-07 0.999309
# 2010-01-08 1.005974
# 2010-01-11 0.997087
# 2010-01-12 0.985731
# 2010-01-13 0.999654
# 2010-01-14 0.993828
# 2010-01-15 0.977239
# 2010-01-19 1.020490
# 2010-01-20 1.004789
# 2010-01-21 0.987410
# 2010-01-22 0.938432
# ...
# 2014-02-19 2.653155
# 2014-02-20 2.622445
# 2014-02-21 2.593315
# 2014-02-24 2.604671
# 2014-02-25 2.577565
# 2014-02-26 2.554310
# 2014-02-27 2.605263
# 2014-02-28 2.598203
# 2014-03-03 2.605708
# 2014-03-04 2.622889
# 2014-03-05 2.628419
# 2014-03-06 2.620470
# 2014-03-07 2.618939
# 2014-03-10 2.621309
# 2014-03-11 2.646835
# 累積リターンを算出
m_returns = ret_index.resample('BM', how='last').pct_change()
print( m_returns['2014'] ) # 2014 年分を表示
# =>
# Date
# 2014-01-31 -0.107696
# 2014-02-28 0.057514
# 2014-03-31 0.018718
# 集約をおこないながら resample することで累積リターンを計算することもできる
m_returns = (1 + returns).resample('M', how='prod', kind='period') - 1
print( m_returns['2014'] ) # 2014 年分を表示 (同じ結果)
巨大なデータフレームの情報を print() すると自動的に中略され先頭と末尾が表示されます。
各社株式ポートフォリオの累積リターン算出と可視化
2010 年以降、とくに震災後から今年の 3 月 11 日までの 3 年間に注目して、金融及び IT 分野の株式ポートフォリオ価格履歴をプロットしてみます。
def get_px(stock, start, end):
return web.get_data_yahoo(stock, start, end)['Adj Close']
names = ['AAPL', 'GOOG', 'MSFT', 'DELL', 'GS', 'MS', 'BAC', 'C']
px = pd.DataFrame( {n: get_px(n, '1/1/2010', '3/11/2014') for n in names} )
px = px.asfreq('B').fillna(method='pad')
rets = px.pct_change()
result = ((1 + rets).cumprod() - 1)
plt.figure()
result.plot()
plt.show()
plt.savefig("image.png")
ここから一定期間のポートフォリオのリターンを計算したり、さまざまな可視化をおこなって戦略のバックテストをすることができます。
可視化も容易にできて豊富な関数を備えるデータフレームで金融データを扱えることにより、有償の高価なソフトウェアに頼らずともアドホックな分析が試行できることがわかりました。
参考
Pythonによるデータ分析入門――NumPy、pandasを使ったデータ処理
http://www.oreilly.co.jp/books/9784873116556/