pandasで日次リターンを月次リターンに変換する①
日次リターンを月次リターンに変換したいときがそれなりにある。
pandasを使えば、これも簡単にできる。
pandas開発者が自ら執筆したこちらのありがたい本によると、
Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney,小林儀匡,鈴木宏尚,瀬戸山雅人,滝口開資,野上大介
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/12/26
- メディア: 大型本
- この商品を含むブログ (7件) を見る
以下の2つの方法が紹介されている。
①日次の累積リターンから計算する方法
②日次のリターンから計算する方法
今回は①の方法で、日次リターンを月次リターンに変換する。
ちなみに日次リターンから日次の累積リターンを作るのは、↓でやった。
いま、cum_ret_dという変数に日次の累積リターンが入っているとする。
cum_ret_d.plot() Out[8]: <matplotlib.axes._subplots.AxesSubplot at 0xb407b30>
これを使って日次リターンを月次リターンに変換するが、コードは次のようにするだけでOK。
ret_m=cum_ret_d.resample("BM",how="last").pct_change() ret_m.plot() Out[6]: <matplotlib.axes._subplots.AxesSubplot at 0x14b86a50>
BMは、business month end frequencyのことで、これでデータの頻度を日次から月末最終営業日に変換する。
lastは、サマリー対象のレコードのうち最後の値を使う、という意味なので、ここまでで月末最終営業日時点の累積リターン系列ができることとなる。
次に、月末最終営業日間の累積リターンの変化分をpct_change()で計算するため、晴れて月次リターンが得られるという流れ。
コード全体はこちら。
# -*- coding: utf-8 -*- import pandas.io.data as web import numpy as np import seaborn as sns import pandas as pd import pandas.io.data as web import datetime start = datetime.datetime(2000, 1, 1) end = datetime.datetime(2014, 12, 31) #データ取得 all_data = {} for ticker in ['AAPL', 'IBM', 'MSFT', 'YHOO']: all_data[ticker] = web.DataReader(ticker,'yahoo',start,end) #データ結合(concatでもOK) #stock_price=all_data['AAPL'].ix[:,['Adj Close']] #for ticker in ['IBM', 'MSFT', 'YHOO']: # stock_price = pd.concat((stock_price,all_data[ticker].ix[:,['Adj Close']]),axis=1) #データ結合 stock_price=all_data['AAPL'].ix[:,['Adj Close']] for ticker in ['IBM', 'MSFT', 'YHOO']: stock_price = pd.merge(stock_price,all_data[ticker].ix[:,['Adj Close']], left_index=True, right_index=True) #列名変更 stock_price.columns=['AAPL', 'IBM', 'MSFT', 'YHOO'] stock_price.plot() #リターンデータに変換 stock_ret=stock_price.pct_change() stock_ret.plot() #累積リターンに変換 cum_ret_d=(1+stock_ret).cumprod() cum_ret_d.ix[0]=1 cum_ret_d.plot() #月次リターンに変換 ret_m=cum_ret_d.resample("BM",how="last").pct_change() ret_m.plot()