『GPT-4を使用したパーソナライズされたAIトレーディングコンサルタントの構築』

『パーソナライズされたAIトレーディングコンサルタントの構築にGPT-4を活用』

はじめに

近年、人工知能(AI)を株式取引に統合することで、投資家の意思決定に革命が起きています。GPT-3やGPT-4などの大規模言語モデル(LLMs)の登場により、複雑な市場分析や洞察が個々の投資家やトレーダーによりアクセスしやすくなりました。この革新的なテクノロジーは、膨大なデータと高度なアルゴリズムを活用して、かつて機関投資家の専売特許であった市場の理解を提供するものです。この記事では、リスク許容度、投資期間、予算、および期待利益に基づいた個別の投資プロファイルに合わせた、パーソナライズされたAI取引コンサルタントの開発に焦点を当てており、個人投資家に戦略的な投資アドバイスを提供することで彼らを強化しています。

GPT-3やGPT-4といった大規模言語モデル(LLMs)によって動かされる株式取引コンサルタントは、金融アドバイザリーサービスに革命をもたらしました。これらのコンサルタントは、AIを活用して過去の株式データや最新の金融ニュースを分析し、投資家の独自のポートフォリオと金融目標に合ったパーソナライズされた投資アドバイスを提供できます。本記事では、市場の動向やトレンドを予測するためのコンサルタントの構築に挑戦し、個別のリスク許容度、投資期間、投資可能な資金、および期待利益に基づいたカスタマイズされた推奨事項を提供します。

学習目標

本記事の終わりまでに、読者は以下のことができるようになります:

  • AIやGPT-3などのLLMsが株式市場分析や取引をどのように変革するかについて洞察を得る。
  • AI主導のツールが個別のリスクプロファイルと投資目標に基づいたパーソナライズされた投資アドバイスを提供する能力を認識する。
  • AIが過去とリアルタイムのデータを活用して投資戦略と予測を立案する方法を学ぶ。
  • AIを用いた株式取引が、小売投資家を含むより広範なユーザーに洗練された投資戦略を提供する方法を理解する。
  • パーソナル投資や株式取引での情報を活用した意思決定のためにAI主導のツールを活用する方法を発見する。
  • LLMsを活用した株式取引コンサルタントのコンセプト

この記事はData Science Blogathonの一部として公開されました。

データセットについて

このプロジェクトのためのデータセットは、ニューヨーク証券取引所からのものであり、Kaggleで利用可能です。このデータセットには、7年間にわたる4つのCSVファイルが含まれています。重要な財務尺度を提供する「fundamentals.csv」、株式分割に関する過去の株価と調整を提供する「prices.csv」と「prices-split-adjusted.csv」、セクター分類や本社などの追加の企業情報を提供する「securities.csv」が含まれています。これらのファイルは、企業のパフォーマンスと株式市場の動向を包括的に把握するためのものです。

データの準備

GPT-4のような大規模言語モデル(LLMs)を使用した株式取引コンサルタントの実装は、重要なデータの準備から始まります。このプロセスには、データのクリーニング、正規化、カテゴリ化といった重要なタスクが含まれ、提供されたデータセット「fundamentals.csv」「prices.csv」「prices-split-adjusted.csv」「securities.csv」を使用します。

ステップ1:データのクリーニング

  • 「Fundamental Dataset」では、「For Year」「Earnings Per Share」「Estimated Shares Outstanding」(それぞれ173、219、219の欠損値)を中央値補完によって補完します。
  • 「Period Ending」列を日付形式に変換し、数値フィールドの分析に利用できるようにします。
import pandas as pd# データセットの読み込みfundamentals = pd.read_csv('/content/fundamentals.csv')prices = pd.read_csv('/content/prices.csv')prices_split_adjusted = pd.read_csv('/content/prices-split-adjusted.csv')securities = pd.read_csv('/content/securities.csv')# Fundamental Datasetの欠損値とデータ型変換fundamentals_info = fundamentals.info()fundamentals_missing_values = fundamentals.isnull().sum()# 全データセットの日付列のフォーマット変換fundamentals['Period Ending'] = pd.to_datetime(fundamentals['Period Ending'])prices['date'] = pd.to_datetime(prices['date'])prices_split_adjusted['date'] = pd.to_datetime(prices_split_adjusted['date'])# Fundamental Datasetの欠損値に関する情報の表示fundamentals_missing_values

