線形回帰、ランダムフォレスト、ニューラルネットワークの解説 / 1か月後の株価予想サンプルコード

この記事で学べること

3種類の機械学習モデルを学ぶことができます。

まずはこのコードを実行してAppleの1か月後の株価を予測してもらいましょう。

import yfinance as yf
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import pandas as pd

# 株価データの取得
data = yf.download('AAPL', start='2000-01-01', end='2023-12-02')

# 特徴量とターゲットの生成(一か月後の株価)
data['Target'] = data['Close'].shift(-20)  # 一か月後(約20取引日後)の株価
data = data.dropna()

# 特徴量(過去の株価)の選択
features = ['Open', 'High', 'Low', 'Close', 'Volume']
X = data[features]
y = data['Target']

# データの分割(トレーニングセットとテストセット)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# モデルのトレーニング
model = LinearRegression()
model.fit(X_train, y_train)

# 最新のデータを用いた予測(一か月後の株価)
latest_data = data[features].iloc[-1].values.reshape(1, -1)
predicted_price = model.predict(latest_data)

print(f"Predicted price for 1 month later: ${predicted_price[0]:.2f}")

結果は次のようになりました。

[*********************100%***********************] 1 of 1 completed Predicted price for 1 month later: $180.10

注意

ここで紹介しているコードはサンプルコードになります。
細かいパラメータの調整や設定、バックテストなども行なっていません。
実際の取引にこのような予測を適用する際には、リスク管理と資金管理を十分に行うことが重要です。

この結果は線形回帰モデルを使用しています。

この記事で習得できるスキル

線形回帰、ランダムフォレスト、ニューラルネットワークについておおまかに特徴を把握できます。
また、モデルの選択方法を理解することもでき、実際にモデルを使った未来予測のサンプルコードを入手することができます。

各モデルの特徴

線形回帰、ランダムフォレスト、ニューラルネットワークの三つは、株価予測などの時系列データ分析に広く使用される機械学習モデルです。

それぞれのモデルは異なる特性を持ち、特定の状況やデータタイプによって適切さが異なります。

以下に、それぞれのモデルの特徴と精度に関する一般的な情報を提供します。

線形回帰

  • 特徴:
    • 最も基本的で理解しやすいモデルの一つ。
    • 予測変数と目的変数の間に線形関係があると仮定します。
    • 計算コストが低く、実装が簡単。
  • 精度:
    • データが線形関係に従う場合には良好な予測を提供。
    • 複雑な非線形関係や相互作用を捉えることができません。
    • 過学習(オーバーフィッティング)のリスクが比較的低い。

ランダムフォレスト

  • 特徴:
    • 決定木を基にしたアンサンブル学習モデル。
    • 複数の決定木を組み合わせて予測精度を向上させます。
    • 特徴量の重要度を評価する能力があります。
  • 精度:
    • 非線形関係や複雑なデータ構造をよりよく捉えることができます。
    • データの過学習を防ぐための機能が組み込まれています。
    • パラメータのチューニングが重要ですが、適切に設定されると高い精度を達成できます。

先ほどの1か月後のAppleの株価予想をランダムフォレストで行うと次のようになります。

ライブラリのインストールがまだの方は入れてください。

pip install yfinance
pip install scikit-learn
import yfinance as yf
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# 株価データの取得
data = yf.download('AAPL', start='2010-01-01', end='2023-12-31')

# 特徴量とターゲットの生成(一か月後の株価)
data['Target'] = data['Close'].shift(-20)  # 一か月後(約20取引日後)の株価
data = data.dropna()

# 特徴量(過去の株価)の選択
features = ['Open', 'High', 'Low', 'Close', 'Volume']
X = data[features]
y = data['Target']

# データの分割(トレーニングセットとテストセット)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# ランダムフォレストモデルのトレーニング
model = RandomForestRegressor(n_estimators=100, random_state=0)
model.fit(X_train, y_train)

# 最新のデータを用いた予測(一か月後の株価)
latest_data = data[features].iloc[-1].values.reshape(1, -1)
predicted_price = model.predict(latest_data)

print(f"Predicted price for 1 month later: ${predicted_price[0]:.2f}")

