智能股票预测模型私人定制:八步实战指南
创建属于自己的股票预测模型?听起来就让人兴奋。本文会一步步带你用 Python 搭一个出来,就算你编程经验不多,也不用担心——跟着步骤走,一样能搞定。
一、为什么要创建自定义股票预测模型?
为什么要自己动手搭一个股票预测模型?答案不光是“想赚钱”,更深层的原因是,每个投资者对市场的理解都不一样。传统方法很难完全捕捉市场的复杂动态,而自定义模型能让你把真正关心的因素放进去。原因主要有这么三个:
洞察:深入了解不同因素如何影响股票价格
市场变化多端。通过构建自己的模型,你可以把宏观经济指标、公司财务状况、市场情绪等多种因素都考虑进来,而不是被固定公式框死。这样预测出来的走势,往往更贴近你对市场的真实判断。
定制:根据你的具体需求和偏好定制模型
不同人的风险偏好和投资目标千差万别。自定义模型允许你把自己的理念融入预测过程——是保守还是激进,是长期持有还是波段操作,都能在模型里体现出来。说到底,只有自己最懂自己的策略。
创新:尝试各种技巧,发现最适合自己的方法
模型的灵活性和可扩展性也很关键。市场环境变了,你的判断变了,模型随时可以调整优化。这种“迭代”的能力,让自定义模型在应对变化时更加得心应手。
二、搭建自定义股票预测模型
第①步 需要了解的工具和库
在敲代码之前,先熟悉一下这趟旅途要用到的“工具箱”:
- Python:编程语言,没它不行。
- Pandas:数据处理利器。
- NumPy:数值运算必备。
- Scikit-learn:机器学习的“瑞士军刀”,用于构建和评估模型。
- XGBoost 和 LightGBM:两款提升算法,能让预测更准。
- Yahoo Finance:获取股票数据的数据源。
第②步 加载和准备数据
数据是一切的基础。下面这段代码会从雅虎财经拉取近一年的股价数据:
import yfinance as yf
import pandas as pd
def load_data(ticker):
stock = yf.Ticker(ticker)
df = stock.history(period="1y")
df['Date'] = df.index
return df
第③步 添加技术指标
原始数据不够用,需要构造一些能反映市场状态的特征。比如布林带和相对强弱指标:
def bollinger_bands(close, window=20, num_std=2):
rolling_mean = close.rolling(window=window).mean()
rolling_std = close.rolling(window=window).std()
upper_bb = rolling_mean + (rolling_std * num_std)
lower_bb = rolling_mean - (rolling_std * num_std)
return upper_bb, lower_bb
def compute_rsi(close, window=14):
delta = close.diff()
gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
rs = gain / loss
return 100 - (100 / (1 + rs))
第④步 选择并训练模型
机器学习模型这边,准备了多种选择:决策树、线性回归、随机森林、梯度提升、支持向量机,再加上XGBoost和LightGBM。你可以根据需要挑,也可以把它们组合起来用。下面是训练和评估的通用函数:
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import VotingRegressor
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.svm import SVR
import xgboost as xgb
import lightgbm as lgb
models = {
'Decision Tree': DecisionTreeRegressor(random_state=42),
'Linear Regression': LinearRegression(),
'Random Forest': RandomForestRegressor(random_state=42),
'Gradient Boosting': GradientBoostingRegressor(random_state=42),
'Support Vector Machine': SVR(),
'XGBoost': xgb.XGBRegressor(random_state=42),
'LightGBM': lgb.LGBMRegressor(random_state=42)
}
def train_and_evaluate(X, y, selected_models):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
if len(selected_models) > 1:
voting_regressor = VotingRegressor(
estimators=[(name, models[name]) for name in selected_models]
)
model = Pipeline(steps=[
('scaler', scaler),
('regressor', voting_regressor)
])
else:
model = Pipeline(steps=[
('scaler', scaler),
('regressor', models[selected_models[0]])
])
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
mape = mean_absolute_percentage_error(y_test, y_pred)
return mae, mse, rmse, r2, mape, y_test, y_pred, model
第⑤步 多模型结合
组合往往比单个模型更强。用投票回归器把多个模型“投”到一起,效果通常会更好:

