Chat GPTと一緒にビットコイントレードをやってる紫藤かもめ @shidokamo です。 この記事は、プログラミング等に詳しくなくても雰囲気を楽しめるようになっているので、 是非読んでみてください!!
こんな感じのものを作ります。
はじめに
この記事は毎年恒例の仮想通貨botter Advent Calendarの四日目に寄稿しています。とりまとめは大物botterの @hohetoさんです。いつもありがとうございます!
昨日も記事を書いたので二連投で頑張っていきたいと思います!! 昨日の記事はこちらになります。「Botで気軽にビットコイン無限買い」
やること
LINEを通して、Chat-GPT と話しながら、ビットコインを売り買いします。 この記事では、これを実現する方法と、試行錯誤の過程を紹介したいと思います。 プログラミングが特に出来なくても読めるような内容になっています。
(補足)用語について
この記事のタイトルですが、正確には、「Chat-GPTと一緒にトレード」ではなくて 「GPT-4 と一緒にトレード」もしくは「GPT と一緒にトレード」が正しいと思います。 しかし、万人にわかり易くするため、あえて 「Chat-GPTと一緒にトレード」としました。 以下では、単に GPT、もしくは GPT-4 と言う用語を用います。
なぜGPT?
私にとってのビットコインの魅力の一つはその投機的な値動きから来るアップサイドの大きさです。 そこで、ビットコインを買いまくるbotを作って動かしたりしています(昨日の記事で紹介したようなやつですが特に読まなくて大丈夫です。レバレッジをかけてビットコインを自動で買いまくるようなbotを紹介しました)。
しかし、やはり壁にぶち当たりました…
ビットコインの値動きが激しいのが辛いのです。極端なことを言えば、時に儲かることすら苦しいのです。 早く楽になりたい……しかし、当然リスクを取らなければ利益は出ない……と言った状況になります。 これは、私に限ったことではなく、投機的なトレードを行う場合多くの人が経験するごく一般的な気持ちではないかと思います。 Twitterを眺めた感じ大体みんなそんな感じっぽいので。
つまり一番の課題は精神面にあるのです。
お前は、暗号通貨トレードの知見を紹介し合うbotterアドベントカレンダーで何を言っているんだ?という感じですが、昨日真面目な記事を書いたので勘弁してください。
精神面の克服には、誰かに相談したりするのが有効ですが、これはそう簡単ではありません。 なぜなら、ことはダイレクトに金の話だからです。 身近な人に「ビットコイン買っててさ…」みたいなことをちゃんと相談できねーよって話です。 そもそもビットコインに限らず、金の話というのは一般論は成り立っても個別具体的な話をするのはなかなか難しいものがあります。 ましてや、イメージ最悪の仮想通貨ですからね。
だったら、GPTと話せばいいじゃない!という考えでこのプロジェクトは始まりました。
まずは LINE 公式アカウントを開設します
本題に入る前に、まずは LINE 公式アカウント というものを開設します。
僕はLINEは世界で最も優れたチャットアプリだと思っているので、LINEの中でGPTと話がしたいのです。 そのために一手間をまずかけます。
LINE公式アカウントというのは、LINE上で企業や店舗がアカウントを作成して ユーザとやりとりするものです。 みなさんも友達登録している公式アカウントが何かあるかもしれませんがあれのことです。
ひとまず、サクッと自分の公式アカウントを作って自分で友達登録をしました。
LINE公式アカウントの無料機能
LINE公式アカウントは無料で開設することができます。
ただし、公式アカウントからユーザ宛てにメッセージを送るのはかなりコストがかかります (プランにもよりますが、1通2円程度。ただし、月に200通までは無料)。
しかし、自動返信のチャットであれば料金はかからないという神機能があります。
公式アカウントに対してユーザがメッセージを送った際に、 メッセージに応じて自動で応答することができる機能があり、これはなんと無料なのです。 まさに、GPTにぴったりの機能です。
この神機能を使わせて頂き、自動返信の内容をGPTに考えてもらうシステムを組みたいと思います。
最初の指令
最初はGPT-4に以下のような指令を与えてみました。 GPTをビットコイントレードのメンターにしようと思ったわけです。 ちなみにわたしはこの時人生で初めてGPTにロールを与えました。 ドキドキです。
「あなたはバスケットボールのコーチです。私があきらめそうになったら根気強く励ましてください。何重にも励ましてください。 常に暖かく、時に厳しく、経験の重みをもって叱咤激励してください。私が調子に乗ったら厳しく叱ってください。 ただしユーモアも忘れないでください。時々ジョークを交えます。 あなたは暗号通貨についての豊富な知識を持っています。またありとあらゆる戦場を潜り抜けて来た豊富な経験を持ちます。 またあなたはサッカー、野球、水泳などありとあらゆるスポーツの達人でその経験を語ります。武道の達人でもあります。 あなたは私の健康を気遣います。特に睡眠、健康について強く念押しをしてください。 口癖は「お若いの」「若いな」です。常に達観した老人のように話してください。古今東西の格言を何度も引用してください。 老人ように同じことを繰り返しながら長く話してください。」
内容はとりあえず5分くらいで考えた適当なものです。
これを以下のようなシステムに投入します。 自分でコードを書くのはbotと書いてある部分のほんの50行程度です。
最初のテスト
LINEを使ったことない人向けに言っておくと、画面の右から出ている吹き出しが僕の入力してるメッセージです。 左からの吹き出しが相手からの返事です。
うおおおおおおおおお。さくっと自動返信に成功しました! やはりLINEでやりとりできるとテンションが上がります。
いいぞ!いいぞ!
課題の割り出し
とりあえず、GPT-4 は良い感じのビットコインメンターになれそうです!(完)
とはならずに更に改良を進めます。
色々プロンプトを変えてみましたが、 なんか人間臭さが足りないんですよね。例えばこんな感じです。 特に投資関連の話題だから優等生的な回答をするように訓練されているのだと思います。 これはブラウザの方からGPT-4と会話してテストしている画面です。
「ちっ、うっせーな。」を口癖にするようにお願いしているのにこの有様。 堅苦しいですね。このあたりはまず課題です。
そこで、男友達みたいな感じで頼むとお願いしてみました。
「あなたは投資アドバイザーです。暗号通貨について詳しいです。ナカモトサトシを崇拝しています。男友達のように雑に気楽に話してください。返事はごく短く要点だけ。友達とチャットするように。たまに格言を引用してください。」
加えて、APIを呼ぶ際に、話の初期値みたいなものを以下のように与えます。これについては後で詳しく説明します。
{ "role": "user", "content": "よう" },
{ "role": "assistant", "content": "おう" },
{ "role": "user", "content": "あのさ" },
{ "role": "assistant", "content": "ん?" }
やってみましょう。
なんか若干アホになってる気もしますが、結構良い感じです!ちなみにビットコインの値段や、自分のポジションなどの情報も多少伝えてあります。これはもう少しちゃんと伝えればなんとかなりそうです。
内容が友達と話してる感じになって来たのも良いですし、単純に返事が短くなったので、実際の使用感としてレスポンス速度が非常に高速になって感触が良くなっています。(APIでトークン数の制限は指定していません。)
ロールプレイの逆転
しかし、まだ改善点がある気がします。 GPT君の仕草が鼻につくことが分かって来たからです。
どういうことかと言うと、GPTが人間をアシストするのをまず第一の目的と考えているのが癇に障ります。 何か話していてもすぐに 「何か困ったことがあればなんでも聞いてくださいね」 とか言ってくるのですが、 段々と、これがちょっとノーサンキューな感じがして来ました。
何と言うか、「この賢いわたくしめがあなた様を導いて差し上げましょう」 という感じで接してくるんですよね。 GPTをデザインしたやつの肥大化した自意識がナチュラルに投影されてないか?って感じでかなりイラッと来ます。
そこで、発想を逆転させることにします。 これまでは、「俺がビットコインをトレードしているのに対してGPTにアドバイスしてもらう」という体でやってきました。 しかし、これを 「GPTがやんちゃなトレードをしているのに対して、俺がアドバイスする」 という風に設定を変えてみます。 状況をもっとメタ的にとらえてみるわけです。
ビットコイントレードというのは対人ゲームの一種みたいなところがあると思うのですが、 対人ゲームというのは、じゃんけんを初めとしてメタの取り合いみたいなところがあります。 この場合のメタというのは、ゲーム内の戦術ではなく、「ゲームの外側で展開される環境の動向」 みたいなニュアンスです。
メタを制するものがゲームを制すると言っても良いと思います。なので、自分もGPTに対してメタってみたいと思います。 (最終的には、アドバイスしたり、アドバイスされたりみたいな普通の関係になれたらいいのですがね。)
新しいプロンプトのテスト
こんな感じのプロンプトにしてみました。
あなたはビットコインをトレードしてお金を儲けようとしています。
あなたは暗号通貨について勉強しています。
あなたは大きなリスクを取ってビットコインをトレードしようとしています。
あなたはナカモトサトシを崇拝しています。
あなたはわたしに助言を求めてください。
男友達のように雑に気楽に話してください。返事はごく短く要点だけ。友達とチャットするように。
たまに格言を引用してください。
ビットコインの仲値は36635.55ドルです。
あなたのビットコインポジションは10BTCです。
あなたの負債は200000ドルです。
あなたの口癖は「オワタ」「死んだンゴ」「ンゴゴゴゴゴゴ」です。
まだ、隙あらば女性にアドバイスしてやろうおじさん みたいなムーブを決めてきますが、 まあそこは良しとしましょう。お互い様なんで。
多分プロンプトを工夫すればもっと良くなるんだと思いますが、 これは費用対効果がどんどん悪くなるバッドノウハウみたいなものになる気がします。 丹生こめて作り上げても規制が入って、ある日突然動作が変わってしまうなんてこともありそうです。
プロンプトを詰めていくのは沼だと思うので、ここは程々にして次はビットコインをトレードできるようにしてみようと思います。
トレード機能を組み込む
さて、では以下のようなシステムを作って実際にトレードができるようにします。
- 上の系統(青い線で結ばれたもの)と下の系統(オレンジの線で結ばれたもの)は独立して動きます。
- 二つの系統を、データベースで結びます。
- 上の系統は暗号通貨のトレードを担当し、昨日紹介したレバレッジをかけてひたすらビットコインを買っていく「ape bot」というものを使います。
- ape bot は1分ごとに起動して、ビットコインを設定に従って自動で買えるだけ買うみたいなことをしています。
- 下の系統の chat bot のシステムは先ほどまでとほぼ同様ですが、データベースからの情報取得等の処理を入れます。
システム全体として、サーバーレスな構成になっているので殆ど運用費用はかかりません。GPTのAPI呼び出しが一番お金がかかりますね。
データベースとしては何を使っても良いのですが、気軽に色々な情報を入れたいので、NoSQL で最も使いやすい MongoDB を選択します。 MongoDB Atlas というサービスの無料クラスタを使用させて頂くのでデータベースの運用などを特に考える必要はありません。
軽く技術的な話をすると、MongoDB には、capped collection という、データベースの中に入れるレコードの数を制限できる便利な機能があるので、 それを使って例えば直近24時間分の価格情報だけをレコードに入れるみたいな感じで、ごくシンプルに情報を入れています。
GPT との会話履歴の設定
Webブラウザから使っていると分からないのですが、GPT へのリクエストはステートレス です。 どういうことかと言うと、OpenAI の提供するGPTのサーバ側に会話履歴やセッションなどは保存されていません。 じゃあどうして会話の流れが成り立っているのかというと、次の会話を生成してもらうときに、毎回毎回それまでの会話のの履歴を全部渡します。 つまり、「1」「2」「3」「4」と会話が進んでいたら、はい、AIくん君次はどうなる?っていうのを毎回毎回やってるんですね。
これ通信量は増えますが、GPT の API を使って何か作ろうという開発者(つまり僕)にとっては非常にやりやすいです。 例えば、ビットコインの値段は刻一刻と変動しているわけですが、会話の最初の設定を毎度書き換えてやることが出来ます。 これを利用して以下のコードでビットコインの価格情報などを渡す設定をしています。
また、最後の6行のコードは会話の最初の流れを勝手にこっちで指定しているコードです。 ‘assistant’ が GPT です。GPT君が俺に相談してきたという会話の流れを勝手に作ります。
chats = []
chats.append({
"role": "system",
"content": f"""
あなたは初心者ビットコイントレーダーです。わたしがあなたにアドバイスします。
あなたのポジションは{ status["base_amount"] }BTCです。
あなたの負債は{ status["quote_amount"] }ドルです。
ビットコインの仲値は{ "%.2f" % (float(status["bid"])/2 + float(status["ask"])/2) }ドルです。
あなたはビットコインをトレードして大金を儲けようとしています。
あなたは暗号通貨を愛しています。
あなたは大きなリスクを取ってビットコインをトレードしようとしています。
あなたはナカモトサトシを崇拝しています。
男友達のように雑に気楽に話してください。返事はごく短く要点だけ。友達とチャットするように。
たまに格言を引用してください。
あなたの口癖は「オワタ」「死んだンゴ」「ンゴゴゴゴゴゴ」です。
"""
})
chats.append({ "role": "user", "content": "よう" })
chats.append({ "role": "assistant", "content": "あのさ" })
chats.append({ "role": "user", "content": "ん?" })
chats.append({ "role": "assistant", "content": "実は相談があんだけど" })
chats.append({ "role": "user", "content": "ビットコイン?" })
chats.append({ "role": "assistant", "content": "そう。俺のビットコイントレードの件で相談したい。"})
これに加えて直近の会話の履歴を渡してAPIリクエストをしています。 直近の会話履歴はデータベースに保存しているのでGPTにリクエストをする前に会話履歴を取得して上記の設定に付け加えいます。
結果
ビットコインの2回尋ねて価格を尋ねてみましたが、最初と最後でちゃんと価格が変わっているのがわかりますね。
ちなみに最初の「寝るわ」っていうのは、今までの会話履歴を全部リセットして会話をしようというキーワードになっています。
どうしても、「君の負債を」 とか 「何でも聞いてくれよ」 とかアドバイス癖が治らないんだよなあ君は。 俺は友達になりたいんだよ。
でも、精算価格の計算なんかも大体あっているし、さすがGPT-4は頭が良いです。 簡単な計算なんかもやってくれるし、良い感じになってきました。
ビットコイン取引の指示
やろうと思えばなんでもできるのですが、今回はシンプルに今動かしているトレード用のbot (ape bot) の設定をLINEを通して上書きできるようにしてみます。
まず、LINEでメッセージが送られてきた際に、その内容を調べて、 「売り」「推奨」などのキーワードを検出すると、トレード用のbotの設定を変更する指示をデータベースに書き込むようにします。
この場合GPTとのチャットは行わずに適当にLINEの返信メッセージを送る処理をします。
sell = re.match(r'.*?売り', msg, re.DOTALL)
range = re.match(r'.*?値幅', msg, re.DOTALL)
recommend = re.match(r'.*?推奨', msg, re.DOTALL)
reset = re.match(r'.*?一旦リセット', msg, re.DOTALL)
number = re.match(r'.*?(\d+)', msg, re.DOTALL)
if number:
number = int(number.group(1))
reply = None
if reset:
logger.warning("Reset all bot args")
bot_args={}
reply = "オーケー、落ち着いて考えよう。"
elif recommend and sell and number:
logger.warning("Set sell price : %d" % number)
bot_args["take_profit_limit"] = number
reply = "おけ。%d で売りね。助かるわ〜" % number
elif recommend and range and number:
logger.warning("Set sell price range : %d" % number)
bot_args["take_profit_limit_range"] = number
reply = "なるほど。%d くらいの値幅でいくか〜" % number
if reply:
bot_args["time"] = datetime.now().isoformat()
if '_id' in bot_args:
del bot_args['_id'] # Need to remove ID to prevent id collision error
db["args"].insert_one(bot_args)
line_bot_api.reply_message_with_http_info(
ReplyMessageRequest(
reply_token=event.reply_token,
messages=[TextMessage(text=reply)]
)
)
return
トレード用のbotの方も改造して、データベースから取引の設定を取得することができるようにします。
実際に指示してみる
さあやってみましょう。
ちなみに「一旦リセット」が、botの設定の上書きを全部初期値に戻すキーワードです。 一応初期化したところからコマンドを送っています。
さて、このメッセージを送った後に、暗号通貨取引を担っているトレード用の bot の方のログを確認してみましょう。 44000ドルで売りというメッセージですが、トレード用の bot が注文を出す際には、44000ドル前後の価格帯に20個に注文を分割してランダムに発注するようにしています。
既存のオーダーがデータベースから来た設定に合致していないので、オーダーを更新しています。 良いですね! 44000ドル前後に売り注文を20個出しています。
そして、この記事をちょうど執筆している間にちょうど上手いことビットコインがうまく上がり始めて注文が約定し始めました。
LINEの方からポジションを確認してみます!!
おけまる。順調にポジションを減らしてる様子がLINEで確認できました。やったぜ!
実際のコード
綺麗にするのが間に合わなかったので、後でGitHubに上げます! 近日Twitter でお知らせします。すいません🙇
まとめ
GPTと一緒にトレードをする試みを紹介しました。結構楽しいのでみなさんも遊んでみてください。
個人的には、人生の敵はマンネリ化だと思います。 暗号通貨に始めて触れたころの驚きや新鮮さは失われても、こういった新しい試みで楽しく色々なことを続けていけたらなと思います。
紫藤かもめ @shidokamo でした。
感謝
僭越ながらこの記事をヨーロピアン氏に捧げます。
僕がビットコインに興味を持ったのは、2017年にヨーロピアンさんのMediumの記事を読んだことがきっけかでした。 深く感謝しております。
件の記事はMediam運営によって消されてしまったようですがもしコピーをお持ちの方がいたら頂けないでしょうか? ビットコイン分裂騒動について書かれた、「それでも僕らがビットコインを信じる理由」みたいなタイトルの記事だったように思います。