ChatGPTに自動売買ツールを作ってもらいました【pythonプログラミング】

ChatGPTは、プログラムを書くことができるというのを聞いたことが無いでしょうか?

ChatGPTにどんなプログラムを作ってほしいかを頼むだけでプログラムを書いてくれるのであれば、プログラミングができない人でもプログラムの作成が可能になります。

プログラミングが得意な人であっても、自分の手を空けることができるので、ChatGPTが非常に便利で強力なツールになることは間違いないです。

プログラマーが必要なくなるかも

今回はChatGPTでpythonプログラミングを試して、私自身でも作ったことのある仮想通貨の自動売買ツールの作成をChatGPTに作ってもらったら、一体どんなプログラムを作成してくれるのかをレビューしてみました。

もくじ

ChatGPTでプログラミングとは?

ChatGPTでプログラミングと聞いても、チャットするためのAIなのにどのようにプログラミングをするのかと不思議に思うかもしれません。

実際、私自身もチャットAIでプログラミングのイメージが付きませんでした。

ではChatGPTでプログラミングを行う方法を解説していきます。

プログラミングの方法は?

ChatGPTはチャットAIなので、どのようなプログラムを書いてほしいかをチャットで送れば、その通りのプログラムを書いて返してくれます。

では簡単なプログラムの作成をChatGPTにいくつか頼んでみましょう。

私が作った自動売買ツールはPythonで作りましたので、ChatGPTにもPythonでプログラミングをするように依頼を行います。

 実際にプログラムを動かすにはpythonと、今回であればVScodeのインストールが必要なので、こちらの記事も参考にしてみてください。

文字を表示するプログラム

まずはプログラミングの基本である、文字(Hello World)を画面に表示するプログラムをChatGPTに依頼してみました。

chatgptの画面で「HelloWorld」と表示するpythonプログラムを書くように指示した画面

「Hello World」と表示するプログラムをpythonで書いてくれました。どの教科書でも紹介されるようにprintを使用して文字列を表示させています。

print("Hello World")

実際にVScodeでこのプログラムを実行した結果がこちらです。

文字を表示するだけですが、AIが作成したプログラムによって動いたものだと考えると少しロマンを感じませんか?

そのうち自らを書き換えて進化していくプログラムが生まれるかも?

入力された数字によって違う文字を出すプログラム

次は少し複雑な処理のプログラムを依頼してみます。

入力された数字によって、表示する文字を変えるプログラムをお願いしてみました。

chatgptにpythonプログラムの作成を依頼した画面

1を入力したらA、2を入力したらB、3を入力したらCをそれ以外の場合はXを出すpythonプログラムを書いてくれました。

しかも「数字を入力してください」という、入力をする人に向けての説明付きで作成しているところが驚きです。

number = int(input("数字を入力してください: "))

if number == 1:
    print("A")
elif number == 2:
    print("B")
elif number == 3:
    print("C")
else:
    print("X")

全てif~else文で作成しています。

pythonですと辞書型(dictionary)を使用して複数の条件分岐のプログラムを書くこともできますが、この程度の条件であればif文で作成した方が分かりやすいですね。

実際に実行するとこんな感じです。

プログラムの実行画面
プログラムの実行画面

指定した通り1を入れると「A」が表示され、1~3以外の5を入力したら「X」が表示されました。

正しく動作しています。

結論 ChatGPTでプログラミングはできた。

簡単なプログラムの作成でしたがChatGPTでプログラミングを行うことができ、実際にそのプログラムが動くことも確認できました。

チャットAIに対してプログラミングの依頼を行うため、正しく依頼をしないと思っていたものと違うプログラムになってしまうかもしれません。

人に伝えるときのように、わかりやすく明確に指示を行う必要があるかと思います

ChatGPTにpythonで自動売買ツールを作ってもらうと?

簡単なプログラムでしたが、ChatGPTがプログラミングを行えることが確認できたので、今度は本題の仮想通貨の自動売買ツールの作成をお願いしてみます。

もしこれで作れたら今までの苦労は…

ChatGPTが書いたプログラム公開

ChatGPTには以下のようにお願いしてみました。

chatgptに自動売買ツールの作成を依頼した画面

ChatGPTにお願いした結果、作られたのがこのプログラムです。

import time
import ccxt

# ビットバンクのAPIキーとシークレットを設定
api_key = 'your_api_key'
secret = 'your_secret_key'

