DEVGRU

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

BTCから草コインへ

先日、この記事を書いた。

team-6.hatenablog.jp

しかしながら、上昇の見込めない相場での現物取引は儲けが少なく損ばかり、ということで草コインに投資することにした。

Binance のアカウントを作って0.5BTCを投入、AdaやらVergeやらを買って、Binace APIから価格取得をして...とするとこんな感じに。

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

ソースコードはこんな感じ。

$ pip install python-binance
import requests

from binance.client import Client

API_KEY = 'Your API key'
API_SECRET = 'Your API secret'

if __name__ == '__main__':
    client = Client(API_KEY, API_SECRET)
    account = client.get_account()
    btc_total = 0
    for balance in account['balances']:
        amount = float(balance['free']) + float(balance['locked'])
        coin = balance['asset']
        if amount > 0 and coin != 'BTC':
            recent_trade = client.get_recent_trades(symbol=f'{coin}BTC', limit=1)
            btc_amount = float(recent_trade[0]['price']) * amount
            print(f'{coin}:', btc_amount)
            btc_total += btc_amount
        elif coin == 'BTC':
            print(f'{coin}:', amount)
            btc_total += amount
    print('Total:', btc_total)
    response = requests.get('https://api.cryptowat.ch/markets/bitflyer/btcjpy/price')
    btcjpy_price = response.json()['result']['price']
    print('Total(JPY):', btc_total * btcjpy_price)

次は過去のトレードからポジションを計算して、一定割合上昇・下降したときに通知するように拡張する。

仮想通貨の総まとめ

仮想通貨の総まとめ

いま仕込んでおくべき10倍通貨教えます!

いま仕込んでおくべき10倍通貨教えます!

アルトコイン投資術: 仮想通貨で億り人になる

アルトコイン投資術: 仮想通貨で億り人になる

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で学ぶあたらしい統計学の教科書