見出し画像

ChatGPTを用いたテクニカル分析①

はじめに

近年、金融市場はますます複雑化し、競争が激化しています。この状況下で、投資家たちは最適な投資判断を行うために様々な手法を試みています。その中で、テクニカル分析は投資家にとって重要な分析手法の一つとなっています。

テクニカル分析は価格データや取引量などの市場データを用いて将来の価格変動を予測しようとするものです。より具体的にはMarketSpeedなどの取引ツールやTrading Viewなどのチャートツールで移動平均線やRSIを表示して、価格分析をしたり、トレンドの転換点を読む分析を指します。

Trading View

ただしこれらのツールでは機能が一部有料であったり、設定できる内容が限られているようなケースが存在します。
一方でプログラミングを使用することで、自由に様々なテクニカル分析機能を実装することが可能となります。

ただ、一からプログラミング言語を学ぶのは障壁が高いといった方も多いのではないでしょうか?
そこで今回は自然言語処理を得意とするChatGPTを用いて自動でプログラムを生成し、どの程度までテクニカル分析ができるかを複数回に分けて検証していきます。

本アカウントについて

本アカウントではChatGPTを経済、株式等に応用する手法を考察、情報共有しています。過去にはファンダメンタルズ分析用にChatGPTを応用する手法、そのデータ収集のためのスクレイピングプログラムを紹介しております。よろしければご参照、アカウントのフォローをいただけますと幸いです。

⚠️注意事項

当アカウント発信の情報に基づいて投資判断を行い、損失が発生した場合でも、当方は一切の責任を負いません。
投資にはリスクが伴うため、投資判断は自己責任でお願い致します。
本記事は特定の商品の勧誘や売買の推奨等を目的としたものではありません

検証①:チャートを表示させてみる

プログラムの要件を説明しコード生成

まず、ChatGPTにプログラムの要件を説明します。
今回の目的は、ビットコインのテクニカル分析を行うプログラムを作成することです。分析には移動平均線 (SMA: Simple Moving Average) とRSI (Relative Strength Index) を使用し、過去のデータからシグナルを生成します。

下記の仕様に基づいたPythonスクリプトを作成してください
・日単位のBTCの価格データをYahoo Financeから入手し、csv形式で保存
・csvファイルを読み込み、価格トレンドと移動平均線、RSIをグラフ化

ChatGPTを使用して生成されたPythonコードの例を以下に示します。


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf

def fetch_data():
    btc = yf.Ticker("BTC-USD")
    df = btc.history(period="max", interval="1d")
    df.to_csv("btc_price_data.csv")

def compute_rsi(data, window=14):
    delta = data.diff().dropna()
    gain = delta.where(delta > 0, 0)
    loss = -delta.where(delta < 0, 0)

    avg_gain = gain.rolling(window=window).mean()
    avg_loss = loss.rolling(window=window).mean()

    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))

    return rsi

def plot_data():
    df = pd.read_csv("btc_price_data.csv", index_col="Date", parse_dates=True)
    df["SMA_50"] = df["Close"].rolling(window=50).mean()
    df["SMA_200"] = df["Close"].rolling(window=200).mean()
    df["RSI"] = compute_rsi(df["Close"])

    fig, (ax1, ax2) = plt.subplots(2, figsize=(12, 8), sharex=True)
    ax1.plot(df.index, df["Close"], label="Price")
    ax1.plot(df.index, df["SMA_50"], label="50-day SMA")
    ax1.plot(df.index, df["SMA_200"], label="200-day SMA")
    ax1.set_ylabel("Price")
    ax1.legend()

    ax2.plot(df.index, df["RSI"], label="RSI")
    ax2.axhline(30, linestyle="--", color="gray")
    ax2.axhline(70, linestyle="--", color="gray")
    ax2.set_ylabel("RSI")
    ax2.legend()

    plt.show()

if __name__ == "__main__":
    fetch_data()
    plot_data()


プログラムの実行

私自身、ChatGPTがどこまでまともにプログラムを書けるのか半信半疑でしたが、特になんの問題もなく動作しました。下記が実行結果です。

専門知識なく、やりたいことがプログラムに実装できるので、将来AIによってプログラマーが将来沙汰されるかもしれないと言われるだけのことはあります

また、今回仕様に移動平均を取る日数などを入れていなかったため、ChatGPTがテキトウな値を設定してくれているようです。

プログラムの改良

先程のプログラムの実行結果には下記の問題点が見つかりました。

  • グラフの表示期間が長過ぎる

  • 移動平均、RSIの期間がテキトウな値になっている

この問題点もChatGPTに伝えて修正してもらいましょう

先程作成したプログラムを下記2点修正してください。
修正箇所のみ関数単位で回答してください
・プロットするデータは過去1年間に限定してください
・移動平均線の単位は25、75日としてください

def fetch_data():
    btc = yf.Ticker("BTC-USD")
    df = btc.history(period="1y", interval="1d")
    df.to_csv("btc_price_data.csv")

