我构建了一个风险驱动的 Stock Portfolio Optimizer(以及我学到的东西)
Source: Dev.to
像许多开发者一样,我也见过很多声称通过模糊的 AI 说法或黑箱优化实现超额收益的 “投资组合构建” 工具。
我想从另一个角度探索:如果是风险受控的投资组合结构——而不仅仅是哪些股票被标记为 “风险”——在驱动优化器?
👉 实时演示:

核心理念
大多数零售投资工具把风险当作副作用来处理:
- 更高风险 → “更风险的股票”
- 更低风险 → “更安全的股票”
实际上,投资组合并不是这样运作的。风险容忍度通常影响:
- 你愿意多集中持仓
- 你允许多少行业敞口
- 你的配置可以多不对称
在 StockRisker 中,风险直接控制投资组合约束:
- 更高风险 = 更少的惩罚,更高的集中度上限
- 更低风险 = 更严格的分散规则
风险不只是一个标签——它是结构性的输入。
优化器的工作原理(高层概览)
优化器围绕三层结构构建:
风险映射
用户选择一个风险等级(1–10)。该数值动态控制:
- 每只股票的最大配置比例
- 每个行业的最大配置比例
- 分散惩罚的强度
在高风险等级时,惩罚会放宽,而不是强行生成“不安全”的投资组合,从而更贴合用户意图。
基于约束的投资组合生成
投资组合在以下约束下进行评估:
- 硬约束(绝不能被违反)
- 软约束(作为评分惩罚应用)
这避免了常见的失败模式——优化技术上成功,却产生不切实际的投资组合。
可解释的评分
每个投资组合使用加权函数进行评分,平衡:
- 预期收益估计
- 波动率和分散度
- 集中度和行业敞口
如果结果看起来可疑(例如,收益极高而波动率相对低),界面会显示上下文警告,而不是隐藏风险。没有 “保证超额收益” 的宣传语。
我的优化目标
最有趣的挑战之一并非数学,而是期望管理。我有意避免以下做法:
- 承诺击败标普 500
- 使用不透明的 AI 模型
- 给出唯一的 “正确” 投资组合
相反,工具帮助用户思考权衡:
- 集中 vs. 分散
- 风险偏好 vs. 波动率
- 简单 vs. 优化
技术栈
- 后端: TypeScript + Node.js
- 模块化的优化器设计(风险映射 → 约束 → 评分)
- 为性能和稳定性缓存股票全集
- 前端: 干净、极简的 UI,侧重于清晰和可解释性
该架构旨在支持未来的扩展,例如:
- 回测
- 风险调整指标(夏普比率、回撤)
- 场景模拟
我的收获
- 风险是 UX 问题,而不仅仅是数学问题——用户需要了解投资组合为何如此。
- 约束比算法更重要——一个带有良好约束的简单优化器胜过一个没有约束的复杂优化器。
- 透明度比性能宣称更能建立信任——展示局限性实际上会提升信心。