美股估值与情绪看板
内容提要
作者开源了一个美股市场看板,将SPY、QQQ、VIX、恐惧贪婪指数、标普500 PE、高收益债利差等分散指标聚合到一页,标明来源与日期,并把定投倍率规则写成代码,避免凭感觉判断。项目采用多源回退与三层缓存,失败时返回503而非假数据;图表均手写SVG/CSS,未使用图表库。作者还记录了移动端吸顶标签被地球遮挡、锁屏后Canvas空白两个bug及其修复。
延伸解读
数据可信度优先于视觉美观
作者在设计看板时,把“不展示假数据”作为核心原则。当所有回退源都失败时,接口返回503而非填充模拟值;数据降级或使用回退源时,页面会显示黄色提示条。这种设计让读者能明确区分“新鲜数据”和“上次成功数据”,避免被看似正常但实际过期的数字误导。对于金融数据展示类项目,这种透明性比界面美观更重要。
规则化定投倍率的防误判逻辑
倍率规则严格按顺序判定,命中即停。估值分位≥90%时倍率降至0.25倍,优先于情绪信号;低置信指标(如RSI)单独触发只给1.5倍,需第二项确认才升级。数据缺失≥2项时直接退回1倍并标注“数据不足”。这种设计防止了“越跌越买”的冲动,也避免了在数据不完整时做出过度反应,体现了规则可复现、可检验的初衷。
移动端交互的隐性成本
作者记录了v1.0.1和v1.0.2两个移动端bug:吸顶标签被固定定位的Canvas地球遮挡点击,以及锁屏后Canvas内容被浏览器回收导致空白。修复方式包括在触摸设备禁用地球命中测试、监听visibilitychange等事件重绘。这两个问题在桌面浏览器上不会出现,修复耗时超过另外五个面板的开发,说明移动端适配需要单独考虑交互假设和生命周期事件。
自建部署与数据留存的选择
看板支持Vercel一键部署,但Vercel没有持久磁盘,倍率轨迹文件data/snapshots.jsonl可能被清空。若想保留历史轨迹,需自建Node服务并将data/目录挂到持久卷。作者强调“数据得留在自己的磁盘上”,才能观察规则在真实历史中的行为。这一取舍提醒读者:演示部署与长期数据留存的目标不同,需根据需求选择部署方式。
Q&A
这个美股看板主要解决什么问题?
它解决的是每天早上花五分钟看清“美股现在贵不贵、市场慌不慌”的问题。作者原本需要从四五个站点分别查看SPY/QQQ离高点距离、VIX、恐惧贪婪指数、标普500 PE分位、高收益债利差等指标,信息分散、口径不透明、判断不可复现。看板将这些指标聚合到一页,标明来源和日期,并把定投倍率规则写成代码。
看板的数据源有哪些?如果某个源失败了会怎么处理?
数据源包括:指数行情用Twelve Data(失败回退Nasdaq再回退FMP)、VIX/SKEW/VVIX用Cboe官方CSV、恐惧贪婪指数用CNN内部接口、标普500 PE用Multpl、高收益债OAS用FRED、RSP等权用Twelve Data单独缓存2小时。如果所有回退都失败,接口返回HTTP 503,不会用模拟值填充;部分数据降级或走回退源时,页面会显示黄色“数据源提示”条。
定投倍率规则是怎么计算的?为什么这样排序?
倍率规则严格按顺序判定,命中即停:1)真实指标缺失≥2项则1倍并标注数据不足;2)标普500 PE近5年分位≥90%且未陈旧则0.25倍;3)PE分位≥80%则0.5倍;4)高置信信号触发≥1项或触发总数≥2项则2倍;5)只有1项触发则1.5倍;6)无触发但有指标进入观察区则1.5倍;7)其余1倍。排序理由:数据不足不装懂;估值优先于情绪,防止越跌越买;低置信指标(如RSI(6))需第二项确认;陈旧数据不参与计算。
看板的图表是用什么库画的?为什么不用图表库?
所有图表都是手写SVG或CSS,没有引入任何图表库。原因有三:作者对视觉呈现有较强控制欲,图表库默认样式大多需要关闭;避免引入ECharts或Recharts等依赖增加首屏体积;数据结构(DashboardPayload)与手写图表对齐,TypeScript严格模式下字段改动会在编译期暴露。
移动端遇到过哪些bug?如何修复的?
v1.0.1修复了吸顶标签被地球遮挡的问题:移动端标签栏是position: sticky,而地球是固定定位的Canvas层且带拖拽热区,导致点击被地球命中测试吃掉;修复方式是在触摸设备上禁用地球的命中测试并隐藏提示框。v1.0.2修复了锁屏后地球变空白的问题:移动浏览器会回收不可见Canvas的后备存储,修复是监听visibilitychange、pageshow、contextrestored三个事件补画,并加60秒兜底重绘。
如何本地运行或部署这个看板?
本地运行:克隆仓库后执行npm install,复制.env.example为.env.local并填入TWELVE_DATA_API_KEY(必需),然后npm run dev。要求Node ≥ 20.9,首次冷启动需10–20秒。部署有两种方式:Vercel一条命令即可,但无持久磁盘,倍率轨迹文件可能被清空;自建Node服务器执行npm run build && npm start,设置PORT,将data/目录挂到持久卷,前面套Nginx或Caddy,这样轨迹才能保留。
这个看板有哪些使用边界或限制?
看板不是实时行情,全部是日线收盘或延迟数据(Cboe收盘后才更新);不是投资建议,只是展示公开数据并记录规则,规则正确性需用户自行判断;数据版权归各来源所有,项目不重新分发原始数据;PE是月度数据、OAS是T+1数据,看到“陈旧”标记是正常的,不是bug。