69
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

仮想通貨botterAdvent Calendar 2023

Day 22

botter道 ~開発未経験の取引所社員が、ChatGPTに頼り4ヶ月でC級botterになった話~

Last updated at Posted at 2023-12-22

12/28追記:たくさんの方に読んでいただきありがとうございます!ビットバンクDiscordコミュニティビボラボについて少し追記させていただきました。

はじめに

はじめまして、取引所勤務のナベと申します。
大変恐れ多くも参加させていただきますが、本記事は、仮想通貨botter Advent Calendar 2023 シリーズ 2の22日目の記事です。

botter道とは

あまり宣伝色は出したくないので、タイトルのbotter道について簡潔に説明させていただきます。

botter道とは、開発未経験のビットバンク営業担当ナベが、
ゼロから悪戦苦闘しつつもbotterとして成長していく(?)道のりを追いかけるドキュメンタリー企画です。

image.png

目的

簡潔過ぎて全然伝わらなかったと思うので、少しだけ補足します。

  • 開発未経験36歳中年男が、会社の企画でChatGPTをフル活用しゼロからbotterになろうとした軌跡のドキュメンタリーです。
  • この記事は初心者向けであり、高度な内容は一切ありません!
  • botterになりたい非エンジニアの方々の勇気に少しでもなれば...!

本編目次
序章:botterになることになった
1章:バックテストしたら1万円が6,000億円になった
2章:botを実装する
3章:EC 2 DANCE
4章:トレード戦略について
6章:botたちの沈黙
おわりに

ディスクレーマー

  • 本記事の内容は、投資を助言推奨するものではありません。
  • 非エンジニアが開発しているため、コードの誤り等をご容赦ください!
  • 当資料について無断で引用・複製・配布することを禁じます。

ビットバンク公式Discordコミュニティビボラボ

本企画はビボラボにて、日々のもくもく開発と6回のオンラインイベントを通じて行いました。

image.png
正式名称は、「ビボラボ(bitbank botters labo)by bitbank
ビットバンク株式会社が運営する公式Discordコミュニティです。

日常のちょっとした出来事から、bot開発・トレード関連トピックまで共有できる場所を目指しています!
botterの方はもちろん、トレード未経験の方も大歓迎です!!

運営チームはこちら!!
image.png

  • Chachaさん:ハイパーコミュマネ!素晴らしい気遣い、細部へのこだわりほんとに助かってます!botter道ロゴはナベの手書き、これもChachaさんの発案!
  • かくさん:botter道最大集客を記録したイベントタイトルの発案者。日々のナベのしょうもない相談にも親身に乗ってくれる。
  • うーさん:こんなエンタメ企画を許してくれたボス!
  • ざきやまさん:いつも暖かく見守ってくれる大ボス!

登場人物紹介

image.png
たかP
ハイパーMCたかP!
日々のもくもく開発サポートから全イベントのMC、ディレクションまでお世話にしかなっていない!

image.png
きたのさん
きたのさんがいなければこの企画は生まれなかった。
毎日のもくもく開発も一緒にやってきました!botter道のコラもきたのさん作。

自己紹介

20231108_【neumann】botter道 #5 (1).jpg

人生
ビルに飛び込みまくり「社長に会わせてくださいっ!」って言い続けるファーストキャリアから始まった、文系会社員です。大学もFランで賢くもないです。
ここまで愛嬌で生き抜いてきました。

プログラミング
小学生の頃にhtmlと古のホームページビルダーを使って、ホームページを作ってたくらい(ちなみにhtmlはプログラミングではないらしい)。
もちろん今回使うpythonも未経験。

トレード
証券会社を辞めたあと自分なりのロジックで株式を売買し、相場がよかったこともあってそこそこ利益が出ていました。

昔儲かった株式たち
image.png
image.png

ただファンダ分析、テクニカル分析をすべてSpreadsheetでマニュアルで行っていたためあまりに時間がかかり挫折。

今は仕事、資産共にクリプトの一本槍です。

自分のトレードロジックを自動化できればそれなりに儲かるんじゃないかなーと長らく思いながらも、日々を漫然と生きていました。

序章:botterになることになった

とにかく色々あって、botterになることになりました。

与えられた環境は下記。

  • 業務時間の毎日1時間を開発に使って良い(とてもありがたい)
  • 期間は4ヶ月!
  • 実弾投入は自己資金☆

開発環境として使ったのは下記。
プログラミングをゼロから学ぶのは大変そうなので、ChatGPTをふんだんに活用します。
この時代に生まれてよかった。