# 不必要な「Unnamed: 0」列を削除します
fundamentals.drop(columns=['Unnamed: 0'], inplace=True)

# 「Earnings Per Share」と「Estimated Shares Outstanding」の欠損値を中央値で補完します
for column in ['Earnings Per Share', 'Estimated Shares Outstanding']:
    median_value = fundamentals[column].median()
    fundamentals[column].fillna(median_value, inplace=True)

# 補完後の欠損値を再度チェックします
fundamentals_missing_values_post_imputation = fundamentals.isnull().sum()
fundamentals_missing_values_post_imputation

  • 「日付」列は、価格および価格調整済みデータセットにおいてすでに日時の形式が一貫しています。特に株式分割に関してデータの整合性を確認します。
# 価格と価格調整済みデータセットの整合性をチェックします
# 両データセットにおいて同じティッカーシンボルと日付を持つデータのサンプルを比較します
# サンプルのティッカーシンボルを選択します
sample_tickers = prices['symbol'].unique()[:5]

# 各ティッカーシンボルごとに比較用のDataFrameを作成します
comparison_data = {}
for ticker in sample_tickers:
    prices_data = prices[prices['symbol'] == ticker]
    prices_split_data = prices_split_adjusted[prices_split_adjusted['symbol'] == ticker]
    merged_data = pd.merge(prices_data, prices_split_data, on='date', how='inner', suffixes=('_raw', '_split'))
    comparison_data[ticker] = merged_data

# 最初のティッカーシンボルの比較結果を例として表示します
comparison_data[sample_tickers[0]].head()

価格.csvと価格調整済み.csvの比較(サンプルティッカーシンボルWLTW)により、株式分割調整によるオープン、クローズ、ロー、ハイの株価に差異があることがわかります。ボリューム列は一貫しており、正確な取引ボリュームデータを示しています。

ステップ2:価格の正規化

株式トレードコンサルティングのために価格調整済み.csvデータセットを使用し、株価の時系列データを株式分割も考慮に入れた一貫した視点で提供します。

ステップ3:データ統合

最終的なデータ準備のステップでは、これらのデータセットを統合します。financials.csv, prices-split-adjusted.csv, securities.csvをマージし、分析用の包括的なデータフレームを作成します。データのサイズが大きいため、金融データと株価、企業情報をマッチングするために、ティッカーシンボルと日付フィールドを基準に最も関連のある列を統合します。

# 統合のため、各データセットから関連する列を選択します
fundamentals_columns = ['Ticker Symbol', 'Period Ending', 'Earnings Per Share', 'Total Revenue']
prices_columns = ['symbol', 'date', 'open', 'close', 'low', 'high', 'volume']
securities_columns = ['Ticker symbol', 'GICS Sector', 'GICS Sub Industry']

# 一貫性のため、列名を変更します
fundamentals_renamed = fundamentals[fundamentals_columns].rename(columns={'Ticker Symbol': 'symbol', 'Period Ending': 'date'})
prices_split_adjusted_renamed = prices_split_adjusted[prices_columns].rename(columns={'open': 'open_price', 'close': 'close_price', 'low': 'low_price', 'high': 'high_price', 'volume': 'trade_volume'})
securities_renamed = securities[securities_columns].rename(columns={'Ticker symbol': 'symbol'})

# データセットをマージします
merged_data = pd.merge(pd.merge(fundamentals_renamed, prices_split_adjusted_renamed, on=['symbol', 'date']), securities_renamed, on='symbol')

# 統合データセットの最初の数行を表示します
merged_data.head()

結果のデータセットには、1つのティッカーシンボルごとに収益性指標(EPS)、総収入、オープン/クローズ/ロー/ハイの株価、取引ボリューム、セクター情報が含まれています。

探索的データ分析(EDA)

次に、特徴選択とモデルトレーニングに重要な、データセットの分布と関係性を理解するためにEDAを行います。

