
为什么普通人用Python预测股价总亏钱
打开任何一个量化论坛,满屏都是“用LSTM预测股价,准确率90%”的帖子。点进去一看,代码跑出来的图确实漂亮,预测曲线和真实价格几乎重合。你兴冲冲跟着做,实盘一跑就亏。问题出在三个地方:数据泄漏、过拟合、还有忽略交易成本。
数据泄漏是最隐蔽的杀手。很多人把训练集和测试集随机打乱,用今天的数据预测昨天的价格,模型当然准。正确的做法是按时间顺序切分,比如前80%交易日训练,后20%测试,绝对不能让未来信息流入过去。
过拟合更常见。LSTM这种深度网络参数动辄几十万,你拿两年日线数据去喂,它能把每一根K线的噪声都背下来。回测夏普比率3.0,实盘变成负的。

交易成本是压垮散户的最后一根稻草。A股印花税千分之一,佣金万二点五,加上滑点,一个来回至少千一点五。你预测下周涨1%,扣掉成本还亏0.5%。
用Python做预测到底该走哪条路
别一上来就搞深度学习。先问自己:你要预测的是价格绝对值还是收益率方向?是日内高频还是周线级别?
价格绝对值预测基本是死路。股价受宏观、政策、情绪影响,非平稳序列,均值方差随时间变。你拿2020年茅台的数据训练,2024年预测出来的价格毫无意义。
收益率方向预测靠谱得多。把问题变成分类:明天收盘价比今天高还是低?或者三分类:涨超1%、跌超1%、震荡。标签平衡后,用逻辑回归、随机森林就能跑出55%以上的方向准确率。别小看55%,期货日内高频策略胜率52%就能盈利。
时间序列模型里,ARIMA适合差分平稳后的短期趋势,GARCH族模型专门捕捉波动率聚集。股价波动率比价格本身好预测得多,用GARCH预测未来一周的波动区间,对期权卖方和仓位管理极有价值。
LSTM和Transformer不是不能用,但要极度克制。输入特征别超过10个,隐藏层别超过2层,训练轮数控制在50以内并加早停。输入用收益率序列,输出用sigmoid压缩到0-1表示上涨概率。
从数据到回测的完整代码框架
下面这段代码是骨架,不涉及具体模型参数调优,目的是让你看清全流程。
import yfinance as yf
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
# 1. 获取数据,复权处理
df = yf.download('600519.SS', start='2018-01-01', end='2024-01-01')
df['ret'] = df['Close'].pct_change()
df = df.dropna()
# 2. 构造特征,只用过去信息
df['ma5'] = df['Close'].rolling(5).mean()
df['ma20'] = df['Close'].rolling(20).mean()
df['vol_ratio'] = df['Volume'] / df['Volume'].rolling(20).mean()
df['label'] = (df['ret'].shift(-1) > 0).astype(int)
df = df.dropna()
# 3. 按时间切分,前80%训练
train_size = int(len(df) * 0.8)
train = df.iloc[:train_size]
test = df.iloc[train_size:]
# 4. 归一化,只 fit 训练集
scaler = MinMaxScaler()
features = ['ret', 'ma5', 'ma20', 'vol_ratio']
train_scaled = scaler.fit_transform(train[features])
test_scaled = scaler.transform(test[features])
# 5. 构造时序样本,lookback=20天
def create_dataset(data, label, lookback=20):
X, y = [], []
for i in range(lookback, len(data)):
X.append(data[i-lookback:i])
y.append(label[i])
return np.array(X), np.array(y)
X_train, y_train = create_dataset(train_scaled, train['label'].values)
X_test, y_test = create_dataset(test_scaled, test['label'].values)
# 6. 简单LSTM
model = Sequential([
LSTM(32, input_shape=(X_train.shape[1], X_train.shape[2])),
Dropout(0.2),
Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=30, batch_size=32, validation_split=0.1, shuffle=False)
# 7. 回测,扣掉千一点五成本
pred_prob = model.predict(X_test).flatten()
signal = (pred_prob > 0.55).astype(int) - (pred_prob < 0.45).astype(int)
strategy_ret = signal[:-1] * test['ret'].values[1:] - 0.0015 * np.abs(np.diff(signal))
cum_ret = (1 + strategy_ret).cumprod()
print(f'策略累计收益: {cum_ret[-1]:.2f}')
跑完这段代码,多数股票累计收益在0.8到1.2之间晃荡,扣除成本后不赚钱。这才是真实世界。
怎样把预测变成真金白银
预测本身不值钱,值钱的是预测+资金管理+执行。
第一,只做波动率预测。 用GARCH模型预测明天波动幅度,如果预测波动大于过去20天均值的1.5倍,当天不开仓。这能过滤掉大部分假突破。
第二,用预测概率做仓位。 预测上涨概率0.6,仓位20%;概率0.7,仓位40%;概率0.8以上,仓位60%。永远不满仓。
第三,期货比股票更适合程序化。 期货T+0,做空方便,杠杆可调。用Python对接CTP接口,预测螺纹钢主力合约5分钟收益率方向,胜率52%配合2:1盈亏比,年化能到20%以上。股指期货IF和IC流动性好,但保证金高,适合大资金。
第四,回测必须扣成本。 股票双边千一点五,期货单边万零点五。滑点按一跳算。回测夏普比率低于1.5的策略直接扔掉。
第五,样本外跟踪至少三个月。 模拟盘或者小资金实盘,每天记录预测值和实际值。如果方向准确率连续20个交易日低于50%,策略失效,停掉重做。
哪些Python库能帮你省时间
数据源:yfinance免费但A股有延迟,tushare积分制,akshare免费且覆盖期货。
特征工程:ta-lib算技术指标快,pandas-ta纯Python无依赖。
模型:statsmodels跑ARIMA和GARCH,scikit-learn跑树模型,pytorch比tensorflow调试方便。
回测:backtrader功能全但慢,vectorbt向量化极快,zipline适合美股。
实盘:vnpy对接国内期货C++接口,easytrader控制券商客户端。
最后一句大实话
Python股票价格预测,预测的不是价格,是概率。你找到的任何规律,别人早就试过。真正能赚钱的策略,要么在特征上有独家数据,要么在执行上有速度优势,要么在风控上有铁律。指望跑个LSTM就财富自由,不如去买彩票。