64
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pandas による金融データの分析とその可視化 (2)

Last updated at Posted at 2014-03-12

リターンインデックスと累積リターン

昨日に引き続き金融データの分析をしていきます。

株式ポートフォリオの分析にあたりリターンは資産価格のパーセント変化を通常示します。 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")

image.png

ここから一定期間のポートフォリオのリターンを計算したり、さまざまな可視化をおこなって戦略のバックテストをすることができます。

可視化も容易にできて豊富な関数を備えるデータフレームで金融データを扱えることにより、有償の高価なソフトウェアに頼らずともアドホックな分析が試行できることがわかりました。

参考

Pythonによるデータ分析入門――NumPy、pandasを使ったデータ処理
http://www.oreilly.co.jp/books/9784873116556/

64
63
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?