import matplotlib.pyplot as pltimport seaborn as sns# Exploratory Data Analysis (EDA)# 数値カラムの要約統計numerical_summary = merged_data.describe()# 数値の特徴間の関係を理解するための相関行列correlation_matrix = merged_data.corr()# ヒートマップを使用して相関行列を視覚化plt.figure(figsize=(12, 8))sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f')plt.title('数値特徴の相関行列')plt.show()correlation_matrix

EDAにより、統合データセットに関する貴重な情報が得られます:

  • 企業の財務健全性には多様なスペクトルが観察されます。1株利益は負から正の極端まで広範囲であり、売上高は企業の規模の幅広い範囲を反映しています。
  • 株価の種類には顕著な変動があり、取引量は異なるエンティティ間の市場活動の多様性を強調しています。
  • 相関の調査により、株価ポイント間での強い相関、企業の利益と株価の中程度の関連、売上規模と取引量の間の軽微な関係が明らかになりました。
  • 興味深い発見は、取引量と株価の逆相関関係であり、取引活動の増加が必ずしも株価の上昇と相関しないことを示しています。

特徴エンジニアリング

これらの解析的な洞察を元に、特徴エンジニアリングを行います:

  • 予測的な財務指標を導入します:
    • PE_Ratio: 株価を1株利益で割った「価格収益率」という比率です。
    • Price_Change: 開始価格から終了価格を引いた「株価変動」を反映します。
    • Average_Price: 当日の始値、終値、安値、高値の平均を算出した指標です。
  • データの異常値に対処するために、四分位範囲(IQR)メソッドを使用して数値フィールド内の外れ値を特定および軽減します。
  • 1株利益や売上高などの重要な数値特徴を、MinMaxScalerを使用して正規化し、モデル入力に標準化されたスケールを提供します。
  • 「GICSセクター」のカテゴリは、アルゴリズム学習プロセスに適したバイナリ形式に変換するためにワンホットエンコードを行います。
  • このプロセスの集大成として、元のデータ、新たにエンジニアリングされた特徴、およびワンホットエンコードされたセクターを統合した、103列からなるデータセットが生成されます。
from sklearn.preprocessing import MinMaxScaler# 一貫性のために列を名前変更fundamentals_renamed = fundamentals.rename(columns={'Ticker Symbol': 'symbol', 'Period Ending': 'date'})prices_split_adjusted_renamed = prices_split_adjusted.rename(columns={'symbol': 'symbol', 'date': 'date', 'open': 'open_price', 'close': 'close_price', 'low': 'low_price', 'high': 'high_price', 'volume': 'trade_volume'})securities_renamed = securities.rename(columns={'Ticker symbol': 'symbol'})# データセットのマージmerged_data = pd.merge(pd.merge(fundamentals_renamed, prices_split_adjusted_renamed, on=['symbol', 'date']), securities_renamed, on='symbol')# 新しい特徴の作成merged_data['PE_Ratio'] = merged_data['close_price'] / merged_data['Earnings Per Share']merged_data['Price_Change'] = merged_data['close_price'] - merged_data['open_price']merged_data['Average_Price'] = (merged_data['open_price'] + merged_data['close_price'] + merged_data['low_price'] + merged_data['high_price']) / 4# 外れ値の処理: IQRメソッドを使用して数値カラム内の外れ値を特定および処理Q1 = merged_data.quantile(0.25)Q3 = merged_data.quantile(0.75)IQR = Q3 - Q1merged_data = merged_data[~((merged_data.isin([Q1 - 1.5 * IQR, Q3 + 1.5 * IQR])).any(axis=1))]# 特徴のスケーリング: 数値特徴の正規化numerical_features = ['Earnings Per Share', 'Total Revenue', 'open_price', 'close_price', 'low_price', 'high_price', 'trade_volume', 'PE_Ratio', 'Price_Change', 'Average_Price']scaler = MinMaxScaler()merged_data[numerical_features] = scaler.fit_transform(merged_data[numerical_features])# カテゴリ変数のエンコーディング: 'GICSセクター'のワンホットエンコーディングmerged_data_encoded = pd.get_dummies(merged_data, columns=['GICS Sector'])# 前処理済みデータセットのサンプルの表示merged_data_encoded.head()