1章:バックテストしたら1万円が6,000億円になった

早速開発に取り掛かります。
しかしbot初心者あるある、何から始めればいいのかわからない。

僕の場合は、試したい昔株で使ってたトレード戦略があったので、まずはそれをバックテストしてみることにしました。

やったこと

  • 昔使ってたトレード戦略をバックテスト。
  • botterの.Qさんがイベントで配布していたChatGPTのプロンプトとバックテストコードを活用。

作りたい戦略はこれです。
シンプルなブレイクアウト戦略ですが、株のときはこの戦略にファンダ分析を加えることで中長期で結構戦えてました。

image.png

まずは.Qさんのプロンプトを使って、ChatGPTで戦略のコードを作成します。
テンプレ通りのプロンプトをChatGPTに投げます。
image.png
https://chat.openai.com/share/a7b90f06-11b1-46dd-8132-c8df941fe9a6

戦略部分も下記のように日本語で表現。

下記の戦略をtaライブラリで実装して下さい。ただしショートポジションは持たないようにしてください。

1.取引戦略:
エントリー条件: 指定された時間帯内での最高価格と最低価格の間の価格差が指定されたパーセンテージ内であり、かつ次の開始価格がその時間帯内の最高価格を超える場合、ポジションにエントリーします。

2.エントリー方法: 指定されたパーセンテージの資本を使用してポジションをオープンします。実際のポジションの数量は、使用する資本額を次の開始価格で割ったものとなります。

3.エグジット条件: エントリーからの価格変動が指定されたパーセンテージを上回ったり、下回ったりすると、ポジションからエグジットします。

4.エグジット方法: 全ポジションをクローズし、資本に取引結果を追加します。

こんな感じで、いい感じでpythonのコードを書いてくれます。
image.png

続いて、ChatGPTが書いたコードをバックテストするため、同じく.Qさんが配布したバックテスト用コードをGoogle colabで開きます。
先程ChatGPTで作った戦略のコードも貼り付け、実行!

image.png
https://github.com/bitbankinc/bitbank-botters-labo/blob/main/ipynb/20230823_botterdou_sample.ipynb
(ChatGPTが書いたコードは、バックテストコードの最後に貼り付け)

結果↓
image.png
image.png

喜ぶ隙もないくらい間違った結果が出てきました。

もちろんコードは読めないので、どこが間違っているか全然わかりません。
文系マン、日本語は読めるのでChatGPTに間違っているプログラムを日本語で説明してもらいました。

image.png

# 定義: RangeBreakoutStrategy クラス。これは EasyBacktest クラスを継承しています。
class RangeBreakoutStrategy(EasyBacktest):
    
    # 初期化メソッド
    def __init__(self, df, order_lot=1, time_frame=14, price_diff_percent=0.01, 
                 capital_use_percent=0.1, exit_profit_percent=0.02, exit_loss_percent=0.01):
        df_copy = df.copy()  # データフレームをコピー
        self.set_time_frame_high_low(df_copy, time_frame)  # 時間枠内の高値・安値を計算
        super().__init__(df_copy, order_lot)  # 親クラスの初期化メソッドを呼び出す
        # 下記は、各種属性の初期化
        self.time_frame = time_frame
        self.price_diff_percent = price_diff_percent
        self.capital_use_percent = capital_use_percent
        self.exit_profit_percent = exit_profit_percent
        self.exit_loss_percent = exit_loss_percent
        
        # capital属性の追加
        self.capital = 100000  # 例: 100,000として初期化 (適切な初期値に変更してください)

    # 静的メソッド: 時間枠内の高値・安値を計算
    @staticmethod
    def set_time_frame_high_low(df, time_frame):
        df['high_max'] = df['high'].rolling(window=time_frame).max()  # 時間枠内の最高値
        df['low_min'] = df['low'].rolling(window=time_frame).min()    # 時間枠内の最低値

...

日本語ならわかる!ということで、何度もChatGPTでコードの作成、日本語で確認を繰り返しました。

その結果↓
image.png

2年で約3倍悪くない!
とりあえず、自分のトレード戦略がバックテスト上は利益が出ることがわかりました。
順調。
(.QさんのChatGPTのプロンプトとバックテストコードはむちゃくちゃ便利なのでぜひ使ってください)

2章:botを実装する

いきなりバックテスト上で利益が出ている戦略ができたので、次は実際に取引所に戦略に従って注文を流すbotを作ります。
もちろん作り方はわからないけど、ChatGPTがいれば怖くない。