# ビットバンクのAPIクライアントを作成
bitbank = ccxt.bitbank({
    'apiKey': api_key,
    'secret': secret,
})

# 取引所の情報を取得
exchange_info = bitbank.fetch_exchange_info()
symbol = 'BTC/JPY'  # 取引する通貨ペア

# 初期設定
buy_quantity = 0.01  # 購入数量
sell_quantity = 0.01  # 売却数量
profit_threshold = 0.05  # 利益閾値(5%)
stop_loss_threshold = 0.03  # 損失制限(3%)

while True:
    try:
        # 現在の価格を取得
        ticker = bitbank.fetch_ticker(symbol)
        current_price = ticker['last']

        # ポジションを取得
        positions = bitbank.private_get_user_spot_positions()

        if positions:
            # ポジションがある場合、利益と損失を計算
            position = positions[0]
            entry_price = float(position['avg_price'])
            unrealized_profit = (current_price - entry_price) / entry_price

            # 損失制限を超えた場合、ポジションを売却
            if unrealized_profit <= -stop_loss_threshold:
                bitbank.create_market_sell_order(symbol, sell_quantity)

            # 利益閾値を超えた場合、ポジションを売却
            elif unrealized_profit >= profit_threshold:
                bitbank.create_market_sell_order(symbol, sell_quantity)

        else:
            # ポジションがない場合、購入
            bitbank.create_market_buy_order(symbol, buy_quantity)

        time.sleep(60)  # 60秒待機してループを繰り返す

    except Exception as e:
        print('An error occurred:', e)
        time.sleep(60)  # エラーが発生した場合も60秒待機してループを繰り返す

なんかそれっぽいプログラムが出来上がりました。

まずCCXTライブラリを使用しているのが「import ccxt」からわかります。

これは様々な仮想通貨取引所とのAPIのやり取りを簡単にしてくれるライブラリで、これを使うことにより取引所ごとに存在するAPIの面倒な処理を自分で書かなくても済みます。

ここからはプログラムが動作するかよりも、ChatGPTが書いたプログラムはどのようなトレードルールになっているかを中心に見ていきます。

この記事で紹介しているのが、私が書いた自動売買ツールのプログラムです。

ChatGPTが書いた自動売買ツールのトレードルール

トレードのルールに関係するのはこの部分になります。

# 初期設定
buy_quantity = 0.01  # 購入数量
sell_quantity = 0.01  # 売却数量
profit_threshold = 0.05  # 利益閾値(5%)
stop_loss_threshold = 0.03  # 損失制限(3%)

while True:
    try:
        # 現在の価格を取得
        ticker = bitbank.fetch_ticker(symbol)
        current_price = ticker['last']

        # ポジションを取得
        positions = bitbank.private_get_user_spot_positions()

        if positions:
            # ポジションがある場合、利益と損失を計算
            position = positions[0]
            entry_price = float(position['avg_price'])
            unrealized_profit = (current_price - entry_price) / entry_price

            # 損失制限を超えた場合、ポジションを売却
            if unrealized_profit <= -stop_loss_threshold:
                bitbank.create_market_sell_order(symbol, sell_quantity)

            # 利益閾値を超えた場合、ポジションを売却
            elif unrealized_profit >= profit_threshold:
                bitbank.create_market_sell_order(symbol, sell_quantity)

        else:
            # ポジションがない場合、購入
            bitbank.create_market_buy_order(symbol, buy_quantity)
     time.sleep(60)  # 60秒待機してループを繰り返す

このプログラムのトレードルールをまとめると以下の通りです。

トレードルールのまとめ
  • ビットコインを持っていなければ無条件で購入
  • 60秒ごとに現在の価格と購入金額を比較する
  • 現在の価格と購入金額を比べて5%の利益が出たら利益確定
  • 現在の価格と購入金額を比べて3%の損失が出たら損切り

もう少し詳しく見てみましょう。

初期設定

buy_quantity = 0.01  # 購入数量
sell_quantity = 0.01  # 売却数量
profit_threshold = 0.05  # 利益閾値(5%)
stop_loss_threshold = 0.03  # 損失制限(3%)

購入数量と売却する際の閾値(しきい値)が設定されています。

購入数量と売却数量は一致していないとトレード中に数が合わないということになりますので、両方とも0.01BTCに設定されているのはGOODですね。