モデルのトレーニングとテスト

株価予測プロジェクトでは、連続的な株価値を予測するため、回帰タスクを優れた形で処理できる機械学習モデルを選択する必要があります。データセットの多様性と複雑性を考慮すると、モデルはデータ内の複雑なパターンを巧みに捉える必要があります。

  • モデルの選択: 多様性と堅牢性に優れたランダムフォレスト回帰モデルは、データセットの複雑性と特徴のさまざまさに対応するのに理想的です。回帰タスクに優れ、過学習のリスクが低く、非線形な関係を扱えます。
  • データの分割: データセットはトレーニングとテストの比率が80対20に分割されます。これにより、包括的なトレーニングフェーズが実現し、検証にも十分なデータセットが残ります。
  • 欠損値の処理: 欠損値はsklearn.imputeのSimpleImputerを使用して中央値の埋め込み戦略で処理されます。これにより、データの完全性と一貫性が確保されます。
  • トレーニングプロセス: モデルは埋め込まれたトレーニングデータでトレーニングされ、実際のデータポイントが欠損している現実のシナリオを反映しています。
  • パフォーマンス評価: トレーニング後、モデルの予測精度は埋め込まれたテストセットを使用して評価され、実世界での適用性が評価されます。

以下のコードは、このプロセスに関与する手順を示しています。

from sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.metrics import mean_squared_error, r2_scorefrom sklearn.impute import SimpleImputer# 'close_price'を予測変数とすると仮定X = merged_data_encoded.drop(['close_price', 'symbol', 'date'], axis=1)  # 数値以外と対象変数を削除y = merged_data_encoded['close_price']# データセット内の数値以外の列をチェックnon_numeric_columns = X.select_dtypes(include=['object']).columns# 数値以外の列がある場合、データセットから削除しますif len(non_numeric_columns) > 0:    X = X.drop(non_numeric_columns, axis=1)# データセットをトレーニングとテストのセットに分割X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# ランダムフォレスト回帰モデルの初期化random_forest_model = RandomForestRegressor(n_estimators=100, random_state=42)# 中央値の埋め込み戦略を使用したインプーターオブジェクトの作成imputer = SimpleImputer(strategy='median')# インプーターをトレーニングセットとテストセットに適用X_train_imputed = imputer.fit_transform(X_train)X_test_imputed = imputer.transform(X_test)# モデルのトレーニングrandom_forest_model.fit(X_train_imputed, y_train)# テストセットでの予測y_pred = random_forest_model.predict(X_test_imputed)# モデルの評価mse = mean_squared_error(y_test, y_pred)r2 = r2_score(y_test, y_pred)mse, r2

モデルのパフォーマンス

ランダムフォレスト回帰モデルの出力は以下の通りです:

  • 平均二乗誤差(MSE): 8.592×10−5という低いMSE値は、モデルの予測が実際の値に非常に近いことを示しており、株価の予測精度が高いことを示しています。
  • R二乗値(R²):0.96というR²値は、モデルが株価の約96%の変動性を説明できることを意味し、株式市場予測には非常に高い精度です。

GPT-4 APIとの統合

ランダムフォレスト回帰モデルのトレーニングと予測の有効化後、GPT-4 APIとシームレスに統合します。この統合により、モデルは株価を分析し予測し、これらの洞察をユーザーに効果的に伝えることができます。GPT-4 APIは高度な自然言語処理機能を備えており、複雑な金融データを解釈し、ユーザーフレンドリーな形で表示することができます。

統合はどのように機能しますか?