やったこと

  • ビットバンクのpythonライブラリpython-bitbankccをChatGPTに読み込ませる。
  • まずはシンプルな「ゴールデンクロスしたら買う」だけのbotプログラムをテストで作成。
  • テストbotプログラムをデモとしてfew-shot promptingを行い、バックテストしたブレイクアウト戦略のbotプログラムをChatGPTで作成。
  • デバッグする。

image.png
たかPに教えてもらい、公式で用意されているライブラリ「python-bitbankcc」を活用します。
楽できるものはどんどん使っていきたい。

ライブラリとは、汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたものである。
ライブラリと呼ぶときは、それ単体ではプログラムとして動作させることはできない、つまり実行ファイルではない場合がある。
ライブラリは他のプログラムに何らかの機能を提供するコードの集まりと言える。

GPT-4であれば、ライブラリのURLを読み込ませればライブラリを活用したコードを作成してくれます。

image.png
https://chat.openai.com/share/6b78307e-775c-46b5-aaa1-b37b2d8fb517

1章で、いきなり難しいものを作らせてもなかなかうまくいかないことを学んだので、今回はまずシンプルな動くものを作る目的で「ゴールデンクロスをしたらBTCを買う」だけのプログラムを作ります。
image.png
https://chat.openai.com/share/6b78307e-775c-46b5-aaa1-b37b2d8fb517

ChatGPTが作成したコードをGoogle colabに貼り付け、取引所APIキーとシークレットを発行しコードの必要箇所に貼り付け。
プログラムを実行!

image.png

エラーが出ることもなく、一発で動く!
記念すべきbotからの初約定となりました。
簡単である。
まだプログラミングは全然わからない。

続いて、動くことがわかったゴールデンクロスbotのコードをベースに、バックテストしたブレイクアウト戦略のbotを作成していきます。

ゴールデンクロスbotのプログラムをデモ(お手本)として、ブレイクアウト戦略のコードをChatGPTで作成。
お手本をAIに渡して回答の精度を上げる手法を、Few-shot promptingと言うらしい。

「Few-shot prompting」とは、機械学習の手法の一つで、特に大規模な言語モデル(例えばGPT-4)において用いられます。
この手法では、モデルにごく少数の例を示して、特定のタスクをどのように行うかを学習させます。
これにより、モデルは新しいタスクや問題に迅速に適応できるようになります。

image.png
https://chat.openai.com/share/8abacfe0-9c2f-4422-a5f3-9843833dcd9c

Few-shot promptingを行いChatGPTが作成したコードを実行!
やはり少し複雑な処理になったのでエラーが出る。

今回も日本語を駆使し、デバッグを行ってみます。

デバッグとは、プログラムやシステム内のエラーやバグを特定し、修正するプロセスです。
これにより、ソフトウェアが意図した通りに正確に動作するようになります。

ChatGPTを使い、プログラムが行った処理を日本語でprintしてもらうようにコードを修正。
image.png

こんな感じで修正したコードを実行すると、プログラムが行った処理が日本語で表示されるようになりました。
どこまで処理が進んで、どこで止まったかが日本語で表示されるので、プログラムがわからなくてもエラー箇所を特定!

特定したエラー箇所をChatGPTに修正してもらうこともできますが、今回は重い腰を上げてAPIドキュメントを読み解き自力解決を目指します。

特定したエラー箇所のエンドポイントをAPIドキュメントから探し出し、コードのおかしなところを修正。
再度実行!

結果↓
image.png

無事稼働!
今回のbotはエントリーだけでなく、条件に従ってしっかりイグジットもできました。
2章、もう動くbotができてしまった...
プログラムは未だに全くわからない。

3章:EC 2 DANCE

再掲
image.png

トントン拍子に進みすぎて、もう本番の環境でbotを運用できそうな感じになってきました。
これまではGoogle colab上での稼働だけでしたが、次は常時稼働に向けてサーバーを使うことにします。

正直、サーバー立てるところまでたどり着くとは思っていなかった...

やったこと

  • AWS EC2を使う。
  • きたのさんにサーバーの立ち上げをまるっと教えてもらう。
  • きたのさんにセットアップをまるっと教えてもらう。
  • Linuxコマンドをちょっと覚えて、作ったbotをEC2に配置。
  • nohup!!
  • botの止め方。

botterの方々がサーバーを使う際は、様々な選択肢があると思いますが、僕は特に比較検討もせずかっこよさそうなのでAWSを選択しました。
さくらがコスパいいよとか、GCPが使いやすいよって意見もありました。

