资源
分析方法
StockVS如何运作
StockVS由一套自动化流水线生成:数据收集、夜间构建、自动化检查和发布,以下将逐一说明。
数据收集
市场数据通过开源的yfinance库从Yahoo Finance获取:每日股价与成交量、股息,以及包含关键统计数据的公司与基金概况,股票的年度利润表,ETF的主要持仓。所覆盖的证券来自美国和加拿大交易所的公开上市名单;新闻标题来自Finnhub新闻服务。对于存托凭证(ADR),市值是ADR价格乘以ADR等值股数,即Yahoo Finance报告的数值;当ADR以溢价交易时,其市值可能与公司本国市场的价值不同(例如TSM和SKHY)。
数据管道
收集任务将每只证券的价格与概况,以及股票的新闻标题,写入PostgreSQL数据库。每晚,一次静态站点构建会根据该数据库渲染出全部页面,随后自动化检查会检验结果;只要有一项检查失败,就不会上传任何内容,此前的版本会继续在线运行。通过检查的构建会上传到Cloudflare网络背后的静态托管服务,随后系统会随机抽取一批新页面进行加载,以确认它们能够正常响应。
更新时间表
价格在每个交易日收盘后收集,收集完成后即启动夜间构建,因此页面通常会在当晚显示当天的收盘价;周末的构建使用上一个交易日的数据。公司概况和关键统计数据每个工作日刷新;ETF持仓和ETF完整历史价格每周刷新,每家公司的利润表大约每季度刷新一次,新上市证券则在一周内完成刷新。股票的新闻标题对大公司每日更新,对较小公司每隔几天更新一次。如果某个工作日的数据收集失败,当晚的构建就不会运行,此前的版本继续在线,并由监控系统发出警报。
数据的计算方式
近期区间、日历年度和月度的回报率,均基于已存储的每日收盘价计算;这些收盘价是Yahoo Finance在各自下载时按拆股和股息调整后的数值。波动率是每日回报率的年化标准差。市值、估值比率、利润率、每股收益和股息率均按Yahoo Finance报告的数值原样显示,超出合理范围的数值不予显示。数据保留其原始报告货币——美元或加元——绝不进行换算;跨两种货币的合计会按币种分别列出。行业比较采用行业中位数,百分比之间的差距以百分点表示。
分析文字的生成方式
股票和ETF页面上的分析,是将各支持语言中预先写好的句子模板,填入数据库中的数值组装而成。缺失的数据会直接省去相应句子,而不会留下占位符。模板描述的是数据本身以及它与行业中位数的比较,不包含评级、推荐或预测。网站构建时不会运行任何语言模型,也没有模型为任何一只股票或基金单独撰写文字。部分新闻标题旁的抽象插图,是由图像模型一次性生成的,并不描绘对应的新闻事件。
质量控制
在数据收集阶段,只有该证券自身市场处于开市状态的那一天的价格才会被存储,当天的价格只有在收盘之后才会被存储,每日更新也不会用实时报价覆盖已存储的收盘价。数据源提供的被截断的名称,不会替换已存储的完整名称;不再返回价格的证券会在运行报告中被标记。在页面上,不再是最新的价格会显示其最后一次成交的日期,同时在多地上市的公司只会计入一次。
在每晚发布之前,自动化检查会逐页或按抽样方式读取构建完成的网站。构建的规模必须与上一次发布的版本相近,页面数量必须不少于其站点地图列出的数量,价格的新鲜度也必须满足计划要求。结构化数据必须格式正确,价格日期必须落在交易日且不得晚于当前日期,每个页面必须只带有一个数据日期,各页面之间的计数与合计必须保持一致。任何表格都不得将同一家公司列出两次,也不得将不同货币的数额相加。分析文字和列表摘要必须使用该页面语言对应的文字系统。
已知限制
StockVS不提供实时报价:数据均为收盘后数据,当Yahoo Finance延迟公布收盘价或数据收集失败时,部分页面可能会落后一个或多个交易日。数值的准确性取决于Yahoo Finance数据本身的准确性。并非所有财务指标都适用于每一只股票或ETF。历史数据的可用时长因股票代码而异。大多数历史价格是逐日累积延长的,因此后续进行的拆股或股息调整未必会追溯到更早的价格,长期回报率可能与其他来源存在差异。停止交易的证券仍会保留其页面,最后一个价格会标注为不再是最新数据,公司简介仅出现在英文版的股票页面上。
更正
错误由上文提到的自动化检查以及对已发布页面的复查发现。每个错误都会在其源头——数据、计算或模板——处修正,并在下一次夜间重新构建中反映到所有受影响的页面;更正记录在项目内部的问题跟踪系统中。目前尚无公开渠道可用于报告错误。