
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含 350 篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
作为 Python 学习者,你一定想过:既然我会写代码、会用机器学习,能不能用 Python 预测股市赚点钱?
这个想法很自然。毕竟 Python 有 pandas、scikit-learn、TensorFlow 这些强大的工具,处理数据、训练模型都不在话下。但现实往往比代码更复杂。
最近读到一篇文章,从数学角度解释了为什么市场预测如此困难。今天我就用 Python 代码来帮你理解这些概念,让你在学习量化投资之前,先搞清楚数学层面的限制。
股票价格最经典的模型之一是「随机游走」(Random Walk)。简单说,就像抛硬币:正面涨、反面跌,每一步都是随机的。
这个理论和「有效市场假说」相关——如果所有信息都已经反映在价格中,那明天的变化就只取决于新信息,而新信息本质上是不可预测的。
用 Python 模拟一下:
import numpy as npimport matplotlib.pyplot as plt# 设置随机种子,保证结果可复现np.random.seed(42)# 模拟随机游走# 每天涨跌是随机的,就像抛硬币days = 252 # 一年的交易日initial_price = 100 # 初始价格# 生成随机涨跌(均值为 0,标准差为 2)random_changes = np.random.normal(0, 2, days)# 计算价格路径prices = [initial_price]for change in random_changes: prices.append(prices[-1] + change)# 绘图plt.figure(figsize=(10, 6))plt.plot(prices)plt.title('随机游走模拟的股价走势')plt.xlabel('交易日')plt.ylabel('价格')plt.show()运行几次你会发现,每次生成的「股价」走势都完全不同。这就是随机游走的本质:过去的走势无法预测未来。
有人说:股市不是完全随机的,它有规律,只是我们没发现而已。
这话有一定道理,但问题在于「混沌系统」。混沌系统的特点是:初始条件的微小差异会导致结果的巨大不同——这就是著名的「蝴蝶效应」。
用 Python 演示一个经典的混沌系统——Logistic 映射:
import numpy as npimport matplotlib.pyplot as pltdef logistic_map(r, x0, iterations): """ Logistic 映射:一个简单但能产生混沌的函数 r: 参数,控制系统行为 x0: 初始值 iterations: 迭代次数 """ results = [x0] x = x0 for _ in range(iterations): x = r * x * (1 - x) # 混沌公式 results.append(x) return results# 两个非常接近的初始值x1 = 0.5x2 = 0.500001 # 只差 0.000001r = 3.9 # 混沌参数iterations = 50# 分别计算两条轨迹trajectory1 = logistic_map(r, x1, iterations)trajectory2 = logistic_map(r, x2, iterations)# 绘图对比plt.figure(figsize=(10, 6))plt.plot(trajectory1, label=f'初始值 = {x1}', alpha=0.7)plt.plot(trajectory2, label=f'初始值 = {x2}', alpha=0.7)plt.title('混沌系统:微小的初始差异导致完全不同的结果')plt.xlabel('迭代次数')plt.ylabel('值')plt.legend()plt.show()你会看到,两条曲线一开始几乎重合,但很快就完全分道扬镳。股市中,一条小道消息、一个交易员的情绪波动,都可能成为那只「蝴蝶」。
传统统计学假设数据服从正态分布(钟形曲线),极端事件非常罕见。但股市有「肥尾」现象——暴涨暴跌比正态分布预测的要频繁得多。
用 Python 对比一下:
import numpy as npimport matplotlib.pyplot as pltfrom scipy import stats# 生成正态分布和 t 分布(肥尾)的数据np.random.seed(42)n_samples = 10000# 正态分布:极端值很少normal_data = np.random.normal(0, 1, n_samples)# t 分布(自由度 = 3):有肥尾,极端值更多t_data = stats.t.rvs(df=3, size=n_samples)# 绘制直方图对比fig, axes = plt.subplots(1, 2, figsize=(12, 5))axes[0].hist(normal_data, bins=100, density=True, alpha=0.7)axes[0].set_title('正态分布:极端值罕见')axes[0].set_xlim(-10, 10)axes[1].hist(t_data, bins=100, density=True, alpha=0.7, color='orange')axes[1].set_title('肥尾分布:极端值更常见(类似真实股市)')axes[1].set_xlim(-10, 10)plt.tight_layout()plt.show()# 统计极端值的数量print(f"正态分布中 |值| > 3 的比例: {np.mean(np.abs(normal_data) > 3):.4f}")print(f"肥尾分布中 |值| > 3 的比例: {np.mean(np.abs(t_data) > 3):.4f}")在投资中,那些「百年一遇」的黑天鹅事件,实际发生的频率远超正态分布的预测。2008 年金融危机、2020 年新冠熔断,都是活生生的例子。
机器学习最大的陷阱之一就是「过拟合」——模型记住了历史数据的噪声,而不是学到了真正的规律。
这在股市预测中尤其严重,因为很多看起来像规律的东西,其实只是随机噪声。
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.linear_model import LinearRegression# 生成随机的「股价」数据np.random.seed(42)days = 30X = np.arange(days).reshape(-1, 1)# 真实数据 = 轻微上涨趋势 + 大量随机噪声y = 100 + 0.5 * X.flatten() + np.random.normal(0, 3, days)# 用高阶多项式拟合(过拟合的典型做法)poly = PolynomialFeatures(degree=15) # 15 阶多项式,明显过度X_poly = poly.fit_transform(X)model = LinearRegression()model.fit(X_poly, y)# 预测X_smooth = np.linspace(0, days - 1, 100).reshape(-1, 1)X_smooth_poly = poly.transform(X_smooth)y_pred = model.predict(X_smooth_poly)# 绘图plt.figure(figsize=(10, 6))plt.scatter(X, y, label='历史数据', alpha=0.7)plt.plot(X_smooth, y_pred, 'r-', label='过拟合的模型', linewidth=2)plt.title('过拟合:模型完美拟合历史,但这不是预测能力')plt.xlabel('天数')plt.ylabel('价格')plt.legend()plt.show()print("警告:这个模型在历史数据上看起来很准,")print("但它学到的是噪声,不是真正的规律!")研究表明,很多被学术论文发现的「市场规律」,一旦被公开并被大量交易者使用,其效果就会大幅下降。模型改变了市场本身。
机器学习在图像识别、语音识别等领域非常成功,但在股市预测上却困难重重。原因在于:
第一,市场会对模型做出反应。天气预报再准确,天气也不会因此改变;但如果一个交易策略被广泛使用,市场行为就会改变,策略就会失效。
第二,市场规则不稳定。物理定律几十亿年不变,但市场参与者、监管规则、宏观环境都在不断变化。
第三,错误会不断累积。预测错误会影响下一步的决策,而错误的决策又会带来更多损失。
既然预测这么难,是不是就没办法了?当然不是。关键是转变思维:从「预测会发生什么」变成「为各种可能做好准备」。
用 Python 做一个简单的蒙特卡洛模拟,看看投资的可能结果范围:
import numpy as npimport matplotlib.pyplot as pltdef monte_carlo_simulation( initial_investment, annual_return, annual_volatility, years, simulations): """ 蒙特卡洛模拟:模拟投资的多种可能结果 """ days = years * 252 # 交易日数量 daily_return = annual_return / 252 daily_volatility = annual_volatility / np.sqrt(252) results = [] for _ in range(simulations): prices = [initial_investment] for _ in range(days): # 每天的收益率是随机的 change = np.random.normal(daily_return, daily_volatility) prices.append(prices[-1] * (1 + change)) results.append(prices) return np.array(results)# 运行模拟np.random.seed(42)simulations = monte_carlo_simulation( initial_investment=100000, # 初始投资 10 万 annual_return=0.07, # 假设年化收益 7% annual_volatility=0.20, # 年化波动率 20% years=10, # 投资 10 年 simulations=1000 # 模拟 1000 次)# 绘图plt.figure(figsize=(12, 6))for i in range(100): # 只画 100 条路径,避免太乱 plt.plot(simulations[i], alpha=0.1, color='blue')# 画出中位数和 5%/95% 分位数median = np.median(simulations, axis=0)percentile_5 = np.percentile(simulations, 5, axis=0)percentile_95 = np.percentile(simulations, 95, axis=0)plt.plot(median, 'r-', linewidth=2, label='中位数')plt.plot(percentile_5, 'g--', linewidth=2, label='5% 分位数(较差情况)')plt.plot(percentile_95, 'g--', linewidth=2, label='95% 分位数(较好情况)')plt.title('蒙特卡洛模拟:10 年投资的可能结果范围')plt.xlabel('交易日')plt.ylabel('投资组合价值')plt.legend()plt.show()# 输出统计结果final_values = simulations[:, -1]print(f"10 年后的投资结果统计(初始投资 10 万):")print(f" 中位数: {np.median(final_values):,.0f} 元")print(f" 最好的 5%: 超过 {np.percentile(final_values, 95):,.0f} 元")print(f" 最差的 5%: 低于 {np.percentile(final_values, 5):,.0f} 元")print(f" 亏损的概率: {np.mean(final_values < 100000):.1%}")这种思维方式的核心是:我们无法预测具体会发生什么,但我们可以评估各种情况的可能性,并为最坏的情况做好准备。
通过这篇文章,我们用 Python 代码理解了几个关键概念:
随机游走告诉我们,如果信息已经反映在价格中,过去的走势就无法预测未来。
混沌理论告诉我们,即使市场有规律,微小的初始差异也会导致完全不同的结果。
肥尾分布告诉我们,极端事件比我们想象的更常见,不能用正态分布的思维来做风险管理。
过拟合陷阱告诉我们,模型在历史数据上表现好,不代表能预测未来。
机器学习的局限告诉我们,市场会对模型做出反应,这和预测天气完全不同。
所以,与其追求预测的准确性,不如学会在不确定性中做出明智的决策。这才是数学真正能教给我们的东西。
对于 Python 学习者来说,量化投资是一个很好的练手领域,但要时刻记住:代码能力是必要条件,不是充分条件。理解这些数学上的限制,会让你在这条路上走得更稳。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