チャネルブレイクアウト戦略を使ったBTCFX自動取引Bot(pythonコード)

こんにちは!スナフキンです.先日チャネルブレイクアウト戦略を使ったbotを作成したのですが,そのコードを公開します.コードを全て解説する時間はさすがにないので,概要を述べたあとに重要な変数と重要な関数のみを解説します.本botはヒストリカルデータを用いてバックテストを行う機能も搭載しており,botの勉強を始める方にとってはそのあたりの実装についての勉強教材になるかもしれません.実運用・バックテストともに可能です.また,自分の設定したローソク足の時間軸でのトレードが可能です.

ちなみに2018/2/21-2018/3/10の5分足でのバックテスト結果は以下です.

ぼく個人の感情から,なるべく早く公開したいので,さしあたってチャネルブレイクアウト戦略そのものの説明などはGoogle先生にお任せします.(気が向いたら更新して細かい解説もします.)

2018/9/9追記

こちらの方がnoteで詳しい解説をしてくださっているようです.34記事の超大作シリーズとなっているので,これを読むとコードの理解が進むと思います.

https://note.mu/wanna_be_free/n/ndb77d394a54e

概要と変数の説明

本botはチャネルブレイクアウト戦略を少し改良したものになります.具体的には以下のような点を改良(拡張)しています.

  1. チャネルブレイクアウト戦略は期間安値・期間高値の更新でエントリーおよびクローズ,ドテン売買するが,何期間高値・安値でエントリーし何期間高値・安値でクローズするかを設定可能.→ex. エントリー5期間でクローズ3期間ならドテン売買は行わなくなる.(もちろん,エントリーとクローズの期間を同じにすれば通常のチャネルブレイクアウト戦略のようにドテン売買する)
  2. レンジ相場でのエントリーを減らすために,レンジ判定ロジックを導入している.(レンジ判定は,一定期間の値幅または価格の標準偏差の変動で行います.)
  3. 大きな値幅をとったあとのnトレードではロットを1/10に減らす処理を入れている.(大きいトレンドのあとの大きなリバや戻りで損をしやすいため)
  4. 成行注文のスリッページによる執行コストを考慮したバックテストが可能(ただし定額固定)

さて,重要な変数の解説ですが今書いていて眠くなってきたのでまた明日以降に気が向いたときに書きます.コードは載せておくので販売・商用目的以外はご自由にご利用ください.