第⑥步 保存您的模型
训练好之后记得保存,下次直接加载用,不用重新训练:
import pandas as pd
import numpy as np
import yfinance as yf
import joblib
# Load the trained model
model = joblib.load('trained_model.pkl')
…
def on_button_clicked(b):
global trained_model
with output:
clear_output()
selected_models = [checkbox.description for checkbox in model_checkboxes if checkbox.value]
if selected_models:
print(f"Running models: {', '.join(selected_models)}")
mae, mse, rmse, r2, mape, y_test, y_pred, trained_model = train_and_evaluate(X, y, selected_models)
print("nModel Evaluation Metrics:")
print(f"Mean Absolute Error: ${mae:.2f}")
print(f"Mean Squared Error: ${mse:.2f}")
print(f"Root Mean Squared Error: ${rmse:.2f}")
print(f"R^2 Score: {r2:.4f}")
print(f"Mean Absolute Percentage Error: {mape:.2f}%")
print("nSample of predictions vs true values:")
results_df = pd.DataFrame({'True Price': y_test, 'Predicted Price': y_pred})
display(results_df.head())
# Sa ve the trained model
sa ve_model(trained_model, 'trained_model.pkl')
else:
print("Please select at least one model.")
第⑦步 模型评估指标
模型好不好,得用指标说话。常用指标有这些:
- 平均绝对误差 (MAE):预测值与实际值之间的平均绝对误差。
- 平均平方误差 (MSE):预测值与实际值之间的平均平方误差。
- 均方根误差 (RMSE):MSE的平方根,表示误差大小。
- 平均绝对百分比误差 (MAPE):预测值与实际值之间的平均绝对百分比误差。
计算代码如下:
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
mape = mean_absolute_percentage_error(y_test, y_pred)
return mae, mse, rmse, r2, mape, y_test, y_pred, model
第⑧步 加载模型和股票价格预测
模型加载后,就可以用它来预测未来股价了。下面这个函数会基于最近的数据,逐步预测未来指定天数的价格:
# Prepare a list to store predictions
predictions = []
# Check if the recent_data DataFrame has the correct number of columns
if recent_data.shape[1] != len(expected_features):
raise ValueError(f"Expected {len(expected_features)} features but got {recent_data.shape[1]}")
# Predict future prices
for _ in range(future_days):
# Predict the next day's price
prediction = model.predict(recent_data)
predictions.append(prediction[0])
# Create a new row for future prediction
new_row = recent_data.copy()
new_row.loc[0, 'Open'] = prediction[0] # Update the 'Open' feature for the new row
# Append new_row to recent_data
recent_data = pd.concat([recent_data[1:], new_row], ignore_index=True)
return predictions
三、观点回顾
搭建自己的股价预测模型,整个过程非常有价值。你可以完全自定义每一个细节:选什么特征、用什么算法、如何组合。真正做出一个贴合自己交易风格的工具,成就感很强。
- 自定义模型的优势:自建模型能让用户根据个人需求和偏好定制,更深入理解不同因素如何影响股价,并有空间尝试创新。
- 必要的工具和库:需要掌握Python,以及Pandas、NumPy、Scikit-learn、XGBoost和LightGBM等库。
- 数据准备和特征工程的重要性:加载和准备数据是建模前的基础,而添加技术指标这样的特征工程能让模型更好地反映市场状况。
- 多模型集成:通过投票回归器等组合多个模型,可以提升预测能力和鲁棒性。
- 模型评估指标:用MAE、MSE、RMSE、R²和MAPE来评估模型性能,看清长处和短板。
- 实践和定制:文中提供了完整的代码示例,动手跑一遍,再根据自己偏好调整,效果会更好。