AWS EC2(Amazon Web Services Elastic Compute Cloud)は、Amazonのクラウドプラットフォーム上で仮想サーバーを提供するサービスです。
これにより、ユーザーは自分のニーズに合わせてサーバーの容量を柔軟に調整し、アプリケーションをクラウド上で実行できます。

AWSの立ち上げ、セットアップに関しては正直難しそう過ぎたので、きたのさんにまるっと教えてもらいました。
(ビットバンクのサービスはAWS上で動いている)

image.png

セットアップもきたのさんにまるっと教えてもらう。
image.png
https://github.com/bitbankinc/bitbank-botters-labo/blob/main/script/setup.sh

EC2上では全てCUI(コマンド入力)で操作を行う必要があります...これは非エンジニアにはとても辛い。
EC2を操作するためのLinuxコマンドを少しだけ覚えます。

コミュニティメンバーの方がチートシートをくれました。

チートシートを駆使し、3章で作成したbotをEC2上に配置します。
EC2上でいざbotを稼働!

image.png

も、画面を閉じるとbotは止まる。常時稼働とは...

今年の夏頃botter界隈でも話題になっていましたが、サーバー上でbotを常時稼働させるには色々とテクニックが必要らしいです。

僕は迷うことなく、一番簡単なnohupを利用します。

nohup(No HangUPの略)は、UNIXやLinuxシステムで使用されるコマンドです。
このコマンドは、ターミナルやSSHセッションが閉じられたときにもプロセスが終了しないようにするために使われます。
具体的には、nohupコマンドを使用して実行されたプログラムやスクリプトは、ユーザーがログアウトしても、またはターミナル接続が切断されても、バックグラウンドで実行を続けます。

image.png

関門は続きます。
次はbotを止めるコマンドがわからない...

ちょっと心が折れそうだったので、これもきたのさんがbotの停止コードを作成してくれました。
何も自分でやっていないぜ。

image.png
https://github.com/bitbankinc/bitbank-botters-labo/blob/main/script/setup.sh

ここに関してはどういうやり方でbotを止めているのか未だにわかっていないですが、とにかくAWS EC2上でbotが動かせる様になりました。
ここまで約1.5ヶ月、順調すぎる。

4章:トレード戦略について

あっという間に実行環境まで整いました。
いよいよ実弾投入..!!の前に、損したら嫌なので(業務なのに自己資金☆)トレード戦略をさらに研ぎ澄まします。

やったこと①

  • グリッドサーチを使った、戦略の最適化プログラムをChatGPTに作ってもらう。
  • プログラムを使い、ブレイクアウト戦略の最適なパラメータを見つけ出す。

バックテストしたブレイクアウト戦略には下記4つのパラメータがあります。

  • 持ち合い期間
  • 持ち合い期間中のレンジ幅(%)
  • 利確(%)
  • 損切(%)

それぞれ値を変えることでバックテストのprofit結果が変わります。
一番バックテスト結果が良いパラメータを採用したいけど、いちいち全部試してられないため、ChatGPTにプログラムを作ってもらいました。

image.png
https://chat.openai.com/share/8530ba34-a8ec-4523-b328-43a375a72388

ChatGPTが作成したプログラムをGoogle colabで実行。
試したい値の組み合わせ数によりますが、数十分~1時間ほど正座待機。

image.png

結果↓
image.png

便利すぎる。
息をするようにChatGPTが使える様になってきました。

しかし...!
2年でたった46回のトレード、月に2回もトレードをしない...!
こんなんbotじゃなくてもええやん...!
(企画的にもbot作りました、トレードはありませんでしたじゃ終われない)

ということで、新しい戦略を探すためバックテスト トゥ・ザ フューチャーします。

(再掲)
image.png

やったこと②

  • 先人botterたちの記事を読み漁る。
  • 逆張り系の戦略を作ってみることにする。
  • 逆張り系の指標(RSI, 移動平均線乖離率etc...)でいくつかバックテストを試す。

参考にさせていただいたbotterの方々の記事を少し共有させていただきます。

正直難しい話も多いけど、このアドベントカレンダー含めノウハウを共有し合うbotterの皆さんの文化はスバラシすぎる...

代表的な戦略はこんな感じ
image.png
image.png

色々考えた結果、逆張り戦略を作ることにしました。
マーケットメイク → 高速な取引が必要なため、技術的な障壁が高い
アービトラージ → 高速な取引が必要なため、技術的な障壁が高い
(消去法)

逆張りのテクニカル指標、RSIや移動平均線乖離戦略を試すが、あんまりうまくいきません。

