DEVGRU

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

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

Coursera の Machine Learning course を始めた

Coursera という、無償のe-Learningがあり、そこのMachine Learning courseがかなり評判が良いので始めてみた。

www.coursera.org

現在2週目だが、ここまでの感想は以下の通り。

  • コンピュータ・サイエンスを昔やっていた身としては、復習になる部分が多いが、むしろ現役のときよりも分かりやすかったので、もっと早く出会いたかったなあと思った。
  • 当方、英語リスニングだめなので字幕必須だが、読む文にはそれほど苦にならない(ビデオ以外は英語です)ので、まあまあついていけている
  • 日本語字幕が流れるのが早いときがあるが、あんまり気にならない

まだプログラム書くとこまでたどり着いておらず、多変量の線形回帰についてのところまで来ている。 2週目でOctave書くらしいので、今晩中にはOctave書くことになるかと。


機械学習を学んでどうするかといえば、もちろん相場の予測に使う。

最近スキャルピングの本など読んだのだが、抵抗線とかを機械的に引くのはあんまり楽ではなく、 さらにその結果から次のアクションを自動的に判断するところまで作りこむのは、できなくはないが、良い物を作る自信はないし楽しそうでもない。 その他、人力で実施できる解析を機械にさせるのはいささか面倒だ。

それよりも過去の膨大なデータをガシガシ食べさせて、パターンを覚えさせるほうが楽で楽しい。

楽しんで作り、楽して稼ぐ、が一番だ。

仕事ではじめる機械学習

仕事ではじめる機械学習

  • 作者: 有賀康顕,中山心太,西林孝
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2018/01/16
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

Machine Learning実践の極意 機械学習システム構築の勘所をつかむ! impress top gearシリーズ

Machine Learning実践の極意 機械学習システム構築の勘所をつかむ! impress top gearシリーズ

  • 作者: Henrik Brink,Joseph W. Richards,Mark Fetherolf,株式会社クイープ
  • 出版社/メーカー: インプレス
  • 発売日: 2017/11/17
  • メディア: Kindle版
  • この商品を含むブログを見る

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

  • 作者: Andreas C. Muller,Sarah Guido,中田秀基
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2017/05/25
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る