突然ですが、仮想通貨のトレードBOT開発記録を始めます。
見出し
2018/06/12~2018/06-13の開発記録
node.js版が先ず目に入ったので、node.js版で注文出来るところまでを作ってみました。
環境構築はなんと、node.jsだけ。簡単過ぎる。
インストールしてBOTを見よう見まねで作ったところまでは良かったのですが、進めていくうちにpythonの方が盛り上がっており、便利なライブラリとか多い感があったので、早くもnode.js版での開発をここでやめようと思います。
今回4時間 計4時間
2018/06/22の開発記録
python版にとりかかります。開発環境構築しました。簡単でした。
pythonのバージョンは3.6.5です。pythonだとこのコードはどう書くのかな?とか調べている時に結構3系から変わっているようなのでバージョンには注意が必要です。今のところ(2018/7/22時点)では3系にして良かったという感想です。
1 2 |
python --version Python 3.6.5 :: Anaconda, Inc. |
今回2時間 計6時間
2018/06/23~2018/06/26の開発記録
bitFlyerのAPI、cryptowatchのAPIをテスト使用してみました。
ccxtというライブラリが優秀という事で早速試してみました。
1 |
pip install ccxt |
APIを叩く為のパラメタ設定の定型文などまとまっているので、1行で注文出来たりします。作られたメソッドを呼ぶ形なので組み込みやすいですね。
pythonは初めてだったので勉強しながらで、まだ書き方・ぱっと見くらいですが、rubyに似ているような感じがします。
テストアルゴリズムで注文・キャンセル・決済を自動稼働するところまで動かしました。実際に注文出来るところまで来たので楽しいです。
基本的な操作は軽くですが触れられたので、次からはBOTの核となるトレードアルゴリズムやツール、内部インジケータの実装に入っていきたいと思います。
どういうBOTにしようかいくつか考えがあります。
- レンジスキャ系BOT
- 機械的スプレッドスキャ系BOT
- 中長期での複合インジ系BOT
- 裁量スキャサポートツール
たぶんコツがわかって作り始めたら開発時間は少ないはず。とりあえず全部作ってみます。
ここからが本当の始まりです。わくわく。
今回4時間 計10時間
2018/07/10~2018/07/21の開発記録
サンプルコードをベースにロジック部分だけの組み換えを行って、バックテストで収益がどうなるか色々試してみました。
当初やってみたかったEMA系から着手。EMAだけを見てエントリ・イグジットしてみるというもの。EMA指数を調整して試してみましたが、これだけでは当然勝てるわけがなく、2017年末のような一方向相場でない限りプラスにはならない…。そこからEMAと直近終値の乖離率をパラメータにしたり、利確・損切り幅をパラメータにしたり、色々パラメータが増えすぎた事により、パラメータの組み合わせで収益がどう変わるかを探す手間が増えてきました。そろそろパラメータ調査出来るように、バッチをパターン別に実行するバッチを作る事が必要になってきました。
matplotlib と pandas というライブラリを使って結果をグラフ化する事が出来ました。まだ全然改良の余地があり、これをベースに可視化しながら改良していきたいと思います。
ここまで、ちょっとずつ拾い物コードをベースに修正してきたのですが、その場しのぎのフラグ条件分岐なコードが増えてきました。今後の拡張性を考慮して、オブジェクト指向で一から作り直そうと思います。
他、バックテストを複数の足で測定出来るように過去データを集めるスクリプトを作りました。複数の処理をAnacondaで同時に走らせる為にマルチスレッドを実装しました。
マルチスレッドサンプルはこちらに追記
勝てるかどうか、とりあえずEMA系のBOTでプラス収益がバックテストで出てくるようになりました。一番大切なパラメータが何かという事もわかってきました。ただ、現状の作りではシンプルではないので、やはりフレームから作り直して、無駄な取引を排除してもっと利益を安定させる為に改善する必要があります。
試してみて感じた事ですが、相場環境の変化(トレンド転換だけでなく値動きの規則性の変化)が起きると、勝てるパターンも勝てなくなるという事が明らかになってきました。勝てるロジックが出てきたとすると、それを狩るような動きが出てくるように感じます。詳しくは書けませんが、他を見てもそれは当然の上で、みんな日々改良していっているようです。相場環境によってBOTを使い分けたりしているという話もありました。使い分ける判定もBOTに任せて1つのBOTに複数のロジックを組み込むという事も考えられます。どこからAIなのかというのもありますが、どんどんパターンが増えた先はAIという事なのだと思います。
ますます激化していくこの世界についていけるのかという不安もありますが、それよりも先ずは試してみたいという思いが今は強いです。バッチ処理なので画面とか気にせずゴリゴリ処理を書けるプログラムと結果が明確に出るのが楽しいからだと思います。いつまで持続するかわかりませんが…
直近課題
- EMA系BOT(壁が見えるまで色々試してみる)
- フレーム作り直し
- グラフ改良
- パラメータバリエーションテストバッチ
今後課題・やりたい事
- リアルタイムAPI
- MMBOT
- SFDBOT
今回13時間 計23時間
2018/07/22~2018/07/30の開発記録
フレーム作り直しの為に、現状のメソッドと役割を整理して、あるべきメソッドを用意し直す事にしました。今後もパラメータを追加したり除外する事が頻繁に出てくるので、修正に耐えられるカスタマイズしやすい形にします。Pythonは初めてでフレームワークがあるのかもわからないのですが、先ずはモデルというか別ファイルにして切り分ける事にしました。グラフも少し使い方がわかってきて表示内容を整理しました。
ついでにクラスが使えたので使う事にしました。
「別ディレクトリ別ファイルのクラスを呼ぶ」を以下に追記しました。
参考中
https://it-engineer-lab.com/archives/68
パラメータ最適化バッチが出来たら、それを一定タイミングでチェックして自動的に反映する予定です。相場が変わると勝ち方が変わっている事がBOTの収益グラフから見れるのでそれを改善したいです。AI化へ歩みたい…
結局最適化バッチまではまだ出来ておらず、数千パターン分テストしてログを吐き出すところまでです。相場環境も日に日に変化するので、今はちょっとエクセルに集計して色々最適解を見ています。この方向で合ってそうだなって思えてきたら、パラメータ最適化算出バッチを作って、その値で1日回すとかになりそうです。完全自動化より1日毎に見直す方が現実的な感じがしてきました。
課題
- 例外キャッチ
- 売り買いでパラメータ分ける
今回19時間 計42時間
2018/08/08~2018/08/23の開発記録
先ず数千のパラメータからその日の最適化パラメータを算出するバッチを作ります。数千パターンで回すところまで出来ているので、ループ終了後にどの組み合わせが良かったか判定するところからです。
ちょろっとしかやらなくてこれ書いているのが10月だから何やったか忘れました。
今回4時間 計46時間
2018/10/1~2018/10/08の開発記録
8月9月は違う事に時間を使ってしまっていて、この開発が中断してしまったので再開します。本気で一気にやらないと終わらない・・・
何やってたか忘れまくっているのでソース読み込みから。
pythonの勉強がてらオブジェクト指向で作ったりしましたが、結局、関数型にしました。ここまでだらだらとやってしまい5時間。
バックテストの実装だけでやっていて、リアルタイム取引に変えようと思います。修正箇所を限定的にするようにしたのでそんなに作り変えなくて良いはずです。
翌日、リアルタイムに着手しました。ccxtというライブラリが便利で、国内取引所のAPIを叩くメソッドが用意されています。更に、webでサンプルを探せばメソッドに渡す引数付きで例がありかなり簡単に出来ます。アウトドア系youtubeを見ながらだらだら作業をしてしまいました。次のキャンプの事をぼんやりと考えながらコード書いてます。(おい)でもこれが至福のひと時でもあるのが悩みです。
なんとかリアルタイム取引版を開発しました。ここからは小ロット短期足で実取引テストしていきます。
今回17時間 計63時間
2018/10/09~2018/10/12の開発記録
小ロット短期足で実取引テストが始まったのですが、いきなり出鼻くじかれました。なんとあれだけやったバックテストのロジックに不具合があったのです。その不具合のせいでうまくエントリ・イグジット判定が行われずに損害を被る事となりました。(100円くらいですが)
実取引でテストは思ったより時間がかかります。エントリは目視出来たとしてもイグジットまで見ていられるか。寝る前に実行してテストという感じになりそうです。時間だけが過ぎていきそうな気がします。
anacondaを使用しているのですが、2重で起動出来ないのでしょうか?もう1本macで走らせようと思います。
バックテストの通りうまくいけばですが、このような安定したグラフを描けそうです。これはpythonのmatplotlibで出力したグラフです。pip install matplotlibでインストール出来ます。色々なグラフ描けますので使い方は簡単で、その場で調べながら使っています。
ただ、バックテストと本番は違うのでどこまで「ズレ」がどれほど出るのかわかりません。たぶん手数料・スプレッドが大きく影響してきそうで、これ次第だと思ってます。
良い感じに出るようにログ情報を修正しながら何日か実運用テスト続けてみます。
あと日中家で放置して会社で確認したいのでログ情報をLINE通知しようと思います。
LINE通知実装しました。
今回7時間 計70時間
2018/10/13~2018/10/14の開発記録
取引所のAPIを使用して注文や状況確認をしていますが、たまにエラーで返ってきます。手動で取引してもどうしても大きく動く時は混雑してスムーズに取引が出来ない時があります。どこの取引所でも大小ありますが、これは現状で避けられない現象だと思います。
APIがエラーで返ってきた場合の例外処理を実装していく事にしました。ただ、やり始めてだんだんと深い問題だなって思い始めてきています。単純にエラーキャッチして、ちょっと時間置いて、リトライ、と安易に考えて進めていたのですが、リトライしている間に状況は刻々と変わっていきます。本当にそのタイミングでリトライするのがベストなの?という事です。
結構難しい問題になってきており、先ずは例外処理がなかったので、今後拡張しやすいであろう形に例外処理を実装しいくところから始めます。
今後もどんどん流れを変える仕様変更が出てきそうで、これは単純なコーディングというより大きな仕様変更を受け入れられるような仕組み造りが重要だったんだなと感じています。つい終わりが見えた気持ちで力技よりになってきていましたが、気を引き締めていきたいと思います。新規機能の楽しみというより造りに拘った楽しみを見出すフェーズに入りますw
テスト実績の方は、やはりバックテストのように安定上昇とはいかず、今のところ30時間くらい回して横横微損という感じです。相場が動いていないからかもしれませんが。
10/14追記
今時点でわかる範囲でリトライタイミングの考慮まで含めて例外処理を実装しました。また、予め設定した証拠金以下になった際に強制終了するようにしました。何か不具合があって永遠とマイナスになっては怖いので。他にも課題が見えてきました。
課題
- エントリ・イグジットタイミングの見直し
- メンテナンス時間前のポジション解消 メンテナンス時間後の取引開始
今回4時間 計74時間
2018/10/15~2018/10/17の開発記録
実経験からすると、エントリタイミングというより大事なのはイグジットタイミングの方なので、エントリは足が確定してから、イグジットはリアルタイム(10sくらい)で確認という形で実装しました。
文字列比較の適当な実装でメンテナンス時間を対象外にしました。※04:00~04:05
1 2 3 4 5 |
def is_maintenance(): now_str = str(datetime.now().strftime("%H:%M")) if BF_MAINTENANCE_START < now_str and now_str < BF_MAINTENANCE_END: return True return False |
他、稼働中のエラー終了調査と対応をしました。import忘れに気づかずに何回もエラー・リトライしてました。ちゃんとエラーログ確認してから対応しなかったので痛い目を見ました。
指値注文してからキャンセルまでの時間が見ている足に対して長かったので、調整して刺さらなかったらすぐキャンセルするようにしました。これは無駄ポジ減らせて良かったような気がします。他、小さいバグをいくつか修正。
あとメイン処理を結構いじってしまいました。リアルタイム版がある程度落ち着いたら、ここからまたバックテスト版を作っていかないといけませんね。
ここまでやってとりあえず課題が落ち着きました。あとはまたボラティリティ待ちです。トレンド追うタイプのBOTなので横横だとつらいです。
エラー終了していない事を祈りつつLINEに飛ばすようにした決済通知を待ちます。
追記
次の日になればエラーで終了し、朝稼働して出かければ昼止まるし。という感じでまだまだエラー対応に追われています。
今回5時間 計79時間
2018/11~2018/12
エラー解消が落ち着き、一週間放置しても落ちませんし働いてくれるようになりました!
なんと・・・12月はほったらかしで置いてみましたが、資産が20%近く増えました。
大きく動いた時だけ稼働して思い出したようにLINEに通知が来ています。
このまましばらくどうなるか見ておきたいと思います。
たった20%ですが、1.2の4乗で2倍なので4か月後は資産が倍になっている計算で、1年後は約10倍という計算です。
自分は恐ろしい物を開発してしまったのかもしれません・・・。
今回7時間 計86時間
終了報告
サーバの負荷対策なのか、APIのアクセス制限が入るようになってしまい、BOTを稼働させる事が出来なくなってしまいました。もっと早くやっておけば抜けるだけ抜けたのかもしれないですね。
他の取引所で試していこうとも思ったのですが、手法は常にブラッシュアップしていかないとならず、リスク(時間とお金)は当然ありますしモチベーションが低下してしまった為、ひとまずこの開発は保留しています。最終的にはBOTに持たせた資産は150%となりました。完
(個人開発サービスで売上が出てリスクがある程度取れるようになってきたら再開するかもしれません。