また,質問は自分であらゆる手段(本記事のコメント欄,Google検索,TwitterのBot使用者の過去Tweet検索,くーるぜろさんのbotDiscord(くーるぜろさんにTwitterで申請すれば入れます.))を使って調べた後に,Discordのマナブくんチャンネルにお願いします.

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. 吉田 より:

    はじめまして、botやプログラミングの勉強をしようと思いスナフキン様のページを教えてもらい勉強させていただいております。ありがとうございます。
    すごく初歩的なことかもしれませんが教えていただけましたら幸甚です。

    上記コードを実行して現在下記が表示されている状況です。

    ======================= RESTART: C:\python\bitcoin.py =======================
    Total pl: JPY
    The number of Trades:
    The Winning percentage: %
    The profitFactor:
    The maximum Profit and Loss: JPY, JPY

    損益等のグラフも出ています。これだけで感動いたしました。
    ただ、KEY等はいれましたがそれ以外いじっていません。
    この状態で自動でトレードは行われるのですか?設定しなければいけない数値があるのでしょうか?

    本当に初歩的な質問で申し訳ございません。
    よろしくお願い申し上げます。

    • スナフキン より:

      はじめまして.お読みいただきありがとうございます.注文はloop関数で回すので,ifmainでコメントアウトしているloop()を有効して実行すればOKです.ただし,パラメタの設定が重要で,その辺りは今後ブログ記事で解説を行う予定なのでそちらでご確認ください

  2. ぜりい より:

    こんな貴重なものの公開、ありがとうございます!
    ちなみにこれはMEXでも使えるように成るのでしょうか?
    そのためにはどのあたりを調節すればよいのでしょうか?

    • スナフキン より:

      MEXの場合,Taker’s feeとの戦いになると思います.MEXでの運用自体はAPIをMEXのものに変えれば良いだけですが,儲けたいのなら(当然そうですが)MEXの場合はTaker’s feeで取られる以上の期待値が必要になります.
      そのため,エントリーを絞るロジック,あるいはなんとかMakerになる方法を考える必要がありますね

  3. 吉田 より:

    ご回答本当にありがとうございます!
    せっかくお答えいただいたのに知識が足りず理解がしっかりとできませんで本当に申し訳ありません。
    ブログ楽しみにしています!それまでに知識を詰め込んでおきます!

  4. マエダ より:

    はじめまして、最近bot製作に興味が出てきまして、大変勉強させていただいております。
    上記のコードをAPIキーなどを変更し実行してみたのですが
    557行目コード:high = max([self.executions[-1-i][“price”] for i in range(30)])
    にて
    IndexError: deque index out of range
    が出ております。
    #pubnubが回り始めるまで待つ.
    の時間を変えてみましたが結果は同じでした。上記のエラーを解消するにはどのような修正を行えばよいのでしょうか。すみませんがコメントいただければ幸いです。
    よろしくおねがいいたします。

    • スナフキン より:

      マエダさん
      同じエラーが他の方も出たということで,今原因を確かめています.(自分の環境では特にエラーが出ないので,まだ分かっていません.)とりあえず,high = …の近くでprint(self.executions)して, dequeの中身を確認してみてください.

  5. 岩原 より:

    裁量トレードで感情に任せてしまう瞬間があり、改善できないものだろうかと答えを探していたら、スナフキンさんのブログに偶然辿り着きました。こんな素晴らしい内容を教えてくれるブログはそうありません。これからもどうぞよろしくお願いします。
    noteアップされたようですので、これから購入させていただきます⭐️

    • スナフキン より:

      お読みいただきありがとうございます.自分も同じ理由でシストレを始めました笑
      noteまで購入いただきありがとうございます.なにか分からないことがあればご質問ください.

  6. koyama より:

    コードがすごき綺麗ですしバックテスト、最適化まで付けて無料公開なんてすごいです。ファンになりました。

    • スナフキン より:

      python始めたのが12月頃で,それまでは主にJavaしか使ったことがなかったので,実は命名規則とか変なところがあるんですよね笑
      でもそう言っていただけると嬉しいです.ありがとうございます.

  7. […] チャネルブレイクアウト戦略を使ったBTCFX自動取引Bot(pythonコード) – マクロ… […]

  8. a より:

    はじめまして。
    このようなコードを無料で公開なんて頭があがりません、ありがとうございます。
    一つ質問なのですが、このコードではcalculateLot関数は定義しているものの未使用なのでしょうか?

    calculateLot関数が使用されていないように見えて気になったので伺ってみました。
    # 私はpython初心者なので、そもそもコードが理解出来ていない可能性もあります。笑

    • スナフキン より:

      はじめまして.はいおっしゃる通りで,calculateLot関数は未使用です.必要なら実働させるときに使ってみてください.

  9. ナンシー より:

    こんにちは、昨日から動かしてみたのですが一度も売買してくれなくてLOOP関数のコメントアウトをはずすというのができてないと思うのですが、実働のコメントアウトをはずしてバックテストにコメントアウトをいれ一番下のoptimization()のコメントアウトをはずすという処理ではダメなんでしょうか?ほかどこのコメントアウトをはずせばよいのでしょう?
     ノート購入させていただいてそっちもLOOPのコメントアウトをはずすってあったのですがLOOP関数のコメントアウトしてるとこが、何度もみたつもりなんですが全くみたらなく何処だか教えていただけたら助かります。 ほんとに初歩的な質問で申し訳ない

    • スナフキン より:

      こんにちは.まず,optimizationは実働とは関係ない処理です.コードを読めばそれが分かるはずです.初歩的な質問をしていただくのは全くかまいませんし,申し訳なく思う必要もありません.しかしぼくのこの記事も,noteにしてもコードの見本を題材にコードを理解できるように,そして書けるようになろうというのが目的であって,ここをこうすれば動かせるよと丁寧に手取り足取り教えて,既存のbotを動かせるようになることは目的ではありません.遠回りに思えるかもしれませんがまず分からないときにすぐに人に聞くのではなく,自分で調べてコードを理解しようとするところから始めてください.結果的にそれがbotトレードで稼ぐ一番の近道になるはずです.もしそうしていれば,質問も「このコードのこの場所でこういった処理を書いていて,自分はこれを実行すると〇〇のようになると思うが,実際にはこうなっている.どうしてか.」というようなものになるはずです.何度も言いますが,そういった種類の「初歩的な」質問は全く構いませんし,申し訳ないなどと思う必要も言う必要もありません.では頑張ってください.

  10. ナンシー より:

    申し訳ない、買い 売りは、はいってたけど
    pubnub:Exception in subscribe loop: HTTP Server Error (599): HTTP 599: Timeout while connecting
    エラーで買えなかったようです、やはりどこかコメントアウトをはずすのが抜けてるってことなのでしょうか?

  11. ナンシー より:

    何度も申し訳ない、自己解決しました。結局、オーダーのほうに、APIの鍵がはいてなかったという、間抜けな状況でした。たぶんノートのほうもまだみてないけどそうかも。
    質問は「Discordのマナブくんチャンネル」のほうでしたね。失礼しました。

  12. x98000 より:

    #Discordがよくわからなかったのでこちらに書かせてもらいます
    公開されたコードを参考にさせてもらっています。非常に有用であり感謝しています。
    折角なので私が気になったところを記載します。公開から時間が経っているので既に把握している部分や意図的な箇所もあるかもしれませんがご参考になればと。

    155-156
     calculateLinesで判定する足の数が1本少なく見える
    356
     numberの計算に日跨ぎが考慮されていないためローソク足が一日分しか取得できない(そもそもnumberは不要?)
    572-575
     0.5秒単位にjudgementしてるが、直近の高値安値は1分おきにしか見ていない
    625,647
     ifをelifにしないとplRange>waithTh時にwaitTermが初期化されない

    • スナフキン より:

      x98000様
      コメントありがとうございます!3番目は意図的なもので,2番目,4番目はミス(というか訂正忘れ)です.

      まず3番目については,pubnubのリアルタイムAPIを使って高値・安値ブレイク判定を行っているので0.5秒単位でループを回しています.高値・安値ラインは1本前のローソク足で決まるのでこちらについては1分ごとの更新で問題ないはずです.(逆に0.5秒ごとなどとしてしまうと,CryptowatchのAPI制限にひっかかかる.)

      1,2,4番目ですが,これはブログに載せたものがぼくが動かしているものより少し古いもの(バグを発見および訂正する前のもの)であるためです.1番目の指摘についてはロジックがやや変わってしまう(期間が1減ってしまう)ので訂正しておきました.また4番目もすぐに訂正できるのでしておきました.2番目はそれほど影響はないので必要ならば各自変えてくださいということでお願いします.

      • x98000 より:

        早速の回答有り難うございます。
        3番目について、高値・安値ラインは1分毎でいいですが、pubnubは裏で回っていてもhigh,lowが1分毎にしか更新されないように見えるので、結局1分毎にしか判定できないように思えます。勘違いかな?

        • スナフキン より:

          今確認しました!そうですね.インデントを1つ下げないとダメですね.結構大事な部分でミスしてました.失礼しました.ありがとうございます!

  13. ピジョンだと思ってた より:

    こちらのプログラムを見て、pythonはこんなことができるのだと知って勉強を始めました。今まで大きなプログラムを作ったことが無かったのであちらこちらに散ったクラスから必要な処理を持ってきて…という工程にとにかく苦戦させられています。

    ロジックの変更はpythonを自在にこなせるようになってから。まずはbitmexで使えるように変更することから始める。と目標を立ててやってみているのですが、gitに上がっている別ファイルの方も変更しないとmex対応にできませんよね?
    JavaやCに多少触れていたとは言え、1か月程度の学習レベルでは到達不可能な分不相応な事をしようとしてしまっているのでしょうか。

    • スナフキン より:

      はじめまして!たしかMEX対応版をDiscordのどなたかが作ってDiscordに貼っていた気がします.JavaやCをやっていたのなら全然そんなことはないと思います.ぼくもpythonを触り始めたのは12月末ぐらいなので...

      • ピジョンだと思ってた より:

        お返事いただけるなんて嬉しいです!

        MEX対応版の情報ありがとうございます。短期的に見ればさくっとコピーできちゃえばいいなという欲もありますが、やはり自分で理解して自分で作れるという強みは今後臨機応変に対応していく中でも必要になりますよね。

        機械的になれずに裁量で2桁万円飛ばしちゃって反省してシストレを検討し始めました。似たような感じでシストレに移行したという事で、私もこういった物を理解できるレベルに到達できるように(贅沢言えば早めに)頑張ります。

  14. ピジョンだと思ってた より:

    再びコメント失礼します。165,166なのですが、i<termの場合に配列を逆走してしまいませんか?
    155,156が修正されているかもしれないと思い、githubの方を見に行ったところ上に上がっているプログラムが一切見つかりませんでした。
    最新版は微修正レベルの改善ではなく別物レベルに仕上がっていて、既に上のは無くなってしまっているのでしょうか?

  15. のびのび〜る より:

    はじめまして。
    中年エンジニアでBot運用しています。
    チャネルブレイクアウトをモディファイして運用していたのですが、レンジ相場と大きいトレンドの後で損失が大きいのに気付き、ちょうど対策しようとしていました。
    そんな時に、この記事にめぐり逢い、とても参考になり、感謝しています。
    ところで、ソースコードがとても綺麗ですね。自分も綺麗に書こうと努力しているんですが、とても感心しました。

    • スナフキン より:

      ありがとうございます.長年エンジニアをされている方にそう言っていただけて嬉しいです.