WHAT' CHA GONNA DO FOR ME?

Python、統計、機械学習、R、ファイナンスとか

pandasで日次リターンを月次リターンに変換する①

日次リターンを月次リターンに変換したいときがそれなりにある。
pandasを使えば、これも簡単にできる。

pandas開発者が自ら執筆したこちらのありがたい本によると、

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

以下の2つの方法が紹介されている。

①日次の累積リターンから計算する方法
②日次のリターンから計算する方法

今回は①の方法で、日次リターンを月次リターンに変換する。

ちなみに日次リターンから日次の累積リターンを作るのは、↓でやった。

いま、cum_ret_dという変数に日次の累積リターンが入っているとする。

cum_ret_d.plot()
Out[8]: <matplotlib.axes._subplots.AxesSubplot at 0xb407b30>

f:id:lofas:20150219154937p:plain

これを使って日次リターンを月次リターンに変換するが、コードは次のようにするだけでOK。

ret_m=cum_ret_d.resample("BM",how="last").pct_change()
ret_m.plot()

Out[6]: <matplotlib.axes._subplots.AxesSubplot at 0x14b86a50>

f:id:lofas:20150219154948p:plain

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()