# -*- coding: utf-8 -*-
import time, requests
from collections import OrderedDict
import pandas as pd
periods = {"1T":1, "5T":5, "1H":60} # 1m/5m/1h
count = 1000 # 取得件数
to_time = int(time.time()) # 取得終了時刻(現在のUnixTime)
ohlcvs = {} # 取得したOHLCVを格納するディクショナリ
# 各時間足のOHLCV取得
for period, minutes in periods.items():
from_time = to_time - (count - 1) * minutes * 60 # 取得開始時刻(件数分遡ったUnixTime)
param = {"period": minutes, "from": from_time, "to": to_time}
url = "https://www.bitmex.com/api/udf/history?symbol=XBTUSD&" + \
"resolution={period}&from={from}&to={to}".format(**param)
data = requests.get(url).json()
# DataFrame化
df = pd.DataFrame(OrderedDict(
{"unixtime":data["t"], "open":data["o"], "high":data["h"],
"low":data["l"], "close":data["c"], "volume":data["v"]}))
# DatetimeIndex設定
df["datetime"] = pd.to_datetime(df["unixtime"], unit="s")
df = df.set_index("datetime")
# OHLCVディクショナリに格納
ohlcvs[period] = df
# データ確認
display(period, ohlcvs[period].tail())
'1T'
unixtime | open | high | low | close | volume | |
---|---|---|---|---|---|---|
datetime | ||||||
2018-10-09 03:09:00 | 1539054540 | 6602.0 | 6602.0 | 6601.5 | 6601.5 | 137435 |
2018-10-09 03:10:00 | 1539054600 | 6601.5 | 6602.0 | 6601.5 | 6602.0 | 130324 |
2018-10-09 03:11:00 | 1539054660 | 6602.0 | 6602.0 | 6601.5 | 6602.0 | 30443 |
2018-10-09 03:12:00 | 1539054720 | 6602.0 | 6602.0 | 6601.5 | 6601.5 | 610619 |
2018-10-09 03:13:00 | 1539054780 | 6601.5 | 6602.0 | 6601.5 | 6601.5 | 77168 |
'5T'
unixtime | open | high | low | close | volume | |
---|---|---|---|---|---|---|
datetime | ||||||
2018-10-09 02:50:00 | 1539053400 | 6602.0 | 6602.0 | 6601.5 | 6602.0 | 655948 |
2018-10-09 02:55:00 | 1539053700 | 6602.0 | 6603.5 | 6601.5 | 6603.0 | 2667055 |
2018-10-09 03:00:00 | 1539054000 | 6603.0 | 6603.5 | 6601.5 | 6601.5 | 1842106 |
2018-10-09 03:05:00 | 1539054300 | 6601.5 | 6602.0 | 6601.5 | 6601.5 | 527039 |
2018-10-09 03:10:00 | 1539054600 | 6601.5 | 6602.0 | 6601.5 | 6601.5 | 848554 |
'1H'
unixtime | open | high | low | close | volume | |
---|---|---|---|---|---|---|
datetime | ||||||
2018-10-08 23:00:00 | 1539039600 | 6603.5 | 6608.0 | 6603.5 | 6607.5 | 17429418 |
2018-10-09 00:00:00 | 1539043200 | 6607.5 | 6614.0 | 6605.5 | 6606.0 | 29299854 |
2018-10-09 01:00:00 | 1539046800 | 6606.0 | 6607.0 | 6598.0 | 6599.5 | 42426957 |
2018-10-09 02:00:00 | 1539050400 | 6599.5 | 6603.5 | 6585.5 | 6603.0 | 42906687 |
2018-10-09 03:00:00 | 1539054000 | 6603.0 | 6603.5 | 6601.5 | 6601.5 | 3217699 |
ema_term = 14 # EMA期間
# 各時間足のOHLCV取得
for period, ohlcv in ohlcvs.items():
# 終値からEMAを計算して列追加
ohlcv["EMA"] = ohlcv["close"].ewm(span=ema_term).mean()
# データ確認
display(period, ohlcv.tail())
'1T'
unixtime | open | high | low | close | volume | EMA | |
---|---|---|---|---|---|---|---|
datetime | |||||||
2018-10-09 03:09:00 | 1539054540 | 6602.0 | 6602.0 | 6601.5 | 6601.5 | 137435 | 6601.989122 |
2018-10-09 03:10:00 | 1539054600 | 6601.5 | 6602.0 | 6601.5 | 6602.0 | 130324 | 6601.990572 |
2018-10-09 03:11:00 | 1539054660 | 6602.0 | 6602.0 | 6601.5 | 6602.0 | 30443 | 6601.991829 |
2018-10-09 03:12:00 | 1539054720 | 6602.0 | 6602.0 | 6601.5 | 6601.5 | 610619 | 6601.926252 |
2018-10-09 03:13:00 | 1539054780 | 6601.5 | 6602.0 | 6601.5 | 6601.5 | 77168 | 6601.869418 |
'5T'
unixtime | open | high | low | close | volume | EMA | |
---|---|---|---|---|---|---|---|
datetime | |||||||
2018-10-09 02:50:00 | 1539053400 | 6602.0 | 6602.0 | 6601.5 | 6602.0 | 655948 | 6600.072410 |
2018-10-09 02:55:00 | 1539053700 | 6602.0 | 6603.5 | 6601.5 | 6603.0 | 2667055 | 6600.462756 |
2018-10-09 03:00:00 | 1539054000 | 6603.0 | 6603.5 | 6601.5 | 6601.5 | 1842106 | 6600.601055 |
2018-10-09 03:05:00 | 1539054300 | 6601.5 | 6602.0 | 6601.5 | 6601.5 | 527039 | 6600.720914 |
2018-10-09 03:10:00 | 1539054600 | 6601.5 | 6602.0 | 6601.5 | 6601.5 | 848554 | 6600.824792 |
'1H'
unixtime | open | high | low | close | volume | EMA | |
---|---|---|---|---|---|---|---|
datetime | |||||||
2018-10-08 23:00:00 | 1539039600 | 6603.5 | 6608.0 | 6603.5 | 6607.5 | 17429418 | 6605.224279 |
2018-10-09 00:00:00 | 1539043200 | 6607.5 | 6614.0 | 6605.5 | 6606.0 | 29299854 | 6605.327708 |
2018-10-09 01:00:00 | 1539046800 | 6606.0 | 6607.0 | 6598.0 | 6599.5 | 42426957 | 6604.550680 |
2018-10-09 02:00:00 | 1539050400 | 6599.5 | 6603.5 | 6585.5 | 6603.0 | 42906687 | 6604.343923 |
2018-10-09 03:00:00 | 1539054000 | 6603.0 | 6603.5 | 6601.5 | 6601.5 | 3217699 | 6603.964733 |
emas = {} # 各時間足を1mにアップサンプリングしたEMAディクショナリ
# 5m/1hのEMAを1mにアップサンプリング
upsample = "1T"
for period, ohlcv in ohlcvs.items():
if period == upsample:
continue
df = pd.DataFrame(ohlcvs[upsample]["close"])
# 期間始まり価格で補間
df["EMA_P"] = ohlcv["EMA"].resample(upsample).pad()
# 期間終わり価格で補間
df["EMA_B"] = ohlcv["EMA"].resample(upsample).bfill()
# 線形補間
df["EMA_I"] = ohlcv["EMA"].resample(upsample).interpolate()
# 1mベースEMAディクショナリに格納
emas[period] = df
# データ確認
display(period, df.tail(20))
'5T'
close | EMA_P | EMA_B | EMA_I | |
---|---|---|---|---|
datetime | ||||
2018-10-09 02:54:00 | 6602.0 | 6600.072410 | 6600.462756 | 6600.384686 |
2018-10-09 02:55:00 | 6602.0 | 6600.462756 | 6600.462756 | 6600.462756 |
2018-10-09 02:56:00 | 6603.5 | 6600.462756 | 6600.601055 | 6600.490415 |
2018-10-09 02:57:00 | 6603.0 | 6600.462756 | 6600.601055 | 6600.518075 |
2018-10-09 02:58:00 | 6603.0 | 6600.462756 | 6600.601055 | 6600.545735 |
2018-10-09 02:59:00 | 6603.0 | 6600.462756 | 6600.601055 | 6600.573395 |
2018-10-09 03:00:00 | 6603.5 | 6600.601055 | 6600.601055 | 6600.601055 |
2018-10-09 03:01:00 | 6603.0 | 6600.601055 | 6600.720914 | 6600.625027 |
2018-10-09 03:02:00 | 6603.0 | 6600.601055 | 6600.720914 | 6600.648999 |
2018-10-09 03:03:00 | 6601.5 | 6600.601055 | 6600.720914 | 6600.672970 |
2018-10-09 03:04:00 | 6601.5 | 6600.601055 | 6600.720914 | 6600.696942 |
2018-10-09 03:05:00 | 6601.5 | 6600.720914 | 6600.720914 | 6600.720914 |
2018-10-09 03:06:00 | 6602.0 | 6600.720914 | 6600.824792 | 6600.741690 |
2018-10-09 03:07:00 | 6601.5 | 6600.720914 | 6600.824792 | 6600.762465 |
2018-10-09 03:08:00 | 6602.0 | 6600.720914 | 6600.824792 | 6600.783241 |
2018-10-09 03:09:00 | 6601.5 | 6600.720914 | 6600.824792 | 6600.804017 |
2018-10-09 03:10:00 | 6602.0 | 6600.824792 | 6600.824792 | 6600.824792 |
2018-10-09 03:11:00 | 6602.0 | NaN | NaN | NaN |
2018-10-09 03:12:00 | 6601.5 | NaN | NaN | NaN |
2018-10-09 03:13:00 | 6601.5 | NaN | NaN | NaN |
'1H'
close | EMA_P | EMA_B | EMA_I | |
---|---|---|---|---|
datetime | ||||
2018-10-09 02:54:00 | 6602.0 | 6604.343923 | 6603.964733 | 6604.002652 |
2018-10-09 02:55:00 | 6602.0 | 6604.343923 | 6603.964733 | 6603.996332 |
2018-10-09 02:56:00 | 6603.5 | 6604.343923 | 6603.964733 | 6603.990013 |
2018-10-09 02:57:00 | 6603.0 | 6604.343923 | 6603.964733 | 6603.983693 |
2018-10-09 02:58:00 | 6603.0 | 6604.343923 | 6603.964733 | 6603.977373 |
2018-10-09 02:59:00 | 6603.0 | 6604.343923 | 6603.964733 | 6603.971053 |
2018-10-09 03:00:00 | 6603.5 | 6603.964733 | 6603.964733 | 6603.964733 |
2018-10-09 03:01:00 | 6603.0 | NaN | NaN | NaN |
2018-10-09 03:02:00 | 6603.0 | NaN | NaN | NaN |
2018-10-09 03:03:00 | 6601.5 | NaN | NaN | NaN |
2018-10-09 03:04:00 | 6601.5 | NaN | NaN | NaN |
2018-10-09 03:05:00 | 6601.5 | NaN | NaN | NaN |
2018-10-09 03:06:00 | 6602.0 | NaN | NaN | NaN |
2018-10-09 03:07:00 | 6601.5 | NaN | NaN | NaN |
2018-10-09 03:08:00 | 6602.0 | NaN | NaN | NaN |
2018-10-09 03:09:00 | 6601.5 | NaN | NaN | NaN |
2018-10-09 03:10:00 | 6602.0 | NaN | NaN | NaN |
2018-10-09 03:11:00 | 6602.0 | NaN | NaN | NaN |
2018-10-09 03:12:00 | 6601.5 | NaN | NaN | NaN |
2018-10-09 03:13:00 | 6601.5 | NaN | NaN | NaN |
# 現在の時間足が補間できないため、5m/1hの最新終値を追加する
for period, ohlcv in ohlcvs.items():
if period == upsample:
continue
# 追加するOHLCV行データ
series = pd.Series(
[ohlcv["unixtime"].iloc[-1]+periods[period]*60, \
0, 0, 0, ohlcv["close"].iloc[-1], 0, 0],
index=ohlcv.columns)
# OHLCVに追加
ohlcv = ohlcv.append(series, ignore_index=True)
# DatetimeIndex設定
ohlcv["datetime"] = pd.to_datetime(ohlcv["unixtime"], unit="s")
ohlcv = ohlcv.set_index("datetime")
# 終値からEMAを計算して列追加
ohlcv["EMA"] = ohlcv["close"].ewm(span=ema_term).mean()
# OHLCVディクショナリに格納
ohlcvs[period] = ohlcv
# データ確認
display(period, ohlcv.tail())
'5T'
unixtime | open | high | low | close | volume | EMA | |
---|---|---|---|---|---|---|---|
datetime | |||||||
2018-10-09 02:55:00 | 1.539054e+09 | 6602.0 | 6603.5 | 6601.5 | 6603.0 | 2667055.0 | 6600.462756 |
2018-10-09 03:00:00 | 1.539054e+09 | 6603.0 | 6603.5 | 6601.5 | 6601.5 | 1842106.0 | 6600.601055 |
2018-10-09 03:05:00 | 1.539054e+09 | 6601.5 | 6602.0 | 6601.5 | 6601.5 | 527039.0 | 6600.720914 |
2018-10-09 03:10:00 | 1.539055e+09 | 6601.5 | 6602.0 | 6601.5 | 6601.5 | 848554.0 | 6600.824792 |
2018-10-09 03:15:00 | 1.539055e+09 | 0.0 | 0.0 | 0.0 | 6601.5 | 0.0 | 6600.914820 |
'1H'
unixtime | open | high | low | close | volume | EMA | |
---|---|---|---|---|---|---|---|
datetime | |||||||
2018-10-09 00:00:00 | 1.539043e+09 | 6607.5 | 6614.0 | 6605.5 | 6606.0 | 29299854.0 | 6605.327708 |
2018-10-09 01:00:00 | 1.539047e+09 | 6606.0 | 6607.0 | 6598.0 | 6599.5 | 42426957.0 | 6604.550680 |
2018-10-09 02:00:00 | 1.539050e+09 | 6599.5 | 6603.5 | 6585.5 | 6603.0 | 42906687.0 | 6604.343923 |
2018-10-09 03:00:00 | 1.539054e+09 | 6603.0 | 6603.5 | 6601.5 | 6601.5 | 3217699.0 | 6603.964733 |
2018-10-09 04:00:00 | 1.539058e+09 | 0.0 | 0.0 | 0.0 | 6601.5 | 0.0 | 6603.636102 |
emas = {} # 各時間足を1mベースにアップサンプリングしたディクショナリ
# 5m/1hのEMAを1mにアップサンプリング
upsample = "1T"
for period, ohlcv in ohlcvs.items():
df = pd.DataFrame(ohlcvs[upsample]["close"])
if period == upsample:
emas[period] = df
continue
# 期間始まり価格で補間
df["EMA_P"] = ohlcv["EMA"].resample(upsample).pad()
# 期間終わり価格で補間
df["EMA_B"] = ohlcv["EMA"].resample(upsample).bfill()
# 線形補間
df["EMA_I"] = ohlcv["EMA"].resample(upsample).interpolate()
# 1mベースEMAディクショナリに格納
emas[period] = df
# データ確認
display(period, df.tail(20))
'5T'
close | EMA_P | EMA_B | EMA_I | |
---|---|---|---|---|
datetime | ||||
2018-10-09 02:54:00 | 6602.0 | 6600.072410 | 6600.462756 | 6600.384686 |
2018-10-09 02:55:00 | 6602.0 | 6600.462756 | 6600.462756 | 6600.462756 |
2018-10-09 02:56:00 | 6603.5 | 6600.462756 | 6600.601055 | 6600.490415 |
2018-10-09 02:57:00 | 6603.0 | 6600.462756 | 6600.601055 | 6600.518075 |
2018-10-09 02:58:00 | 6603.0 | 6600.462756 | 6600.601055 | 6600.545735 |
2018-10-09 02:59:00 | 6603.0 | 6600.462756 | 6600.601055 | 6600.573395 |
2018-10-09 03:00:00 | 6603.5 | 6600.601055 | 6600.601055 | 6600.601055 |
2018-10-09 03:01:00 | 6603.0 | 6600.601055 | 6600.720914 | 6600.625027 |
2018-10-09 03:02:00 | 6603.0 | 6600.601055 | 6600.720914 | 6600.648999 |
2018-10-09 03:03:00 | 6601.5 | 6600.601055 | 6600.720914 | 6600.672970 |
2018-10-09 03:04:00 | 6601.5 | 6600.601055 | 6600.720914 | 6600.696942 |
2018-10-09 03:05:00 | 6601.5 | 6600.720914 | 6600.720914 | 6600.720914 |
2018-10-09 03:06:00 | 6602.0 | 6600.720914 | 6600.824792 | 6600.741690 |
2018-10-09 03:07:00 | 6601.5 | 6600.720914 | 6600.824792 | 6600.762465 |
2018-10-09 03:08:00 | 6602.0 | 6600.720914 | 6600.824792 | 6600.783241 |
2018-10-09 03:09:00 | 6601.5 | 6600.720914 | 6600.824792 | 6600.804017 |
2018-10-09 03:10:00 | 6602.0 | 6600.824792 | 6600.824792 | 6600.824792 |
2018-10-09 03:11:00 | 6602.0 | 6600.824792 | 6600.914820 | 6600.842798 |
2018-10-09 03:12:00 | 6601.5 | 6600.824792 | 6600.914820 | 6600.860803 |
2018-10-09 03:13:00 | 6601.5 | 6600.824792 | 6600.914820 | 6600.878809 |
'1H'
close | EMA_P | EMA_B | EMA_I | |
---|---|---|---|---|
datetime | ||||
2018-10-09 02:54:00 | 6602.0 | 6604.343923 | 6603.964733 | 6604.002652 |
2018-10-09 02:55:00 | 6602.0 | 6604.343923 | 6603.964733 | 6603.996332 |
2018-10-09 02:56:00 | 6603.5 | 6604.343923 | 6603.964733 | 6603.990013 |
2018-10-09 02:57:00 | 6603.0 | 6604.343923 | 6603.964733 | 6603.983693 |
2018-10-09 02:58:00 | 6603.0 | 6604.343923 | 6603.964733 | 6603.977373 |
2018-10-09 02:59:00 | 6603.0 | 6604.343923 | 6603.964733 | 6603.971053 |
2018-10-09 03:00:00 | 6603.5 | 6603.964733 | 6603.964733 | 6603.964733 |
2018-10-09 03:01:00 | 6603.0 | 6603.964733 | 6603.636102 | 6603.959256 |
2018-10-09 03:02:00 | 6603.0 | 6603.964733 | 6603.636102 | 6603.953779 |
2018-10-09 03:03:00 | 6601.5 | 6603.964733 | 6603.636102 | 6603.948302 |
2018-10-09 03:04:00 | 6601.5 | 6603.964733 | 6603.636102 | 6603.942825 |
2018-10-09 03:05:00 | 6601.5 | 6603.964733 | 6603.636102 | 6603.937347 |
2018-10-09 03:06:00 | 6602.0 | 6603.964733 | 6603.636102 | 6603.931870 |
2018-10-09 03:07:00 | 6601.5 | 6603.964733 | 6603.636102 | 6603.926393 |
2018-10-09 03:08:00 | 6602.0 | 6603.964733 | 6603.636102 | 6603.920916 |
2018-10-09 03:09:00 | 6601.5 | 6603.964733 | 6603.636102 | 6603.915439 |
2018-10-09 03:10:00 | 6602.0 | 6603.964733 | 6603.636102 | 6603.909961 |
2018-10-09 03:11:00 | 6602.0 | 6603.964733 | 6603.636102 | 6603.904484 |
2018-10-09 03:12:00 | 6601.5 | 6603.964733 | 6603.636102 | 6603.899007 |
2018-10-09 03:13:00 | 6601.5 | 6603.964733 | 6603.636102 | 6603.893530 |
from chart_creator import ChartCreator as cc
from IPython.display import Image, display_png
count = 500 # ローソクバー件数
ohlcv = ohlcvs[upsample].iloc[-count:]
# チャート情報初期化
cc.initialize()
# ローソクバー設定(OHLCV)
cc.set_ohlcv_df(ohlcv)
# メインチャートにEMA設定
# 1m EMA
unixtime = ohlcv["unixtime"].values
ema = ohlcv["EMA"].values
cc.set_line(unixtime, ema, ax=0, color="Magenta", width=1.0)
# 5m EMA
ema = emas["5T"]["EMA_P"].iloc[-count:].values
cc.set_line(unixtime, ema, ax=0, color="Green", width=1.0)
# 1h EMA
ema = emas["1H"]["EMA_P"].iloc[-count:].values
cc.set_line(unixtime, ema, ax=0, color="Blue", width=1.0)
# チャート画像ファイルパス
file_path = "data/image/chart1.png"
# チャート生成
cc.create_chart(file_path)
# チャート画像表示
display_png(Image(file_path))
# チャート情報初期化
cc.initialize()
# ローソクバー設定(OHLCV)
cc.set_ohlcv_df(ohlcv)
# メインチャートにEMA設定
# 1m EMA
unixtime = ohlcv["unixtime"].values
ema = ohlcv["EMA"].values
cc.set_line(unixtime, ema, ax=0, color="Magenta", width=1.0)
# 5m EMA
ema = emas["5T"]["EMA_B"].iloc[-count:].values
cc.set_line(unixtime, ema, ax=0, color="Green", width=1.0)
# 1h EMA
ema = emas["1H"]["EMA_B"].iloc[-count:].values
cc.set_line(unixtime, ema, ax=0, color="Blue", width=1.0)
# チャート画像ファイルパス
file_path = "data/image/chart2.png"
# チャート生成
cc.create_chart(file_path)
# チャート画像表示
display_png(Image(file_path))
# チャート情報初期化
cc.initialize()
# ローソクバー設定(OHLCV)
cc.set_ohlcv_df(ohlcv)
# メインチャートにEMA設定
# 1m EMA
unixtime = ohlcv["unixtime"].values
ema = ohlcv["EMA"].values
cc.set_line(unixtime, ema, ax=0, color="Magenta", width=1.0)
# 5m EMA
ema = emas["5T"]["EMA_I"].iloc[-count:].values
cc.set_line(unixtime, ema, ax=0, color="Green", width=1.0)
# 1h EMA
ema = emas["1H"]["EMA_I"].iloc[-count:].values
cc.set_line(unixtime, ema, ax=0, color="Blue", width=1.0)
# チャート画像ファイルパス
file_path = "data/image/chart3.png"
# チャート生成
cc.create_chart(file_path)
# チャート画像表示
display_png(Image(file_path))