DEVGRU

プログラミングとbitcoinのシステムトレードについて書きます

PostgreSQL に投入した約定履歴からMatplotlibでローソク図を描画する

前の記事で約定履歴が手に入ったので、OHLCを求めてローソク図を描画してみる。

team-6.hatenablog.jp

from datetime import datetime, timedelta

import pandas as pd

import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib import ticker
import matplotlib.dates as mdates

import psycopg2
import sqlalchemy
import sqlalchemy.orm
import sqlalchemy.ext.declarative


POSTGRES_HOST='HOST'
POSTGRES_PORT=5432
POSTGRES_USER='user'
POSTGRES_PASSWORD='password'

connection_config = {
    'host': POSTGRES_HOST,
    'port': '5432',
    'database': POSTGRES_USER,
    'user': POSTGRES_USER,
    'password': POSTGRES_PASSWORD,
}

connection = psycopg2.connect(**connection_config)

end = datetime.utcnow() # ここはテキトーに
period = 48 * timedelta(minutes=60) # 1時間足で48本
start = end - period

executions = pd.read_sql(sql=f"SELECT * FROM executions WHERE market='bitbank_btc_jpy' AND '{start}' < timestamp  AND timestamp <= '{end}' ORDER BY timestamp ASC;", con=connection)

df = executions[['timestamp', 'price']].set_index('timestamp')
ohlc = df.resample('60T').ohlc(); # ここは60T = 60分
ohlc['price']['open'].head()

fig, ax = plt.subplots()

mpf.candlestick2_ohlc(ax, opens=ohlc['price']['open'], closes=ohlc['price']['close'], lows=ohlc['price']['low'], highs=ohlc['price']['high'], width=0.6, colorup='r', colordown='b')

こんな感じ。

f:id:katoken-0215:20180414014204p:plain

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

  • 作者: コーリー・アルソフ,清水川貴之監訳,清水川貴之,新木雅也
  • 出版社/メーカー: 日経BP社
  • 発売日: 2018/02/24
  • メディア: 単行本
  • この商品を含むブログを見る

前処理大全[データ分析のためのSQL/R/Python実践テクニック]

前処理大全[データ分析のためのSQL/R/Python実践テクニック]

Pythonで学ぶあたらしい統計学の教科書

Pythonで学ぶあたらしい統計学の教科書

bitbank から 約定履歴を取得する

bitbank の APIを眺めていたら、任意の日付から約定履歴を取得することができることに気づいた。 無限に見られるわけではないみたいだが、cyrptowatch よりも長い期間のOHLCが取得できそうなので頑張ってみた。

こんなスクリプト(batch.py)を書く。

#!usr/bin/env python

from datetime import date, datetime, timedelta
import requests

start = date(2018, 1, 1)
end = date(2018, 4, 11)

markets = [
    "btc_jpy",
    "xrp_jpy",
    "eth_btc",
    "ltc_btc",
    "mona_jpy",
    "mona_btc",
    "bcc_jpy",
    "bcc_btc",
]

DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S.%f'

for market in markets:
    start_format = (start + timedelta(hours=9)).strftime(DATETIME_FORMAT)
    end_format = (end + timedelta(days=1, hours=9)).strftime(DATETIME_FORMAT)
    print(f"DELETE from executions WHERE market = 'bitbank_{market}' AND '{start_format}' <= timestamp AND timestamp < '{end_format}';")

    day = start

    while day <= end:
        day_format = day.strftime('%Y%m%d')
        url = f'https://public.bitbank.cc/{market}/transactions/{day_format}'
        response = requests.get(url)
        while response.status_code != 200:
            response = requests.get(url)
        assert response.json()['success'] == 1

        data = [{'price': float(transaction['price']),
          'size': float(transaction['amount']),
          'timestamp': datetime.fromtimestamp(transaction['executed_at'] / 1000).strftime(DATETIME_FORMAT)
          } for transaction in response.json()['data']['transactions']]
        
        print('INSERT INTO executions (timestamp, market, price, size) VALUES' + \
              ', '.join(f"('{d['timestamp']}', 'bitbank_{market}', '{d['price']}', '{d['size']}')" for d in data) + ';')
        day += timedelta(days=1)

        sleep(1)
    print()

こんな感じで実行する。

pip install requests
python batch.py > batch.sql

PostgreSQLに突っ込むには、以下のコマンドを用いる(その前にテーブル作成が必要)。

psql -f /batch.sql

以下のスキーマで予めテーブルを作成しておく。

CREATE TABLE IF NOT EXISTS executions (
  id        SERIAL PRIMARY KEY,
  timestamp TIMESTAMP,
  market    CHARACTER VARYING,
  price     DOUBLE PRECISION,
  size      DOUBLE PRECISION
);
CREATE INDEX ON executions (timestamp, market);

これでPostgreSQLに一定期間分の約定履歴が入るので、ここからOHLCを作ることができる。

参考:

docs.bitbank.cc

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

  • 作者: コーリー・アルソフ,清水川貴之監訳,清水川貴之,新木雅也
  • 出版社/メーカー: 日経BP社
  • 発売日: 2018/02/24
  • メディア: 単行本
  • この商品を含むブログを見る

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

bitbankの取引履歴が取り出せないのでサポートに問い合わせてみた

確定申告に必要なbitbankの取引履歴が取り出せないので、サポートに聞いてみた。

bitbankは負荷を理由にCSVダウンロードの日時指定やAPIの機能停止をアナウンスしていたが、 流石に確定申告に間に合わないので、何時頃再開になるか問い合わせてみた。

問い合わせの文章はこんなかんじ。

確定申告に必要な取引履歴データですが、現在はAPI停止、CSVダウンロードは直近500件までとされていて、データ取得ができないようです。

何時頃再開されますでしょうか?

日曜の夜にしてはレスポンスが早く、こんな内容だった。

お問い合わせ頂きまして誠に有難うございます。 ビットバンクサポートチームです。

現在、取引履歴のダウンロードの制限について社内で検討中でございます。

2017年のお取引履歴につきましては、こちらでご用意させていただきご提供いたします。 少々おまちくださいませ。

尚、確定申告の申告方法につきましては、お客様ご自身で税理士や税務署へご確認くだいませ。 今後とも何卒宜しくお願い致します。

特にこちらでは言及していないが、2017年分の取引履歴を出してくれるようだ。 結局欲しいのはそれなので、先を読んだ対応で悪くない。

申告方法云々に関してはよく損じあげているので余計なお世話感は無くはないが。

結論、問い合わせればくれるんじゃん、ということだった。

お金2.0 新しい経済のルールと生き方 (NewsPicks Book)

お金2.0 新しい経済のルールと生き方 (NewsPicks Book)

プラットフォーム革命――経済を支配するビジネスモデルはどう機能し、どう作られるのか

プラットフォーム革命――経済を支配するビジネスモデルはどう機能し、どう作られるのか

マンガでわかる ビットコインと仮想通貨 (池田書店)

マンガでわかる ビットコインと仮想通貨 (池田書店)

いつでも、何度でも稼げる!  IPOセカンダリー株投資

いつでも、何度でも稼げる! IPOセカンダリー株投資