結果は

[*********************100%***********************] 1 of 1 completed Predicted price for 1 month later: $187.23

線形回帰より高い数値がでました。

ランダムフォレストモデルは、パラメータのチューニングによってパフォーマンスが大きく変わることがあります。n_estimators(決定木の数)や他のパラメータを調整して、モデルの精度を向上させることができます。

ニューラルネットワーク

  • 特徴:
    • 非常に柔軟で強力なモデルで、複雑な非線形関係をモデル化できます。
    • 深層学習に分類され、多層の隠れ層を持つことができます。
    • 大量のデータと計算リソースを必要とすることが多い。
  • 精度:
    • 大規模なデータセットに対して非常に高い予測精度を達成できます。
    • 小規模なデータセットや過学習のリスクが高い場合があります。
    • パラメータのチューニングとモデルの構造設計が重要です。

ニューラルネットワークでも出してみましょう。

ただし、これはメモリがかなり喰われますのでスペックに注意してください。

import yfinance as yf
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# 株価データの取得
data = yf.download('AAPL', start='2010-01-01', end='2023-12-31')

# 特徴量とターゲットの生成(一か月後の株価)
data['Target'] = data['Close'].shift(-20)  # 一か月後(約20取引日後)の株価
data = data.dropna()

# 特徴量(過去の株価)の選択
features = ['Open', 'High', 'Low', 'Close', 'Volume']
X = data[features]
y = data['Target']

# データの分割(トレーニングセットとテストセット)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# ニューラルネットワークモデルの構築
model = Sequential()
model.add(Dense(64, input_dim=len(features), activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mean_squared_error')

# モデルのトレーニング
model.fit(X_train, y_train, epochs=50, batch_size=32, verbose=1)

# 最新のデータを用いた予測(一か月後の株価)
latest_data = np.array(data[features].iloc[-1]).reshape(1, -1)
predicted_price = model.predict(latest_data)

print(f"Predicted price for 1 month later: ${predicted_price[0][0]:.2f}")

このコードでは、Kerasを使用して3層のニューラルネットワークを構築し、Appleの株価を1か月後に予測します。

モデルは過去の株価データ(開始価格、最高価格、最低価格、終了価格、取引量)を特徴量として使用し、一か月後の終了価格をターゲットとして予測します。

注意点

  • ニューラルネットワークの設計(層の数、ニューロンの数、活性化関数など)は、問題に応じて調整する必要があります。
  • ニューラルネットワークは過学習(オーバーフィッティング)のリスクがあります。適切な正則化技術やデータの前処理が重要です。
  • 株価予測は非常に複雑で、多くの外部要因に影響されます。したがって、このような予測は常に不確実性を伴います。
  • 実際の取引にこのような予測を適用する際には、リスク管理と資金管理を十分に行うことが重要です。

モデルの選択方法を考察

モデルの選択は、使用するデータの性質や特徴に大きく依存します。

例えば、データが非線形関係を示す場合、ランダムフォレストやニューラルネットワークが適している可能性があります。

また、ニューラルネットワークは計算コストが高く、適切なモデルを設計するためには専門知識と高いスペックのPCが必要です。

一方、線形回帰やランダムフォレストは比較的簡単に実装できます。

過学習のリスク
複雑なモデルは過学習のリスクが高くなります。適切なデータ前処理、特徴選択、モデルの正則化が重要です。

kotaro
本業は芸術家をしています。
トレードが大好きで、トレードを愛しています。
もっぱらテクニカル分析派で、ファンダメンタルはテクニカル指標に合わせてついてくると確信しています。
芸術家だった祖母と、銀行家だった祖父に育てられ、10代に差し掛かる前から株式投資の本や哲学書を読んでいます。
要介護5だった祖母の介護をきっかけにプログラミングに興味をもち、株式会社ジオセンスのCEO:小林一英氏に弟子入り。
先生の指導のお陰で初心者から約1ヶ月でCを使った温度と湿度を計測して寝返りのタイミングをLEDランプで知らせるデバイスを開発。
現在は金融トレードのためにPythonを中心に知識を増やしています。
上部へスクロール