def plot_data():
    df = pd.read_csv("btc_price_data.csv", index_col="Date", parse_dates=True)
    df["SMA_25"] = df["Close"].rolling(window=25).mean()
    df["SMA_75"] = df["Close"].rolling(window=75).mean()
    df["RSI"] = compute_rsi(df["Close"])

    fig, (ax1, ax2) = plt.subplots(2, figsize=(12, 8), sharex=True)
    ax1.plot(df.index, df["Close"], label="Price")
    ax1.plot(df.index, df["SMA_25"], label="25-day SMA")
    ax1.plot(df.index, df["SMA_75"], label="75-day SMA")
    ax1.set_ylabel("Price")
    ax1.legend()

    ax2.plot(df.index, df["RSI"], label="RSI")
    ax2.axhline(30, linestyle="--", color="gray")
    ax2.axhline(70, linestyle="--", color="gray")
    ax2.set_ylabel("RSI")
    ax2.legend()

    plt.show()

より見やすく修正することができました。

検証②:ゴールデンクロスを用いた売買をシミュレートしてもらう

今回はまず、簡単な例でゴールデンクロス、デッドクロスを計算し、売買をシミュレートし、利益推移をグラフ化してもらう機能を追加します。
質問としては下記のような形でChatGPTにインプットしました。

上記作成プログラムをベースに下記機能を実装してください
・計算した移動平均線をもとにゴールデンクロスで買い、デッドクロスで売りをした際の利益推移をグラフに追加
・初期資産は20000ドルとします

プログラム実行結果

def backtest_strategy(df, initial_balance=20000):
    balance = initial_balance
    holding = 0
    buy_price = 0
    profit_history = []

    for index, row in df.iterrows():
        if row["SMA_25"] > row["SMA_75"] and holding == 0:
            # Buy at the close price
            holding = balance / row["Close"]
            balance = 0
            buy_price = row["Close"]

        if row["SMA_25"] < row["SMA_75"] and holding > 0:
            # Sell at the close price
            balance = holding * row["Close"]
            holding = 0

        current_value = balance + (holding * row["Close"])
        profit_history.append(current_value - initial_balance)

    return profit_history

def plot_data():
    df = pd.read_csv("btc_price_data.csv", index_col="Date", parse_dates=True)
    df["SMA_25"] = df["Close"].rolling(window=25).mean()
    df["SMA_75"] = df["Close"].rolling(window=75).mean()
    df["RSI"] = compute_rsi(df["Close"])
    df["Profit"] = backtest_strategy(df)

    fig, (ax1, ax2, ax3) = plt.subplots(3, figsize=(12, 12), sharex=True)
    ax1.plot(df.index, df["Close"], label="Price")
    ax1.plot(df.index, df["SMA_25"], label="25-day SMA")
    ax1.plot(df.index, df["SMA_75"], label="75-day SMA")
    ax1.set_ylabel("Price")
    ax1.legend()

    ax2.plot(df.index, df["RSI"], label="RSI")
    ax2.axhline(30, linestyle="--", color="gray")
    ax2.axhline(70, linestyle="--", color="gray")
    ax2.set_ylabel("RSI")
    ax2.legend()

    ax3.plot(df.index, df["Profit"], label="Profit", color="green")
    ax3.axhline(0, linestyle="--", color="gray")
    ax3.set_ylabel("Profit")
    ax3.legend()

    plt.show()

損切り等入れていないシンプルなストラテジーのため、結果はマイナスであるものの、こちらもバグなく動いています。恐るべし。

プログラムの改良①:売買タイミングの把握

こちらのストラテジーを考察・修正するために、まずどのタイミングで売買があったかを表示してもらいましょう。

利益推移に売買したタイミングをわかるように示してほしい

下の利益推移のプロットに売買タイミングが表示されるようになりました。

プログラムの改良②:損切りの追加

先程の結果を確認すると、2022年8~9月頃にゴールデンクロスを迎えたものの、下落トレンドがその後続き損失を出してしまっています。
まずは、損切り機能を実装し、損失の抑制を図ってみます。

購入判断を下記の通り修正します
・初期資産は20000ドル
・計算した移動平均線をもとにゴールデンクロスで買い、デッドクロスで売りをした際の利益推移をグラフに追加
・ゴールデンクロス1回につき、購入は1度まで。
・購入時より価格が10%以上下落した場合、損切り決済を行う

上記が実行結果ですが、売買が1度のみしか行われなくなてしまいました。
2度目のゴールデンクロスに反応できるように、問題点を指摘して修正を試みてみます。

あなたが示したプログラムでは、2回目のゴールデンクロスが来た際に、購入判断がおきないという問題点があります。 上記問題点を修正してください

一度では治らず、何度か、間違っています。再度修正してくださいを繰り返しましたが、まともな挙動を示すようになりました。

まとめ

本記事ではOpenAIが開発したChatGPTを用いて、ビットコインのテクニカル分析を行うプログラムを作成し、その結果を検証しました。

結果として、ゴールデンクロスに基づいた取引デモを、チャット上のやり取りだけで実装可能であることが確認できました。

このように、ChatGPTを用いればプログラミングの知識なくとも、アイデアさえあれば、新たな分析、売買プログラムを実装することが可能になりそうです。
特に今回、プログラミングでのテクニカル分析環境を作成しましたが、これを用いることで、売買シグナル設定の最適化、損切りポイントの最適化、ファンダメンタルズ分析や深層学習と組み合わせた手法など開発にも応用ができると考えています。

そのコードすら、ChatGPTなどのAIツールが書いてくれるかもしれません。

最後に、本記事が、AIを活用したテクニカル分析の第一歩として、読者の皆様にとって有益な情報となることを願っています。


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?