ChatGPTを用いたテクニカル分析①
はじめに
近年、金融市場はますます複雑化し、競争が激化しています。この状況下で、投資家たちは最適な投資判断を行うために様々な手法を試みています。その中で、テクニカル分析は投資家にとって重要な分析手法の一つとなっています。
テクニカル分析は価格データや取引量などの市場データを用いて将来の価格変動を予測しようとするものです。より具体的にはMarketSpeedなどの取引ツールやTrading Viewなどのチャートツールで移動平均線やRSIを表示して、価格分析をしたり、トレンドの転換点を読む分析を指します。
ただしこれらのツールでは機能が一部有料であったり、設定できる内容が限られているようなケースが存在します。
一方でプログラミングを使用することで、自由に様々なテクニカル分析機能を実装することが可能となります。
ただ、一からプログラミング言語を学ぶのは障壁が高いといった方も多いのではないでしょうか?
そこで今回は自然言語処理を得意とするChatGPTを用いて自動でプログラムを生成し、どの程度までテクニカル分析ができるかを複数回に分けて検証していきます。
本アカウントについて
本アカウントではChatGPTを経済、株式等に応用する手法を考察、情報共有しています。過去にはファンダメンタルズ分析用にChatGPTを応用する手法、そのデータ収集のためのスクレイピングプログラムを紹介しております。よろしければご参照、アカウントのフォローをいただけますと幸いです。
⚠️注意事項
当アカウント発信の情報に基づいて投資判断を行い、損失が発生した場合でも、当方は一切の責任を負いません。
投資にはリスクが伴うため、投資判断は自己責任でお願い致します。
本記事は特定の商品の勧誘や売買の推奨等を目的としたものではありません
検証①:チャートを表示させてみる
プログラムの要件を説明しコード生成
まず、ChatGPTにプログラムの要件を説明します。
今回の目的は、ビットコインのテクニカル分析を行うプログラムを作成することです。分析には移動平均線 (SMA: Simple Moving Average) とRSI (Relative Strength Index) を使用し、過去のデータからシグナルを生成します。
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に伝えて修正してもらいましょう
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にインプットしました。
プログラム実行結果
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月頃にゴールデンクロスを迎えたものの、下落トレンドがその後続き損失を出してしまっています。
まずは、損切り機能を実装し、損失の抑制を図ってみます。
上記が実行結果ですが、売買が1度のみしか行われなくなてしまいました。
2度目のゴールデンクロスに反応できるように、問題点を指摘して修正を試みてみます。
一度では治らず、何度か、間違っています。再度修正してくださいを繰り返しましたが、まともな挙動を示すようになりました。
まとめ
本記事ではOpenAIが開発したChatGPTを用いて、ビットコインのテクニカル分析を行うプログラムを作成し、その結果を検証しました。
結果として、ゴールデンクロスに基づいた取引デモを、チャット上のやり取りだけで実装可能であることが確認できました。
このように、ChatGPTを用いればプログラミングの知識なくとも、アイデアさえあれば、新たな分析、売買プログラムを実装することが可能になりそうです。
特に今回、プログラミングでのテクニカル分析環境を作成しましたが、これを用いることで、売買シグナル設定の最適化、損切りポイントの最適化、ファンダメンタルズ分析や深層学習と組み合わせた手法など開発にも応用ができると考えています。
そのコードすら、ChatGPTなどのAIツールが書いてくれるかもしれません。
最後に、本記事が、AIを活用したテクニカル分析の第一歩として、読者の皆様にとって有益な情報となることを願っています。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?