章节 01
导读 / 主楼:从零开始构建神经网络:用纯NumPy实现Nifty 50波动率预测
一个完全使用NumPy从零实现的神经网络项目,包含手动推导的前向传播、反向传播、小批量梯度下降和动量优化,应用于印度Nifty 50指数的实际波动率预测任务。
正文
一个完全使用NumPy从零实现的神经网络项目,包含手动推导的前向传播、反向传播、小批量梯度下降和动量优化,应用于印度Nifty 50指数的实际波动率预测任务。
章节 01
一个完全使用NumPy从零实现的神经网络项目,包含手动推导的前向传播、反向传播、小批量梯度下降和动量优化,应用于印度Nifty 50指数的实际波动率预测任务。
章节 02
章节 03
原作者与来源
derivations/derivations.md中详细记录了每一天的推导过程,并附有手写的照片。这种"白盒"实现方式让学习者能够:\n\n- 理解损失函数对每一层权重的梯度是如何计算的\n- 掌握链式法则在神经网络中的应用\n- 验证反向传播算法的正确性(通过XOR问题测试)\n\n优化算法实现\n\n除了基础的梯度下降,项目还实现了更高级的优化技术:\n\n小批量梯度下降(Mini-batch Gradient Descent)\n\n相比全批量梯度下降,小批量方法在计算效率和收敛稳定性之间取得了平衡。项目实现了灵活的小批量采样逻辑,支持自定义批量大小。\n\n动量优化(Momentum)\n\n动量机制通过积累历史梯度信息来加速收敛,并有助于逃离局部最优。项目中手动实现了动量更新规则,进一步提升了训练效果。\n\n实际应用:Nifty 50波动率预测\n\n数据获取与处理\n\n项目使用yfinance库获取Nifty 50指数的真实历史数据。数据预处理环节体现了严谨的金融建模原则:\n\n- 滞后特征工程:构建特征时严格避免前瞻偏差(look-ahead bias),确保模型只使用过去的信息预测未来\n- 时间序列分割:训练集和测试集按时间顺序划分,不进行随机打乱,符合金融时间序列建模的最佳实践\n- 目标变量归一化:使用min-max归一化将波动率映射到sigmoid的输出范围[0,1]\n\n模型性能对比\n\n项目在测试集上对比了三种方法的性能(以归一化MSE为指标):\n\n| 模型 | 测试损失(归一化MSE) |\n|------|---------------------|\n| 朴素基准(预测昨日波动率) | 0.344222 |\n| 从零实现的神经网络 | 0.000777 |\n| sklearn MLPRegressor(默认参数) | 0.006189 |\n\n从零实现的神经网络显著优于朴素基准,相比sklearn的MLPRegressor也有更好的表现(尽管超参数设置不完全相同,不宜直接比较优化器)。\n\n模型行为分析\n\n作者注意到一个有趣的现象:模型在波动率飙升期间表现良好,但在市场平静期存在系统性高估。这可能是因为训练数据中包含更多与波动率峰值相关的样本,导致模型对"平静期"的学习不足。这种深入的分析体现了作者对模型行为的细致观察。\n\n项目结构与使用\n\n\nsrc/ - 所有可运行代码(层实现、网络类、训练脚本)\ndata/ - 原始和处理后的Nifty 50数据集\nderivations/ - 手工推导的数学公式,按天记录\nnotebooks/ - 可视化图表和探索性分析\n\n\n快速开始\n\nbash\ncd src\npip install -r requirements.txt\npython data_pipeline.py 获取并处理Nifty 50数据\npython train_volatility.py 训练并评估网络\n\n\n学习价值与启示\n\n这个项目为深度学习学习者提供了宝贵的实践经验:\n\n1. 理论联系实际:手工推导公式后立即用代码实现,加深理解\n2. 真实数据应用:使用金融市场数据而非玩具数据集,体验实际建模挑战\n3. 工程实践:完整的端到端流程,从数据获取到模型评估\n4. 性能基准:与成熟库(sklearn)的对比,验证实现正确性\n\n对于希望深入理解神经网络内部机制的学习者,本项目是一个极佳的参考案例。它不仅展示了"如何实现",更重要的是展示了"为什么这样实现"。