写给长期持有者的基本面 / 价值投资分析工具
以财报、估值、分红和雷区为主,价格只用来回答"现在在什么位置"。
基于 xnet2lua(C 网络内核 + 内嵌 Lua)编写,一个运行时二进制加一目录 Lua 脚本,不需要 Python 环境。
状态:A 股部分已完整可用。 全市场筛选、四套指标模板(一般企业、银行、保险、证券)、估值分析、 检查清单、定时检查、变化提醒、六种推送渠道,基于年报经营评述的护城河解读和问答, 以及技术面、买卖点位、当日复盘和信号回测都已实现,有 515 项离线测试。 港股美股还没有;手机客户端只提供接口,不在本仓库实现,见 路线图。
价值投资问的是生意和价格的关系。生意决定要不要买,价格决定什么时候买——顺序不能反:
| 先问 | 再问 | 从不问 | |
|---|---|---|---|
| 关注什么 | 生意质量、财务健康、估值高低 | 价格在自己的历史里处于什么位置 | 明天涨还是跌 |
| 数据节奏 | 财报按季更新 | 日线每天更新,只做位置和支撑 | 盘中信号、资金流向、消息面 |
| 输出 | 估值分位、安全边际、检查清单、雷区 | 买入区间 / 止损 / 目标,连规则一起给 | 不带依据的目标价 |
| 什么时候提醒 | 发财报、发分红、估值穿过你设的区间 | 收盘后的一次复盘 | 每个交易日的行情播报 |
点位和技术面是后来加的,加法是:它们只回答"位置",回答不了"值不值得", 而且每个数字都带着产生它的规则——换一组分位假设就是另一组价格,这句话写在输出里。
这是门好生意吗?
- ROE、ROIC 连续多年的水平,而不是单一年份
- 毛利率的均值和波动幅度:定价权通常先体现在毛利率上
- 利润含金量:经营现金流与净利润之比
- 金融行业各有各的一套:
- 银行:不良率、拨备覆盖率、净息差、核心一级资本充足率
- 保险:偿付能力充足率、内含价值、新业务价值及价值率、净投资收益率、退保率,估值另给 P/EV
- 证券:风险覆盖率、资本杠杆率、流动性覆盖率、净稳定资金率、净资本占净资产比例、自营权益敞口
现在贵不贵?
- PE(TTM)、PB、PS、PCF 在自身全部历史和近 5 年里的分位、中位数和区间
- 近 12 个月股息率
- 反向 DCF:用现价倒推市场隐含的增长率,看这个增长率是否合理
- 你自己设定的合理估值区间,当前价格落在哪一侧
股东拿到了什么?
- 每年每股派现、分红率、连续分红年数
有没有雷?
- 存贷双高、应收账款或存货增速远超营收
- 经营现金流与净利润背离、利润靠非经常性损益
- 商誉占净资产比例过高、现金覆盖不了短期借款
- 计划中:大股东质押、非标审计意见
先看哪些?
- 全市场按 ROE、估值、增速、毛利率、现金流含金量等条件筛选,一次抓取覆盖 5500 多只
- 从结果里直接加入自选,再看它自己的历史分位和检查清单
现在在什么位置?
- 均线(5/10/20/60/120/250)、是否多头排列、乖离率
- 收盘价在近 250 日和近 60 日区间里的分位,距高点多远
- 量能:5 日均量 / 60 日均量
- 筹码分布:按换手率估算的平均成本、获利比例、90% 成本区间和集中度
什么价位买,什么价位走?
- 买入区间:锚指标(PE,银行保险券商用 PB)回到自身历史低分位对应的价格;设了合理区间就用你的
- 目标价:回到历史高分位或你区间上沿对应的价格
- 止损价:现价下方最近的支撑(均线、筹码下沿、年内低点)再留 3% 缓冲
- 每个数字都写明依据,并提醒:估值锚把今天的盈利固定住了,下一份财报会让它们全部移动
今天市场怎么样?
- 三段式复盘:大盘(四个指数 + regime 状态)→ 结构(板块涨跌、领涨领跌)→ 自选(谁进了买入区间、谁破了止损)
- regime 只有三种状态,规则是故意做粗的:它是阅读背景,不是择时
全市场有哪些股票?
- 一次快照拿下全部 A 股(约 5500 只,含名称、行业、板块、市值、PE、ROE),之后离线可查
stocks列出来,prefetch把它们的日线批量抓到本地(32 条连接并发,实测 1000 只 14.5 秒、零失败)- 抓完之后,扫描和参数拟合都在本地跑,不再联网
谁现在在发信号?
- 「横盘之后上穿均线」这类价格规则,可以在一组股票上扫描当前信号;规则的数字是配置项(
BREAKOUT_*),网格用来选它们 - 参数(几周均线、突破多少)用网格在历史上拟合,每格都和「随便哪天买」的基准并排
- 全市场扫描走通达信协议:二进制长连接、多条并发,全市场 5307 只离线扫描 9.7 秒
这条规则在哪里更有效?
- 按行业、板块、地域分组,每组和它自己的基准比——否则排在前面的只是这五年涨得好的行业
- 汇总行写明有多少组跑赢了自己的基准:接近一半就是噪声
这条规则过去灵不灵?
- 在这只股票自己的历史上回放信号:低估值、多头排列、两者兼备,或你的区间下沿
- 方向胜率(持有 20/60/120/250 个交易日)、止盈止损命中率
- 旁边一列永远是"同一段时间随便哪天买"的同样统计——没有明显好过它,这条规则就什么也没加
我持有的呢?(登记持仓后)
- 自选项上登记成本价和股数,报告和复盘里就有浮动盈亏
- 点位和技术面提醒只对登记了持仓的股票推送:跌破止损、跌进买入区间、涨到目标价、均线转向
- 只看不持有的股票不会因为价格波动来打扰你
什么变了?
- 新财报发布、新分红方案(预案、通过、实施)
- 估值穿过你自己设定的区间,或进入历史低位 / 高位
- 检查清单出现新的提示,或提示解除
- 工作日收盘后自动检查,推送到企业微信(群机器人或应用)、飞书、钉钉、Telegram 或任意 Webhook
我持有的股票背后那样东西,走势变了没有?
- 网页「商品」页监控黄金、铜、原油等期货与现货(东方财富),以及存储芯片的现货价和合约价(DRAMeXchange)
- 价格跌破 N 期均线推送「走势掉头」,站回均线推送「转为上涨」;合约价按每期涨跌,上涨或由涨转跌时推送
- 盘中每 15 分钟看一次,收盘后的检查再看一次;加入时只记下现状,不推送
主营靠什么赚钱?
- 按产品、地区、行业拆分的收入、占比和毛利率
- 每条占比相对上一年的变化
护城河在哪里?(需要配置大模型)
- 从公司自己写的经营评述里归纳竞争优势、变化和风险,给出护城河来源与强度
- 就这家公司提问,回答只依据上面算好的事实
- 模型写出的每个数字都会和事实核对,找不到的当场标出来
数字由代码算,大模型不碰数字。 所有指标和估值都是确定性计算,每个数字都带着报告期和计算依据。 大模型只拿到算好的结果和公司原文,负责定性归纳;它写出的每个数字都会被抽出来和事实比对, 找不到的标为"未核实"。原因很简单:大模型会把 12.3% 抄成 13.2%,而这种错正是投资决策最怕的。
界面和后端分离。 引擎负责抓取、存储和计算,界面只负责展示。Web 页面、命令行和将来的手机客户端调用同一套命令、 拿到同一个分析对象,谁都不自己算数字。详见 架构。
累计值和公告日。 季报和中报的利润是年初至今的累计数,TTM 统一按"最新累计 + 上年年报 − 上年同期累计"计算。 每期报告都保存了公告日;历史估值直接用数据源每日的计算值,不用今天看到的报告回算过去。
不同行业用不同的模板。 银行没有有意义的毛利率,高负债是经营常态,套用一般企业的检查清单只会得出错误结论。 保险和证券也一样:它们的关键指标是监管定义、公司披露的(偿付能力充足率、风险覆盖率),检查的阈值就直接用监管的预警线。
给点位,但绝不单独给。 买入区间、止损、目标价都是规则算出来的,每一个都连着产生它的依据 (哪个指标、哪个分位、哪条支撑),并写明什么会让它失效。不带依据的目标价是话术,不是分析。
回测要和基准并排。 一只涨了三倍的股票,随便哪天买的胜率都很高。信号的胜率只有和 "同一段时间随便哪天买"放在一起才有意义,所以两列永远一起显示。
本地缓存,增量更新。 日线、全市场快照、板块表都存在本地,再次查询先看缓存的时间戳, 够新就直接用,不够新才只补缺的那几天——对数据源客气,也让离线可用。
每个指标的具体口径见 docs/METRICS.md。
bin/ 不在仓库里。先从 xnet2lua 构建运行时,把 bin/xnet.exe(Windows)
或 bin/xnet(Linux)复制到本仓库的 bin/ 下。需要带 TLS 构建(默认就是)。
Web 界面
./start.batLinux 上用 ./start.sh。打开 http://127.0.0.1:8688/,在右上角输入股票代码加入自选。
第一次抓取一只股票会拉取全部历史,数据源繁忙时可能要一分钟,之后的刷新是增量的。
命令行
bin/xnet.exe cli.lua report 600519bin/xnet.exe cli.lua call stock.valuation code=600519 metric=pb years=5当日复盘(大盘、板块、自选三段):
bin/xnet.exe cli.lua review全市场股票列表(本地快照):
bin/xnet.exe cli.lua stocks board=star industry=半导体把一批股票的日线抓到本地,之后离线分析:
bin/xnet.exe cli.lua prefetch universe=market limit=6000 bars_days=400在这只股票的历史上回放信号(value / trend / value_trend / band):
bin/xnet.exe cli.lua backtest 600519 valuebin/xnet.exe cli.lua 不带参数会列出全部子命令。
测试(不联网,几秒钟)
bin/xnet.exe test/unit.lua配置项都在 xmoat.cfg 里,旁边写着理由。命令行 KEY=VAL 优先于 xmoat.local.cfg,后者优先于 xmoat.cfg。
默认只监听 127.0.0.1;要监听其他地址,必须先设置 API_TOKEN。
全市场筛选
网页上的「筛选」页分两种:定制规则是自己设条件(ROE、估值、增速……)在快照里筛;
内置规则是引擎自带、数字由配置决定的规则,目前是「横盘之后上穿均线」(默认横盘 8 周、
振幅 ≤10%,当天收盘上穿 10 周均线,个股月线向上;沪深300 不在多头时不推送),
点「筛选全市场」就在全部 A 股里找刚刚首次突破的股票——
第一次会用通达信把全市场日线抓到本地,一两分钟;之后十几秒。
默认参数跑出来的结果会记进「信号记录」:加入时间、信号日收盘,以及之后涨了多少。
每个交易日收盘后的检查也会自动跑一遍,只推送新加入的(SIGNALS_*)。命令行:
bin/xnet.exe cli.lua market-refreshbin/xnet.exe cli.lua screen roe_min=15 pe_max=20 cap_min=100 ocf_to_eps_min=0.8bin/xnet.exe cli.lua scan universe=market limit=6000 ma_weeks=8 above_pct=3快照一次覆盖 5500 多只,十几秒抓完,内容是当日估值加最近一个年报的业绩。 筛选只负责缩小范围:某只是不是真便宜、有没有雷,还要进个股页看它自己的历史分位和检查清单。
提醒与推送
- 把 xmoat.local.cfg.example 复制成
xmoat.local.cfg,填上要用的渠道: 企业微信群机器人、企业微信应用(发给成员本人)、飞书(可加签)、钉钉(可加签)、 Telegram(可单独走代理)或通用 Webhook。 - 在 Web 界面的「提醒」页点「发送测试消息」,或者:
bin/xnet.exe cli.lua notify-teststart.bat运行期间,每个工作日北京时间 17:30 自动检查一次(SCHEDULE_TIMES可改)。随时手动检查:
bin/xnet.exe cli.lua check推送的内容和格式见 docs/METRICS.md。
服务器在境外时,企业微信应用推送会被挡回 errcode 60020: not allow to access from your ip:
出口 IP 不在应用的「企业可信IP」里。而后台要求先配好「API接收消息」的回调地址才让填那一栏,
所以 xmoat 自带这个回调:在 xmoat.local.cfg 里填上后台给的 WECOM_CALLBACK_TOKEN 和
WECOM_CALLBACK_AES_KEY,http://<公网IP>:8688/wecom/callback 就能通过它的验证
(未认证企业可以直接用 IP,认证企业要备案域名)。回调只做验证,收到的事件读完就丢。
大模型解读(可选,会产生费用)
在 xmoat.local.cfg 里配置模型,Claude 或任何 OpenAI 兼容接口都行:
LLM_PROVIDER=anthropic
LLM_API_KEY=sk-ant-...
LLM_PROVIDER=openai
LLM_API_KEY=sk-...
LLM_BASE_URL=https://api.deepseek.com/v1
LLM_MODEL=deepseek-chat
LLM_FALLBACKS=0
配好之后,个股页面上会出现「大模型解读」:点一次生成护城河解读,也可以直接提问。命令行同样可以用:
bin/xnet.exe cli.lua insight 600519bin/xnet.exe cli.lua ask 600519 系列酒毛利率为什么低这么多自选股发布年报时会自动生成一次解读并随提醒推送(INSIGHT_ON_ANNUAL_REPORT=0 关闭)。
规则和数字核对方式见 docs/METRICS.md。
命令行输出的一部分(公司名和数字为虚构,格式与真实输出一致):
# 某公司(600XXX.SH)
白酒Ⅱ · 最新报告 2026中报(公告 2026-08-15)
## 估值(2026-09-17 收盘 88.00,市值 1100.00 亿)
| 指标 | 当前 | 全部历史分位 | 近 5 年分位 | 历史中位数 |
|---|---|---|---|---|
| PE(TTM) | 18.40 | 23% (2018-01-02 起) | 31% | 24.10 |
| PB(MRQ) | 3.10 | 18% (2018-01-02 起) | 22% | 4.35 |
- 股息率(近 12 个月):3.60%,每股派现 3.168 元
- 反向 DCF:现价隐含归母净利润(TTM)未来 10 年年化增长 4.2%(折现率 10.0%,永续增长 3.0%)
- 你的区间:PE(TTM) 15.00–20.00,当前 18.40,位于区间
## 点位(按规则计算,不是建议)
锚:PE(TTM),当前 18.40,全历史 2115 个交易日(2018-01-02 起),中位数 24.10
- 买入区间:71.77 – 78.72(PE(TTM) 回到全历史 10%–25% 分位)
- 目标价:105.60,较现价 20.0%(PE(TTM) 回到全历史 70% 分位)
- 止损价:74.53,较现价 -15.3%(最近的支撑(MA250 76.84)下方 3.0%)
- 盈亏比:1.31(到目标价的空间 / 到止损价的空间)
> 这些价格是规则算出来的,不是建议:换一组分位就是另一组价格。
> 估值锚把当前的盈利固定住了——下一份财报公布后,同样的分位会对应不同的价格。
## 技术面(2026-09-18 收盘 88.00)
- 均线:MA5 88.62 · MA10 89.31 · MA20 90.04 · MA60 87.12 · MA120 82.55 · MA250 76.84
- 排列:未形成排列;收盘价在 3/6 条均线上方
- 乖离率:BIAS6 -0.7% · BIAS12 -1.5% · BIAS24 -2.3% · BIAS60 1.0%
- 位置:近 250 个交易日 62.10–96.40,当前分位 76%,距高点 -8.7%
- 筹码:平均成本 81.36,获利比例 68%,90% 成本区间 69.20–93.10(集中度 15%,500 个交易日)
## 检查清单
- ✅ 利润有现金流支撑:经营现金流 / 净利润 近 3 年均值 1.12(2023-12-31 → 2025-12-31),阈值 0.8
- ⚠️ 应收账款没有远快于营收:2025-12-31 年报应收账款同比 38.0%,营收同比 9.0%,相差 +29.0pt(阈值 +20.0pt),应收账款占营收 12.4%
- ✅ 现金能覆盖短期有息负债:2026-06-30 货币资金 85.20 亿,短期借款 + 一年内到期非流动负债 13.50 亿,覆盖 6.31 倍
┌──────────── 客户端:只展示,不计算 ────────────┐
│ web/(浏览器) cli.lua(终端) 手机 App(计划)│
└───────────────┬──────────────────────────────────┘
│ 命令 + JSON 信封(docs/API.md)
┌───────────────┴──────────────────────────────────┐
host/ │ http.lua:把 METHOD + 路径映射到命令,提供静态页面 │
└───────────────┬──────────────────────────────────┘
│ api_call(name, params)
┌───────────────┴──────────────────────────────────┐
engine/ │ commands → stock / watch → analysis │
│ ├ fin · valuation · dividend · quality · checks │ 纯函数
│ ├ tech(均线/筹码)· levels(点位)· backtest │ 纯函数
│ ├ events(刷新前后对比)→ alerts → notify │
│ ├ schedule(定时检查,由宿主决定是否启动) │
│ ├ market(筛选)· review(复盘) │
│ ├ source_em(东方财富适配) → net → xhttp_client │
│ └ store(DATA_DIR 下的 JSON:记录、行情、快照) │
└──────────────────────────────────────────────────┘
- engine/ 不监听端口、不输出 HTML、不调用外部进程,所以能原样嵌入手机上的 xnet 运行时。 所有能力都是命令注册表里的一个命令,参数有声明、结果有统一信封。
- host/ 只做传输适配。
/api/v1的路由是从命令注册表自动生成的,新增命令不用改这里。 - web/ 是
/api/v1的纯客户端,所有来自接口的字符串都用textContent插入,页面受严格 CSP 保护。
手机客户端不在本仓库实现,但接口是为它留的,两种接法引擎都不用改:在本机 127.0.0.1 上跑
main.lua 并用 WebView 加载 web/;或者通过原生桥接直接调用 api_call,完全不开端口。手机系统会杀掉后台定时器,所以定时检查由宿主决定是否启动:
服务器上由 main.lua 启动,手机上应由系统的后台任务唤醒后调用 alerts.run。
工程约定沿用 gitloom:
- 每个模块在独立环境中加载,只通过
g_exports导出,导出名必须带模块前缀 - 网络请求在协程里等待;定时器只在主状态上创建(原因写在
engine/sched.lua开头) scripts/core/是从 xnet2lua 复制来的模块子集,不是 submodulebin/不进版本库,运行时按平台从 xnet2lua 复制
xmoat/
main.lua HTTP 宿主:引擎 + JSON API + 静态页面
cli.lua 命令行宿主
xmoat.cfg 全部配置项,理由写在旁边
engine/
manifest.lua 引擎模块清单,所有宿主按它加载
boot.lua 模块隔离加载器 + g_exports
cfg.lua util.lua 配置与日志;文件、JSON、数字、日期
sched.lua net.lua 协程等待与延时;出站 HTTP
source_em.lua 东方财富适配:字段映射到 xmoat 自己的字段名
fin.lua 年报序列、TTM、统计
valuation.lua 估值分位、反向 DCF、估值区间
dividend.lua 股息率、年度分红、连续分红年数
quality.lua 经营质量序列与汇总,按模板
checks.lua 检查清单与阈值
tech.lua 技术面:均线、乖离率、位置、量能、筹码分布
levels.lua 买入区间、止损价、目标价:估值锚 + 支撑锚
analysis.lua 分析对象:所有客户端展示的那一个结构
store.lua watch.lua stock.lua 存储、自选、抓取与增量合并
quote.lua 日线行情本地缓存:只补最后一天之后的部分
calendar.lua 交易日历:什么时候不可能有新数据(周末、假日、收盘前)
report.lua 分析对象 → Markdown;提醒 → 推送消息
events.lua 刷新前后对比:财报、分红、区间、估值分位、检查清单
alerts.lua 提醒记录、推送、立即检查
notify.lua 推送渠道:企业微信(群机器人 / 应用)、飞书、钉钉、Telegram、Webhook
wxcrypt.lua 企业微信回调的签名与解密
schedule.lua 定时检查
market.lua 全市场快照与筛选
review.lua 当日复盘三段:大盘与 regime、板块结构、自选
backtest.lua 在自己的历史上回放信号:方向胜率、止盈止损命中率
strategy.lua 一条规则在一组股票上:参数拟合、信号扫描、分组归因
groups.lua 行业 / 板块 / 地域归属(地域来自东财地域板块)
tdx.lua 通达信行情协议:二进制、长连接、可并发
source_tdx.lua 通达信日线 → xmoat 记录,前复权在这里做
source_dx.lua DRAMeXchange 存储芯片现货价与合约价
commodity.lua 商品监控:黄金、期货、存储价格的均线转向与合约价涨跌
llm.lua 一次模型调用:Claude 原生接口或 OpenAI 兼容接口
insight.lua 事实进、经过核对的解读出;问答
api.lua commands.lua engine.lua 命令注册表、全部命令、启动与停止
host/
http.lua web.lua HTTP 服务与路由;静态文件
wecom.lua 企业微信回调地址
web/ 浏览器客户端,无构建步骤
scripts/core/share/ 从 xnet2lua 复制的模块子集
test/unit.lua 离线测试
test/fixtures/ 从真实接口录制的响应
docs/API.md 接口契约
docs/METRICS.md 指标口径
| 市场 | 数据源 | 状态 |
|---|---|---|
| A 股 | 东方财富公开接口:主要财务指标、每日估值、分红送配、资产负债表、主营构成 | ✅ 已接入 |
| A 股 | 东方财富行情接口:日线(前复权,本地缓存增量更新)、指数、行业板块涨跌 | ✅ 已接入 |
| A 股 | 通达信行情协议(TCP):批量日线与除权数据,全市场扫描用;东方财富日线失败时的备用 | ✅ 已接入 |
| 商品 | 东方财富行情接口:期货、上海金交所现货、COMEX、外汇的日线 | ✅ 已接入 |
| 商品 | DRAMeXchange:存储芯片现货价(首页)与合约价;历史只对会员开放,从加入那天开始自己记 | ✅ 已接入 |
| A 股 | 巨潮资讯:定期报告与公告原文 | 计划中 |
| A 股 | Tushare Pro HTTP API | 计划中,作为备用源 |
| 美股 | SEC EDGAR XBRL companyfacts |
计划中 |
新数据源只需要输出和 engine/source_em.lua 相同字段的记录,分析模块不用改。
- Phase 0 · 设计:指标口径文档、数据字段映射、项目骨架
- Phase 1 · A 股核心:自选股、财报与估值抓取(增量)、质量与估值指标、分红、检查清单、银行模板、JSON 存储、命令行 Markdown 报告
- Phase 2 · 提醒:财报与分红检测、估值区间与历史高低位提醒、检查清单变化、推送(企业微信群机器人与应用、飞书、钉钉、Telegram、Webhook)、定时检查
- Phase 3 · Web 界面(提前完成基础部分):自选管理、个股基本面页、估值走势图、合理区间设置
- Phase 4 · 大模型:主营构成、年报经营评述归纳、护城河判断、基于事实的问答、回答中数字的自动核对
- Phase 5 · 扩展
- 保险与券商的专项指标模板
- 港股与美股
- 全市场条件筛选
- 手机客户端接口:引擎可嵌入、命令契约固定(见 架构)。客户端本身不在本仓库实现。
- Phase 6 · 价格这一侧
- 日线本地缓存,按最后一天增量补齐;复权变化自动整段重抓
- 技术面:均线与多头排列、乖离率、区间位置、量能、筹码分布
- 买卖点位:估值锚 + 支撑锚,附依据与失效条件
- 当日复盘:大盘与 regime、板块结构、自选提示
- 回测验证:方向胜率、止盈止损命中率,与同窗口基准并排
- 持仓登记(成本、股数、浮动盈亏),并以此作为点位与技术面提醒的开关
- 点位与技术面提醒(仅持仓股),收盘复盘随每日推送一起发
- 交易日历:周末、假日和收盘前不再空跑请求,假日是试出来的而不是写死的
- Phase 7 · 规则与批量
- 横盘后上穿均线:参数网格拟合(单只 / 一组股票)、当前信号扫描
- 网页「筛选 → 内置规则」:突破横盘周线,一键扫全市场
- 信号记录:首日突破记下加入时间与价格,跟踪之后的涨幅;收盘后自动跑,只推送新加入的
- 通达信行情协议:批量日线 + 自己做的前复权(与东财前复权误差 0.0036%)
- 并发预取:几条连接一起拉,扫描前先把整组股票的行情备齐
- 全市场:股票列表、批量预取、全市场扫描与拟合(上限 6000 只)
- 数据源的稳定性不由本项目决定。 东方财富的这些接口没有文档承诺,随时可能改字段或限流;实测过拉取完整估值历史要近一分钟的时候。解析和抓取分开写,并用录制的真实响应做测试,字段一变测试就会失败。
- 估值历史从 2018 年开始。 这是数据源能给的范围,所以"全部历史分位"大约是近 9 年,报告里会标明起始日期。
- 财报数据有错漏。 第三方数据源的科目归类不完全一致,追溯调整也未必及时反映。关键结论请对照原始公告,报告里给出了报告期和来源。
- 指标对新上市、亏损或周期性公司意义有限。 分位需要足够长的历史,PE 在亏损时没有意义,周期股的低 PE 往往出现在盈利顶点。
- 筛选用的是年报和当日估值,没有股息率和分位。 全市场数据源只有这两张表,分位和分红要逐只抓取。 筛选负责缩小范围,判断仍然回到个股页。
- 保险和证券的检查依赖公司披露。 偿付能力、风险覆盖率这些来自数据源转录的披露值,不是从三张表算出来的; 数据源缺某一期时,对应检查显示“数据不足”而不是通过。
- 大模型读到的是经营评述,不是年报全文。 数据源只提供最新一期的经营评述(一两千字),年报 PDF 没有解析。 评述是公司的自我陈述,解读里会注明。
- 解读是解读,不是事实。 数字核对只能发现事实里没有的数字,发现不了逻辑错误或过度乐观的推断。
- 筹码分布是模型,不是持仓。 没有人公布谁在什么价位持有,它是按换手率逐日衰减估算出来的; 限售解禁、大宗交易、同一批筹码反复换手都会让它失真。假设写在 docs/METRICS.md 里。
- 点位会随财报移动。 估值锚把今天的 TTM 盈利(或每股净资产)固定住了:下一份财报公布后, 同样的分位对应另一组价格。止损是机械的风险线,真正该让长期持有者离场的是基本面变坏。
- 回测只是一条路径。 一只股票的历史不是多次独立实验,胜率是对这条路径的描述,不是下一次的概率; 不含交易成本、滑点和停牌。所以基准列永远在旁边。
- 复盘的涨跌家数是板块口径。 东方财富的细分行业互相重叠,一只股票会出现在多个板块里, 所以数的是"多少个板块涨了",不是"多少只股票涨了";逐只统计要几十次请求,不值当。
- 通达信的日线没有换手率,所以用它抓的股票没有筹码分布。自选股和指数先走东方财富, 换手率和筹码都在;东方财富拒绝时(它会整段时间封一个地址)改用通达信,当天没有筹码, 它恢复后整段重取回来。通达信那条路主要是给几百只股票的扫描用的。
- 扫描是信号,不是结论。 它只说价格从一个平台上走了出来。这家公司值不值得买, 仍然要看财报、估值和检查清单——工具的顺序没有变。
- 日线默认只留最近 1200 个交易日。 约四年多,够 250 日均线、筹码分布和跨周期回测用;
需要更长可以调
QUOTE_MAX_DAYS,代价是每只股票的缓存变大。
BSD 2-Clause,与 xnet2lua 一致。
本项目仅供学习和研究使用,不构成任何投资建议。输出的估值与判断基于公开数据和预设规则,可能存在数据错误和模型局限。投资有风险,决策需独立判断,作者不对使用本项目产生的任何损失负责。