統合の仕組みについての詳しい説明は以下の通りです:

  • ユーザーのクエリ処理: get_model_predictions関数はユーザーのクエリを処理して、ティッカーシンボルなどの関連情報を抽出します。最新のデータがないため、特定の株の要約を利用してテストデータを生成します。
  • モデルの予測とスケーリング: ランダムフォレストモデルはテストデータから株価を予測し、以前に定義したスケーリング方法を使用して元の値にスケーリングします。
  • GPT-4のプロンプトの準備: query_gpt4_with_context関数はユーザーのクエリ、モデルの予測、および価格のトレンド、基本情報、および指定された株に関する証券情報など、追加のコンテキストを結合します。このプロンプトは、GPT-4にユーザーのクエリとモデルの分析に基づいたカスタマイズされたファイナンシャルコンサルテーションを提供するためのガイドとなります。
  • GPT-4のクエリとレスポンス: プロンプトは、データとユーザーのファイナンシャルプロファイルに基づいたカスタマイズされたレスポンスを生成します。
import osfrom openai import OpenAIfrom sklearn.impute import SimpleImputeros.environ["OPENAI_API_KEY"] ='YOUR API KEY'client = OpenAI()imputer = SimpleImputer(strategy='median')# ユーザーのクエリに基づいてモデルの予測を取得する関数def get_model_predictions(user_query):    ticker_symbol = user_query[0].split()[-1].strip().upper()    # データにimputerを適用し、モデルを使用して予測を行う    imputed_test_data = imputer.fit_transform(test_data)    predicted_scaled_value = random_forest_model.predict(imputed_test_data)[0]    confidence = 0.9  # 予測に90%の信頼性を仮定    # 元のスケールのデータと同じ形状のプレースホルダー配列を作成    placeholder_array = np.zeros((1, len(numerical_features)))    # 予測されたスケールの値を正しい位置に挿入    placeholder_array[0][3] = predicted_scaled_value    # 逆変換を実行    predicted_original_value = scaler.inverse_transform(placeholder_array)    # 'close_price'のスケールバックされた値を抽出    predicted_stock_price = predicted_original_value[0][3]    return {        "predicted_stock_price": predicted_stock_price,        "confidence": confidence    }# モデルのコンテキストを使用してGPT-4にクエリを実行する関数def query_gpt4_with_context(model_context,additional_data_context, user_query):    prompt = f"{additional_data_context}\n\n    {model_context}\n\n{user_query}\n\nあなたは金融アドバイザーであり、株式市場の専門家です。予測や提供されたデータ、クライアントのプロファイルを勉強し、上記の情報に基づいてユーザーに対して株式に関連したコンサルテーションを提供してください。また、提供された株に焦点を当ててアドバイスしてください。"    response = client.chat.completions.create(        model="gpt-4",        messages=[{"role": "system", "content": prompt}]    )    return response.choices[0].message.content.strip()

さあ、いくつかのシナリオで私たちの株式コンサルタントの効果をテストしましょう:

テストケース1

私は25歳の独身男性で、リスクを取ることができます。株式投資で年間15%の利益を求めています。2年前にABBVの株を1株40ドルで100株購入しました。ABBVの株を売るべきでしょうか?この売却での利益はどれくらいのドルとパーセンテージですか?

このクエリをモデルに入力して、出力を確認しましょう。

user_query = ["私は25歳の独身男性です。私の状況では、高いリスク許容度を持ち、すべての株式投資で年間15%の成長を目指しています。2年前にABBVの株を1株40ドルで購入しました。会社ABBVの株を売るべきでしょうか","この売却からの利益はどれくらいのドルと%でしょうか?"]# 質問された株の概要統計に基づいてクエリ株のランダムな行を生成するticker_symbol = user_query[0].split()[-1].strip().upper()df1 = merged_data_encoded[merged_data_encoded['symbol'] == ticker_symbol]df1 = df1.drop(['close_price'], axis=1)test_data = df1.describe().loc[['mean', 'std']].Ttest_data['random_value'] = np.random.randn(len(test_data)) * test_data['std'] + test_data['mean']# ランダムな値のみを選択してデータフレームを形成するための変数test_data = pd.DataFrame(test_data['random_value']).transpose()model_predictions = get_model_predictions(user_query)# モデルのコンテキストを生成するmodel_context = f"{ticker_symbol}の現在の予測株価は{model_predictions['predicted_stock_price']}ドルで、信頼度は{model_predictions['confidence']*100}%です。"# 追加のデータコンテキストを作成するadditional_data_context = prices[prices['symbol']==ticker_symbol],fundamentals[fundamentals['Ticker Symbol']==ticker_symbol],securities[securities['Ticker symbol']==ticker_symbol]gpt4_response = query_gpt4_with_context(model_context,additional_data_context, user_query)print(f"GPT-4のレスポンス:{gpt4_response}")

