pythonコード質問
Q&A
解決したいこと
python練習中の者です。
日経平均の株価を読み込み、その中の終値(close)について、
指標値(移動平均、ボリンジャーバンド、RSI)を作り、その指標値に対する予測モデルを作ろうとしています。
(自分は株のプロを目指しているのではなく、あくまでpythonに習熟するために練習でコード作成、デバックをしているだけです)
でエラーが起きるので解決策を教えていただきたい次第です。
発生している問題・エラー
以下のようになり、indicator_bb.bollinger_hband().values.flatten()が1次元でないことが原因のようです。
ValueError Traceback (most recent call last)
Cell In[30], line 31
data = data.fillna(method='ffill')
dara['hband']=indicator_bb.bollinger_hband().values.flatten()
data['ave']=indicator_bb.bollinger_mavg().values.flatten()
data['land']=indicator_bb.bollinger_lband().values.flatten()
ValueError: Data must be 1-dimensional, got ndarray of shape (246, 1) instead
該当するソースコード
import yfinance as yf
import pandas as pd
import numpy as np
import ta
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
ticker = "^N225"
data = yf.download(ticker, start="2023-01-01", end="2024-01-01")
data['MA20'] = data['Close'].rolling(window=20).mean()
data['MA50'] = data['Close'].rolling(window=50).mean()
indicator_bb = ta.volatility.BollingerBands(close=data['Close'], window=20, window_dev=2)
data = data.fillna(method='ffill')
data['UpperBand']=indicator_bb.bollinger_hband().values.flatten()
data['ave']=indicator_bb.bollinger_mavg().values.flatten()
data['LowerBand']=indicator_bb.bollinger_lband().values.flatten()
data['RSI'] = talib.RSI(data['Close'], timeperiod=14)
data = data.dropna()
X = data[['MA20', 'MA50', 'UpperBand', 'LowerBand', 'RSI']]
y = data['Close']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
plt.figure(figsize=(12, 6))
plt.plot(y_test.index, y_test, label='Actual Close', color='blue')
plt.plot(y_test.index, y_pred, label='Predicted Close', color='red', linestyle='--')
plt.title('Stock Price Prediction: Actual vs Predicted')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
自分で試したこと
以下は試しましたが上と同じ配列サイズオーバーのエラーでした。
indicator_bb.bollinger_hband().values
indicator_bb.bollinger_hband().squeeze()
indicator_bb.bollinger_hband().reset_index(drop=True)
何か、私が根本的にわかっていないような感があるのですが、恐れ入りますが教えていただけるとありがたいです。