DEVGRU

プログラミングと競馬予想について書きます

bitcoin のシステムトレードをしている 〜2017/05/01の時点の話〜

以前、こんな記事を書いた。

team-6.hatenablog.jp

この記事で書いたVer.8は結局お蔵入りになり、 約定履歴とOHLCを記録するモジュールtrade-histroyが外部化され、 そこに毎分問い合わせて売り買いのシグナルが立っているかを判断と実際に売買を行う部分がVer.9となり、現在稼働中だ。

また、Ver.9までの間に裁定取引のボットを3ヶ月回していたが、Ver.9の稼働に伴い修了した。

ZaifのAPIが重すぎたのが原因で、これを気にBitbank一本に絞っている。

Ver.9では、これまできちんとバックテストできていなかったアルゴリズムを、きちんとできるようにしたのが大きい。

バックテストは普通に時系列にデータ流し込んでループ回すととても遅い

早くするには、OHLCをガバッとPandasに読み込んで行列演算でどかっといっぺんに売り買いシグナルまで計算してから、 ループで売買をシミュレーションする必要がある。

OHLCガバッと読み込むのは、この辺で書いているのでご参考に。

team-6.hatenablog.jp

team-6.hatenablog.jp

これを用いて100回200回とテクニカル指標を組み合わせを試して、いまやっと収益の上がるものができて動いている。

本当は機械学習をガッツリ使ったものを作りたいが、これのバックテストは行列演算でいっぺんに、というわけには行かず 極めて時間がかかるので、収益が上がってCPUのアップグレードができたら、ぐらいで考えている。

また売買記録も少し工夫をした。

約定時にZapierのWebhookからGoogle spreadsheetに 売買のどちらか、日時、マーケット、約定価格、量を記録している。

(さらにPushoverで通知が来るようになっているはずだが、こちらはなぜか止まっている。なぜだ?)

Google Apps Script でSpreadsheetの集計とWeb API実装を行っていて、 グラフも見られるし、コマンドから収益とポジションを取得できるようになっていて、トレーディングプログラム(Bot)が調子悪いのがすぐ分かるようになっている。

あとは普通に生活しながらたまに様子を見るだけで、何もすることがなくなったので、 最近は家の大掃除をしてゴミ屋敷をまっとうにする活動を行っている。

裁量トレードと違って自分の時間が確保できるのがシステムトレードの良い所だ。

新・片づけ術「断捨離」

新・片づけ術「断捨離」

人生がときめく片づけの魔法

人生がときめく片づけの魔法

システムトレード 基本と原則 (ウィザードブックシリーズ)

システムトレード 基本と原則 (ウィザードブックシリーズ)

  • 作者: ブレント・ペンフォールド,長尾慎太郎,山口雅裕
  • 出版社/メーカー: パンローリング
  • 発売日: 2011/07/15
  • メディア: 単行本
  • 購入: 3人 クリック: 14回
  • この商品を含むブログ (2件) を見る

システムトレード 検証と実践 ──自動売買の再現性と許容リスク (ウィザードブックシリーズ)

システムトレード 検証と実践 ──自動売買の再現性と許容リスク (ウィザードブックシリーズ)

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クローリング&スクレイピング -データ収集・解析のための実践開発ガイド-