利益閾値とする数字は5%に設定されており、もう少し先のプログラムを見るとわかるのですが、現在の価格が購入金額に対して5%の利益が出た場合に売却とされています。

損失制限はいわゆる「損切り」のタイミングで、現在の価格が購入金額に対して3%の損失が出た場合には損切することになっています。

個人的には損切タイミングはもう少し遅くてもいいかも。

現在の価格を取得

 ticker = bitbank.fetch_ticker(symbol)
 current_price = ticker['last']

正確に取得できるか検証はしていませんが、プログラムを見るとローソク足の終値(last)を取得しているようです。

「symbol」は「BTC/JPY」とプログラムの上部で設定されていますので、ビットコインと日本円の価格情報を取得していることがわかります。

ポジションを取得

positions = bitbank.private_get_user_spot_positions()

ここがよくわからないポイントです。

FXでは「ポジション」という単語を聞きますが、仮想通貨のトレードでは聞いたことがありません。

「.private_get_user_spot_positions()」という部分を調べても出てこなかったので、もしかしたらプログラミングの間違いの可能性があります。

おそらく仮想通貨を買った状態か否かということだと思います。

ポジションがある場合、利益と損失を計算

if positions:
 position = positions[0]
 entry_price = float(position['avg_price'])
 unrealized_profit = (current_price - entry_price) / entry_price

ポジションが仮想通貨を買って持っている状態の場合の処理です。

ここでも「position[‘avg_price’]」というものがありますが、購入した時の金額と考えるとプログラムが読めてきます。

購入した時の金額(entry_price)と現在の価格(current_price)を計算して損益を計算して「unrealized_profit」に入れています。

売却処理

# 損失制限を超えた場合、ポジションを売却
if unrealized_profit <= -stop_loss_threshold:
   bitbank.create_market_sell_order(symbol, sell_quantity)
# 利益閾値を超えた場合、ポジションを売却
elif unrealized_profit >= profit_threshold:
   bitbank.create_market_sell_order(symbol, sell_quantity)

先ほど計算して出した値(unrealized_profit)が、あらかじめ設定していた損失制限と利益閾値を超えた場合には売却を行う処理になっています。

+5%以上か-3%以下の場合に売却を行う処理となっており、2%などのその間の数値の場合には何もしません。

購入処理

 # ポジションがない場合、購入
 bitbank.create_market_buy_order(symbol, buy_quantity)

ポジションが無い(仮想通貨を買っていない)場合には、無条件で購入を行います。

1分待機

time.sleep(60)  # 60秒待機してループを繰り返す

これまでの処理を60秒(1分)間隔で行うため、ここで60秒プログラムが待機します。

そのためこのプログラムは60秒間隔で現在の価格を取得し、購入した時の金額と比較して売却タイミングを図るプログラムだということがわかります。

ChatGPTの書いた自動売買ツールは儲かりそう?

確実に儲からないです。

このプログラムの最大のリスクは購入タイミングを判断していないという点です。

買うタイミングは判断せず、買った金額よりも上がったら売るというプログラムなので、ビットコインの金額が上昇し続けている時であれば利益は出せますが、いずれ価格が下がるタイミングで高値掴みをして損切で大損パターンです。

しかも、ビットコインの価格が下がり続けている場合には、購入タイミングを判断しないでビットコインをもっていなければ無条件で購入するため損切してもまたすぐに購入し、また損切をするということを行い続けることになります。

ただ資産を減らしていく恐怖のループが発生します。

仮想通貨の自動売買ツールを自分で作った経験からすると、売るタイミングよりも買うタイミングのほうが大事だと思っているので、ビットコインを持っていなければ無条件で購入してしまうこのプログラムはまず儲からないです。

それをわかっているのか、プログラムを書いたあとにChatGPTからこのようなメッセージも添えてあります。

chatgptが自動売買ツールを作ったときの最後のコメント

しっかりと最後に自分で調整するように注意書きがありました。

興味のある方はChatGPTに骨組みとなるプログラムだけ書いてもらって、肉付けを自分で行うのが良いかと思います。

この記事を書いた人

28歳の男性会社員です。
工場作業員勤務→専門学生→IT企業勤務を経て、現在は小さな会社の工場で品質管理の仕事をしています。

商品のレビュー依頼などは、お問い合わせページからどうぞ。

もくじ