image.png

そんな中、初心に立ち返りブレイクアウト戦略を応用して、ブレイクアウトしない戦略をバックテストしてみました。

image.png

結果↓
image.png

トレード回数も多い、全て成行で取引してもバックテスト上は利益が出ている。
バックテストの期間を変えてグリッドサーチを行い、複数のパターンのパラメータを持つ逆張りbotができた。
これでいく!

5章:botたちの沈黙

(再掲)
image.png

新しい戦略もでき、いよいよ実弾投入...!!

しかしEC2上でエラー続発...
あんなに順調だったのに心が折れそう...

やったこと

  • エラーログの抽出
  • 20001エラーへの対応
  • 404エラーへの対応
  • 104エラーへの対応
  • エラーハンドリング

もうすぐ10,000文字、読むのも疲れると思うので、ここは動画を見てください。

6章:損益発表

(再掲)
image.png

数々のエラーを乗り越え、いよいよ弊botたちの性能を測るときがやってきました。
4ヶ月の集大成!!

やったこと

  • ウォークフォワードテスト
  • 損益を計算!

動かしているbotたち
image.png

損益発表!!!
image.png

image.png

という訳で、むちゃくちゃ損を掘っているbotもありますが最終損益はプラス!
実現損益ベースでは+17,370円!

4ヶ月でC級botterになれました!(相場がよかった)

おわりに

10,000文字超の大作、最後までお読みいただいてありがとうございました。
無事、プログラム未経験でもChatGPTを使えば4ヶ月でbotが作れるようになりました!

最後に、botter道を通じての気づきです。

環境は大事
今回は業務として強制的に開発をする環境をもらいましたが、特に初期、軌道に乗るまではこの環境じゃなかったら挫折してたかもしれません。
慣れない開発も、毎日時間を作ることで昨日やった作業を忘れることもなく、効率よく開発ができました。
業務時間を使わせてくれた会社に感謝!

それと共に、Discordでアドバイスをくれる方たち、イベントで応援してくれる方たち、(もちろんサポートしてくれる社内のメンバーも!)がいたからこそ、最後までモチベーションを落とさず開発を続けることができました。

皆さんに大感謝!みんなで開発しましょう。

相場も開発のモチベーション
今回は開発を進めている10月頃から相場が好転してきました。
相場好転に伴いウォークフォワードテストの結果もよくなり、儲かるかも!という気持ちから開発にさらに熱が入りました。
(この頃から業務関係なく開発をするようにもなりました)

開発を進めるなら今がチャンス!

botは作れるようになりましたが、ChatGPTに頼りすぎ最後までプログラミングは全然わかりませんでした。(for文もif文もワカラナイ)
そんなNew Generation botterとして今後も開発を続けていきたいと思います!

開発は「ビットバンク公式Discordコミュニティビボラボ」でやってます!
よかったらきてね!

image.png
image.png
image.png

あとがき

botter道の裏側

botter道はDiscordもくもく部屋での日々の開発と、全6回のオンラインイベントで行いました。
イベント初回は参加者が150人近くいて、正直震え上がりました。そんなたくさんの人に聞いてもらうような話じゃない...
(ちなみに最終回はしっかり30名程度で着地、最後まで生き残った猛者たちに感謝!)

Discordで毎日もくもく開発をしていましたが、序盤はほとんどビットバンクメンバーからしかコメントがありませんでした。
しかしイベント第4回目あたりを境に、もくもく部屋でコメントしてくれる人が増え始めとても嬉しかったことを覚えています。(もちろん初期からずっとコメントをくれていた方にも感謝です!)

イベントも毎回参加してくれる方たち、コメントをくれる方たちがいてむちゃくちゃ支えになりました。

イベント最終回はみなさんの優しさに甘えて茶番演出にチャレンジ。
参加してくださった方はわかると思いますが、なんとも言えない温かい空気で幕を閉じ、
改めて皆さんのやさしさを感じる最終回となりました。

After botter道

この企画が終わったらbotの開発自分は続けるのだろうか、と少し不安でしたが今のところ企画が終わったあとも精力的に開発を続けられています。

記事を書いてる時点で、追加で13個のbotを開発!

社内でもbotを開発しているエンジニアの方たちから声をかけられることも増えて嬉しい。

今のモチベーションはふたつです。

  1. 相場がよくなる兆しがある、今回のチャンスに乗りたい!
  2. botter道を通して、少しでもbotterになる人が増えると嬉しい!

むちゃくちゃ長文最後までお読みいただきありがとうございました!

69
58
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?