Zing 论坛

正文

从零开始构建神经网络:用纯NumPy实现Nifty 50波动率预测

一个完全使用NumPy从零实现的神经网络项目,包含手动推导的前向传播、反向传播、小批量梯度下降和动量优化,应用于印度Nifty 50指数的实际波动率预测任务。

神经网络NumPy从零实现反向传播梯度下降动量优化波动率预测Nifty 50时间序列金融机器学习
发布时间 2026/08/11 19:51最近活动 2026/08/11 19:58预计阅读 5 分钟
从零开始构建神经网络:用纯NumPy实现Nifty 50波动率预测
1

章节 01

导读 / 主楼:从零开始构建神经网络:用纯NumPy实现Nifty 50波动率预测

一个完全使用NumPy从零实现的神经网络项目,包含手动推导的前向传播、反向传播、小批量梯度下降和动量优化,应用于印度Nifty 50指数的实际波动率预测任务。

3

章节 03

补充观点 1

原作者与来源

  • 原作者/维护者:omar-dev6002
  • 来源平台:github
  • 原始标题:neural-net-from-scratch
  • 原始链接:https://github.com/omar-dev6002/neural-net-from-scratch
  • 来源发布时间/更新时间:2026-08-11T11:51:00Z 原作者与来源\n\n- 原作者/维护者: omar-dev6002\n- 来源平台: GitHub\n- 原项目标题: neural-net-from-scratch\n- 项目链接: https://github.com/omar-dev6002/neural-net-from-scratch\n- 发布时间: 2026年8月11日\n\n项目背景与动机\n\n在深度学习框架(如TensorFlow、PyTorch)大行其道的今天,大多数开发者已经习惯了调用高级API来构建神经网络。然而,这种便利性也带来了一定的代价:许多从业者对神经网络底层的数学原理和实现细节缺乏深入理解。\n\n本项目作者选择了一条更具挑战性的道路——完全从零开始,仅使用NumPy实现一个功能完整的神经网络。与大多数"从零实现"项目停留在MNIST手写数字识别这类玩具数据集不同,本项目将神经网络应用于真实的金融市场预测任务:印度Nifty 50指数的已实现波动率预测。这是一个回归问题,而非分类问题,更具实际应用价值。\n\n核心架构设计\n\n项目采用模块化的设计思路,从最基本的神经元开始逐步构建:\n\n1. 单层神经元实现\n\n项目首先实现了单个神经元的前向传播和反向传播逻辑,这是理解神经网络最基础的单元。通过手动实现权重更新和偏置调整,开发者可以直观感受梯度下降的工作机制。\n\n2. 可配置的全连接层(Dense Layer)\n\n在单神经元基础上,项目扩展为支持任意输入/输出维度的全连接层。这一层可以处理批量输入数据,为构建深层网络奠定基础。\n\n3. 可链式组合的NeuralNetwork类\n\n最终的NeuralNetwork类支持将多个Dense层串联起来,形成深度网络结构。这种设计允许灵活地调整网络深度和宽度,以适应不同复杂度的任务。\n\n手动推导的反向传播算法\n\n本项目的核心亮点在于所有数学推导都是手工完成的。作者在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对于希望深入理解神经网络内部机制的学习者,本项目是一个极佳的参考案例。它不仅展示了"如何实现",更重要的是展示了"为什么这样实现"。