pandasを使用してtickデータからOpen,High,Low,Closeデータを作成する

タイトル通り、tickデータからOHLCデータを作成する。

データは「HistData.com」からダウンロードする。
ここには各種データがあるが、今回は「NinjaTrader」の「USDJPY」の2016年6月のbidレートのtickデータ(DAT_NT_USDJPY_T_BID_201606.csv)をダウンロードする。

取得したCSVファイルは下記形式となっている。

20160601 000001 110.597
20160601 000002 110.597
20160601 000003 110.595
20160601 000004 110.594
20160601 000005 110.592
20160601 000006 110.592
20160601 000007 110.593
20160601 000008 110.595
20160601 000013 110.594
20160601 000025 110.594
20160601 000026 110.595
20160601 000031 110.597
20160601 000042 110.6

・・・・・・・・・・

20160630 235922 102.828
20160630 235926 102.827
20160630 235935 102.824
20160630 235936 102.824
20160630 235948 102.825
20160630 235949 102.823

これを次のコードでOHLCデータに変換する。

#coding:utf-8
import csv
import pandas as pd
import numpy as np

filename = "DAT_NT_USDJPY_T_BID_201606.csv"
df = pd.read_csv(filename,
                   sep=';',
                   names=('Time','Price', ''),
                   header = None,
                   parse_dates=True,
                   float_precision = "high")

print df

#IndexをdateTimeIndexに変換
dateTimeIndex = pd.DatetimeIndex(df['Time'])
df.index = dateTimeIndex
print df

#Convert Series into OHLC
ohlc = pd.Series(df['Price']).resample('H', how='ohlc')
print ohlc

CSVから読み込んだ直後に表示したデータは下記。

Time Price
0 20160601 000001 110.597 0
1 20160601 000002 110.597 0
2 20160601 000003 110.595 0
3 20160601 000004 110.594 0
・・・・・・・・
923053 20160630 235935 102.824 0
923054 20160630 235936 102.824 0
923055 20160630 235948 102.825 0
923056 20160630 235949 102.823 0

次に、IndexをdateTimeIndexに変換した直後のデータが下記。

Time Price
2016-06-01 00:00:01 20160601 000001 110.597 0
2016-06-01 00:00:02 20160601 000002 110.597 0
2016-06-01 00:00:03 20160601 000003 110.595 0
・・・・・・・・・・・・・・
2016-06-30 23:59:35 20160630 235935 102.824 0
2016-06-30 23:59:36 20160630 235936 102.824 0
2016-06-30 23:59:48 20160630 235948 102.825 0
2016-06-30 23:59:49 20160630 235949 102.823 0

最後に、データフレームからPriceを取得(pandas.Series型)してpandas.Series.resampleを使用してOHLCに変換した結果が次。

open high low close
2016-06-01 00:00:00 110.597 110.762 110.470 110.484
2016-06-01 01:00:00 110.486 110.498 109.650 109.954
2016-06-01 02:00:00 109.957 110.070 109.781 110.056
2016-06-01 03:00:00 110.057 110.169 109.830 110.054
・・・・・・・・・・・・・
2016-06-30 20:00:00 103.093 103.163 102.827 102.887
2016-06-30 21:00:00 102.887 102.990 102.840 102.876
2016-06-30 22:00:00 102.872 102.945 102.833 102.901
2016-06-30 23:00:00 102.903 102.929 102.790 102.823

以上でOHLCが取得出来た。

ここまでが主な内容だが、IndexをDatetimeIndexに変換する別の方法もメモしておく。
※)速度計測をしていないが、こちらの方が処理速度は非常に遅かった。
方法は、read_csvを使用してCSVファイルからデータを読み込む際に、「index_col='Time'」としてTimeカラムをindex列に指定すればよい。
ソースは短くなるが、時間がかかるかな。

#coding:utf-8
import csv
import pandas as pd
import numpy as np

filename = "DAT_NT_USDJPY_T_BID_201606.csv"
df = pd.read_csv(filename,
                   sep=';',
                   names=('Time','Price', ''),
                   header = None,
                   parse_dates=True,
                   index_col='Time',
                   float_precision = "high")

print df

#Convert Series into OHLC
ohlc = pd.Series(df['Price']).resample('H', how='ohlc')
print ohlc