[sample約定履歴csvデータ]
https://goo.gl/ejKVn7
# -*- coding: utf-8 -*-
import pandas as pd
# 約定履歴csv入力(["timestamp","side","price","size"])
# (timestamp列をdatetimeindexとして読み込み)
df_trades = pd.read_csv("trades_1h.csv", index_col=0, parse_dates=["timestamp"])
# タイムゾーンをUTCにローカライズ
df_trades.index = df_trades.index.tz_localize("UTC")
# 確認表示
display(df_trades.head())
side | price | size | |
---|---|---|---|
timestamp | |||
2018-10-11 23:00:04.765000+00:00 | Buy | 6189.5 | 1 |
2018-10-11 23:00:04.845000+00:00 | Buy | 6189.5 | 1 |
2018-10-11 23:00:05.384000+00:00 | Sell | 6189.0 | 4435 |
2018-10-11 23:00:05.384000+00:00 | Sell | 6189.0 | 10337 |
2018-10-11 23:00:05.384000+00:00 | Sell | 6189.0 | 228 |
import pytz
from datetime import datetime
PERIOD = 1 # 約定履歴を集計する時間足期間(分)
# 時刻丸め関数(PERIOD(分)単位に切り捨て丸め)
def rounddown_minute(ts):
sec = ts.value // (10**9)
return datetime.fromtimestamp(sec - (sec % (60 * PERIOD)), tz=pytz.utc)
# timestampを1m単位に丸め
df_trades.index = df_trades.index.map(rounddown_minute)
# UTC->Asia/Tokyoに変換
df_trades.index = df_trades.index.tz_convert("Asia/Tokyo")
# 確認表示
display(df_trades.head())
side | price | size | |
---|---|---|---|
timestamp | |||
2018-10-12 08:00:00+09:00 | Buy | 6189.5 | 1 |
2018-10-12 08:00:00+09:00 | Buy | 6189.5 | 1 |
2018-10-12 08:00:00+09:00 | Sell | 6189.0 | 4435 |
2018-10-12 08:00:00+09:00 | Sell | 6189.0 | 10337 |
2018-10-12 08:00:00+09:00 | Sell | 6189.0 | 228 |
import numpy as np
# sizeをBuy/Sellで符号変換
df_trades["size"] = np.where(df_trades["side"]=="Buy", df_trades["size"], df_trades["size"] * -1)
# index解除
df_trades.reset_index(inplace=True)
# 確認表示
display(df_trades.head())
timestamp | side | price | size | |
---|---|---|---|---|
0 | 2018-10-12 08:00:00+09:00 | Buy | 6189.5 | 1 |
1 | 2018-10-12 08:00:00+09:00 | Buy | 6189.5 | 1 |
2 | 2018-10-12 08:00:00+09:00 | Sell | 6189.0 | -4435 |
3 | 2018-10-12 08:00:00+09:00 | Sell | 6189.0 | -10337 |
4 | 2018-10-12 08:00:00+09:00 | Sell | 6189.0 | -228 |
# クロス集計(ピボッティング)
df_vols = df_trades.pivot_table(values=["size"], index=["price"], columns=["timestamp"],
aggfunc="sum", fill_value=0)
# 列名変換
df_vols.columns = df_vols.columns.levels[1]
# csv出力
df_vols.to_csv("vols_1h.csv", header=True, index=True)
# 確認表示
display(df_vols.head())
timestamp | 2018-10-12 08:00:00+09:00 | 2018-10-12 08:01:00+09:00 | 2018-10-12 08:02:00+09:00 | 2018-10-12 08:03:00+09:00 | 2018-10-12 08:04:00+09:00 | 2018-10-12 08:05:00+09:00 | 2018-10-12 08:06:00+09:00 | 2018-10-12 08:07:00+09:00 | 2018-10-12 08:08:00+09:00 | 2018-10-12 08:09:00+09:00 | ... | 2018-10-12 08:50:00+09:00 | 2018-10-12 08:51:00+09:00 | 2018-10-12 08:52:00+09:00 | 2018-10-12 08:53:00+09:00 | 2018-10-12 08:54:00+09:00 | 2018-10-12 08:55:00+09:00 | 2018-10-12 08:56:00+09:00 | 2018-10-12 08:57:00+09:00 | 2018-10-12 08:58:00+09:00 | 2018-10-12 08:59:00+09:00 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
price | |||||||||||||||||||||
6113.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6113.5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6114.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6114.5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6115.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 rows × 60 columns
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.colors as colors
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.cm as cm
%matplotlib inline
# colormapをカスタマイズ定義作成
def generate_cmap(colors):
values = range(len(colors))
vmax = np.ceil(np.max(values))
color_list = []
for v, c in zip(values, colors):
color_list.append( ( v/ vmax, c) )
return LinearSegmentedColormap.from_list("custom_cmap", color_list)
# Figure生成
ax=plt.figure(figsize=(11, 9), dpi=100).add_subplot(111, projection="3d")
# Bar配置のX,Y座標リスト
xpos, ypos = np.meshgrid(np.arange(len(df_vols.columns)), np.arange(len(df_vols.index)))
xpos = xpos.ravel()
ypos = ypos.ravel()
# BarのZ高さリスト
z_val = df_vols.values.ravel()
# Z値に対応した色を生成
vols_size = max([np.abs(z_val.max()), np.abs(z_val.min())])
offset = z_val + vols_size
fracs = offset.astype(float) / (vols_size * 2.0)
# カスタムカラーマップ
ccm = generate_cmap(["#FF0000", "#FF1000", "#FFFFFF", "#0010FF", "#0000FF"])
clrs = ccm(fracs)
#clrs = cm.bwr_r(fracs)
# vol:0をマスク(出来高0を非表示にする)
mask = z_val != 0.0
# Barプロット(Z配置位置:0, X幅:1.0, Y幅:1.0は固定)
ax.bar3d(xpos[mask], ypos[mask], 0, 1.0, 1.0, z_val[mask], color=clrs[mask])
# vol範囲(Z値)設定
ax.set_zlim3d(dz.min(), dz.max())
# X軸目盛り設定
x_ticks = np.arange(0, len(df_vols.columns), 10)
x_ticks_val = [df_vols.columns[i].strftime("%m/%d %H:%M") for i in x_ticks]
plt.xticks(x_ticks, x_ticks_val)
# Y軸目盛り設定
y_ticks = np.arange(0, len(df_vols.index), 25)
y_ticks_val = [df_vols.index[i] for i in y_ticks]
plt.yticks(y_ticks, y_ticks_val)
# 目盛りレイアウト調整
plt.tick_params(labelsize=8, direction="out")
plt.tick_params(axis="x", pad=2)
plt.tick_params(axis="y", pad=5)
plt.tick_params(axis="z", pad=12)
# ビューポイント調整(標高:elev、方位角:azim、距離:dist)
ax.view_init(elev=40.0, azim=265.0)
# 表示
plt.savefig("vols.png")
plt.show()