# coding: utf-8
from datetime import datetime
import pytz, bitmex
import pandas as pd
now = datetime.now(pytz.utc)
# BitMEX約定履歴取得(REST API)
api = bitmex.bitmex()
trades = api.Trade.Trade_get(symbol="XBTUSD", count=500, endTime=now).result()[0]
# 約定履歴リスト作成
lst_trades = [[t["timestamp"], t["side"], t["size"], t["price"]] for t in trades]
for i in range(10):
print("[{0[0]:%Y-%m-%d %H:%M:%S}, {0[1]}, {0[2]}, {0[3]}]".format(lst_trades[i]))
[2018-09-09 20:32:31, Sell, 2876, 6355.0] [2018-09-09 20:32:31, Sell, 10, 6355.0] [2018-09-09 20:32:31, Sell, 20, 6355.0] [2018-09-09 20:32:31, Sell, 60, 6355.0] [2018-09-09 20:32:31, Sell, 636, 6354.5] [2018-09-09 20:32:31, Sell, 100, 6354.5] [2018-09-09 20:32:31, Sell, 100, 6354.0] [2018-09-09 20:32:31, Sell, 31, 6354.0] [2018-09-09 20:32:31, Sell, 100, 6354.0] [2018-09-09 20:32:31, Sell, 16367, 6354.0]
/usr/local/lib/python3.6/site-packages/bravado_core/spec.py:271: Warning: guid format is not registered with bravado-core! category=Warning,
【rule】
rule | 期間 | 基準 |
---|---|---|
"AS" | 年 | 年初 |
"A" | 年 | 年末 |
"MS" | 月 | 月初 |
"M" | 月 | 月末 |
"W" | 週 | 日曜 |
"D" | 日 | 0時 |
"H" | 時 | 0分 |
"T" | 分 | 0秒 |
"S" | 秒 |
# 約定履歴DataFrame作成(index設定)
df_trades = pd.DataFrame(lst_trades, columns=["timestamp", "side", "size", "price"])
df_trades = df_trades.set_index("timestamp")
# 1秒足("1S")OHLCVリサンプリング
df_ohlcv_1s = df_trades.resample("1S").agg({
"price" : "ohlc",
"size" : "sum",}).ffill()
df_ohlcv_1s.columns = ["open", "high", "low", "close", "volume"]
display(df_ohlcv_1s.head())
open | high | low | close | volume | |
---|---|---|---|---|---|
timestamp | |||||
2018-09-09 20:32:31+00:00 | 6355.0 | 6355.0 | 6354.0 | 6354.0 | 20300 |
2018-09-09 20:32:32+00:00 | 6354.5 | 6355.5 | 6342.5 | 6348.5 | 224390 |
2018-09-09 20:32:33+00:00 | 6348.0 | 6348.0 | 6342.5 | 6348.0 | 3062 |
2018-09-09 20:32:34+00:00 | 6348.0 | 6348.0 | 6342.5 | 6348.0 | 0 |
2018-09-09 20:32:35+00:00 | 6345.0 | 6345.0 | 6345.0 | 6345.0 | 250 |
【集計】
処理 | 内容 |
---|---|
"min" | 最小 |
"max" | 最大 |
"sum" | 合計 |
"mean" | 平均 |
"first" | 最初の値 |
"interpolate" | 補間 |
# 1分足("1T")にリサンプリング(timestamp:デフォルト(期間開始時刻)->TradingViewタイプ)
df_ohlcv_1m = df_ohlcv_1s.resample("1T").agg({
"open" : "first",
"high" : "max",
"low" : "min",
"close" : "last",
"volume" : "sum",})
display(df_ohlcv_1m.head())
open | high | low | close | volume | |
---|---|---|---|---|---|
timestamp | |||||
2018-09-09 20:32:00+00:00 | 6355.0 | 6355.5 | 6342.5 | 6342.5 | 268002 |
2018-09-09 20:33:00+00:00 | 6345.0 | 6356.0 | 6342.5 | 6355.5 | 129433 |
2018-09-09 20:34:00+00:00 | 6356.0 | 6356.0 | 6355.5 | 6356.0 | 10107 |
2018-09-09 20:35:00+00:00 | 6356.0 | 6356.0 | 6342.5 | 6353.5 | 107246 |
2018-09-09 20:36:00+00:00 | 6353.5 | 6362.0 | 6353.0 | 6362.0 | 515410 |
【label】
label | 内容 |
---|---|
"left" | 期間開始時刻(デフォルト) |
"right" | 期間終了時刻 |
closed | 内容 |
---|---|
"left" | 基準時間が集計開始時刻(デフォルト) |
"right" | 基準時間が集計終了時刻 |
# 1分足("1T")にリサンプリング(timestamp:期間終了時刻->BitMEXタイプ)
df_ohlcv_1m = df_ohlcv_1s.resample("1T", label="right").agg({
"open" : "first",
"high" : "max",
"low" : "min",
"close" : "last",
"volume" : "sum",})
display(df_ohlcv_1m.head())
open | high | low | close | volume | |
---|---|---|---|---|---|
timestamp | |||||
2018-09-09 20:33:00+00:00 | 6355.0 | 6355.5 | 6342.5 | 6342.5 | 268002 |
2018-09-09 20:34:00+00:00 | 6345.0 | 6356.0 | 6342.5 | 6355.5 | 129433 |
2018-09-09 20:35:00+00:00 | 6356.0 | 6356.0 | 6355.5 | 6356.0 | 10107 |
2018-09-09 20:36:00+00:00 | 6356.0 | 6356.0 | 6342.5 | 6353.5 | 107246 |
2018-09-09 20:37:00+00:00 | 6353.5 | 6362.0 | 6353.0 | 6362.0 | 515410 |
# タイムゾーンを日本時間(JST)に変換
df_ohlcv_1m.index = df_ohlcv_1m.index.tz_convert("Asia/Tokyo")
display(df_ohlcv_1m.head())
open | high | low | close | volume | |
---|---|---|---|---|---|
timestamp | |||||
2018-09-10 05:33:00+09:00 | 6355.0 | 6355.5 | 6342.5 | 6342.5 | 268002 |
2018-09-10 05:34:00+09:00 | 6345.0 | 6356.0 | 6342.5 | 6355.5 | 129433 |
2018-09-10 05:35:00+09:00 | 6356.0 | 6356.0 | 6355.5 | 6356.0 | 10107 |
2018-09-10 05:36:00+09:00 | 6356.0 | 6356.0 | 6342.5 | 6353.5 | 107246 |
2018-09-10 05:37:00+09:00 | 6353.5 | 6362.0 | 6353.0 | 6362.0 | 515410 |