pandas.DataFrame.resampleを使用して価格を異なるタイムフレームの足へ変換する
入力データのCSVは下記のようなもの。
Time Open High Low Close
2016/9/7 6:10 102.022 102.042 101.022 101.542
2016/9/7 6:11 102.019 102.046 101.019 102.046・・・・・・・・
それをまずは次のようにしてDataFrameに格納。
filename = "USDJPY.csv" df = pd.read_csv(filename, sep=',', parse_dates=True, float_precision = "high") print df
print結果は下記。
Time Open High Low Close
0 2016/9/7 6:10 102.022 102.042 101.022 101.542
1 2016/9/7 6:11 102.019 102.046 101.019 102.046
・・・・・・・・・・
続いて下記でresampleして時間足に変換しようとしたがエラー。
x=df.resample('H').ohlc()
エラー内容は下記。
pandas.DataFrame.resample.pyで止まった。
「'Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex'」ということなので、DataFrameのインデックスをDatetimeIndexに置き換える。
その部分のコードは下記。
※この処理には、非常に時間がかかる。出来ることなら入力データを事前にDatetimeIndexへ変更しておきたいが、可能なのかどうかは未調査。
#IndexをdateTimeIndexに変換 dateTimeIndex = pd.DatetimeIndex(df['Time']) df.index = dateTimeIndex print df
print出力結果は下記。
Time Open High Low Close
2016-09-07 06:10:00 2016/9/7 6:10 102.022 102.042 101.022 101.542
2016-09-07 06:11:00 2016/9/7 6:11 102.019 102.046 101.019 102.046
・・・・・・・・
IndexとTimeという列が重複して非常に無駄なことをしているように思えるが、いったん気にしないでおく・・・。
最後にresampleを実行する。
例えば、2016年9月7日のデータに関して、1時間足を得るために次のコードを実行。
ohlcDataFrame = df["2016/09/07"].resample("H")
実行結果は下記。
Open High Low Close
2016-09-07 06:00:00 102.056471 102.080221 101.056471 102.080134
2016-09-07 07:00:00 102.098426 102.118429 101.098426 102.118429
2016-09-07 08:00:00 101.810564 101.830572 100.810564 101.830572
2016-09-07 09:00:00 101.541465 101.561465 100.541465 101.561465
・・・・・・
データを確認すると、想定していた結果と異なった。
下記仕様となっているようだ。想定通りに出力できるかは未調査。
【想定】
・例えば、06:00:00の1時間足のOpenは、1分足のデータのうち、06:00:00に最も近い値が採用される。
・例えば、06:00:00の1時間足のCloseは、1分足のデータの内、07:00:00に最も近い値が採用される。
・例えば、06:00:00の1時間足のHighは、1分足のデータの06:00:00〜06:59:59のデータの内、最も大きなものが採用される。
・例えば、06:00:00の1時間足のLowは、1分足のデータの06:00:00〜06:59:59のデータの内、最も小さなものが採用される。【実際】
・06:00:00の1時間足のOpenは、1分足のデータのうち、6時台のOpenの平均が計算されて採用される。
・06:00:00の1時間足のCloseは、1分足のデータのうち、6時台のCloseの平均が計算されて採用される。
・06:00:00の1時間足のHighは、1分足のデータのうち、6時台のHighの平均が計算されて採用される。
・06:00:00の1時間足のLowは、1分足のデータのうち、6時台のLowの平均が計算されて採用される。