テストケース2

私は結婚している40歳の女性です。私のステータスを考慮して、私は低いリスク許容度を持ち、私の株式投資のすべてで年に少なくとも10%の成長を求めています。2年前に1株あたり$100でALXNの株式100株を購入しました。私はALXNの株式を売却するべきでしょうか?この売却による私の利益は予想されるものですか?($および%で)。

user_query = ["私は結婚している40歳の女性です。私のステータスを考慮して、私は低いリスク許容度を持ち、私の株式投資のすべてで年に少なくとも10%の成長を求めています。2年前に1株あたり$100でALXNの株式100株を購入しました。私はALXNの株式を売却するべきでしょうか?","この売却による私の利益は予想されるものですか?($および%で)。"]# クエリされた株式のサマリー統計に基づいて # ランダムなデータの行を生成 #
ticker_symbol = user_query[0].split()[-1].strip().upper()df1 = merged_data_encoded[merged_data_encoded['symbol'] == ticker_symbol]df1 = df1.drop(['close_price'], axis=1)test_data = df1.describe().loc[['mean', 'std']].Ttest_data['random_value'] = np.random.randn(len(test_data)) * test_data['std'] + test_data['mean']# ランダムな値のみを選択してデータフレームを作成test_data = pd.DataFrame(test_data['random_value']).transpose()model_predictions = get_model_predictions(user_query)# モデルコンテキストの生成model_context = f"現在の予測される株価 {ticker_symbol}は、信頼度{model_predictions['confidence']*100}%で ${model_predictions['predicted_stock_price']}です。"# 追加のデータコンテキストの生成additional_data_context = prices[prices['symbol']==ticker_symbol],fundamentals[fundamentals['Ticker Symbol']==ticker_symbol],securities[securities['Ticker symbol']==ticker_symbol]gpt4_response = query_gpt4_with_context(model_context,additional_data_context, user_query)print(f"GPT-4の返答:{gpt4_response}")

課題

  • このようなプロジェクトの実装において、金融データの正確性とタイムリーさを確保することが重要な課題です。不正確なまたは古いデータは、誤った予測や推奨を引き起こす可能性があります。
  • 地政学的な出来事、経済の変化、企業特有のニュースなど、数多くの予測不可能な要因が株式市場に影響を与えます。これらの要素は、AIの予測を信頼性のあるものにするのを難しくする場合があります。
  • AIモデルは、その高度な能力にもかかわらず、複雑な金融用語や概念を十分に理解するのに苦労する場合があり、投資アドバイスの品質に影響を与える可能性があります。
  • 金融アドバイスは厳しく規制されています。AIによる推奨が法的基準と倫理的ガイドラインに準拠していることを確保することは、大きな課題です。

結論

株式取引におけるAIの探求は、GPT-3やGPT-4などのモデルによって風景を再定義し、膨大なデータを組み込み、洗練された分析を適用し、正確な個別の洞察を提供しています。株式取引コンサルタントの開発は、アクセス可能で情報収集が進んだトレードへの飛躍を意味します。

主なポイント

  • AIの株式取引への統合は未来の話ではなく、株式市場との相互作用の方法を再定義しています。
  • GPT-3やGPT-4などのAIモデルは、個別のリスクプロファイルや財務目標に合わせたパーソナライズされた戦略を提供します。
  • AIは、過去のデータとリアルタイムのデータの両方を活用して市場のトレンドを予測し、投資戦略に関する情報を提供します。
  • 洗練された投資戦略はもはや機関投資家に限ったものではなく、AIのおかげで小売投資家にもアクセスできるようになりました。
  • AIは、株式投資の不安定な領域で戦略的な優位性を提供し、投資家に情報を基にした意思決定の力を与えます。

よくある質問

この記事に表示されるメディアはAnalytics Vidhyaの所有ではありません。著者の裁量により使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more