Skip to content

Repository files navigation

xmoat · 护城河

写给长期持有者的基本面 / 价值投资分析工具

以财报、估值、分红和雷区为主,价格只用来回答"现在在什么位置"。

基于 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.bat

Linux 上用 ./start.sh。打开 http://127.0.0.1:8688/,在右上角输入股票代码加入自选。 第一次抓取一只股票会拉取全部历史,数据源繁忙时可能要一分钟,之后的刷新是增量的。

命令行

bin/xnet.exe cli.lua report 600519
bin/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 value

bin/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-refresh
bin/xnet.exe cli.lua screen roe_min=15 pe_max=20 cap_min=100 ocf_to_eps_min=0.8
bin/xnet.exe cli.lua scan universe=market limit=6000 ma_weeks=8 above_pct=3

快照一次覆盖 5500 多只,十几秒抓完,内容是当日估值加最近一个年报的业绩。 筛选只负责缩小范围:某只是不是真便宜、有没有雷,还要进个股页看它自己的历史分位和检查清单。

提醒与推送

  1. 把 xmoat.local.cfg.example 复制成 xmoat.local.cfg,填上要用的渠道: 企业微信群机器人、企业微信应用(发给成员本人)、飞书(可加签)、钉钉(可加签)、 Telegram(可单独走代理)或通用 Webhook。
  2. 在 Web 界面的「提醒」页点「发送测试消息」,或者:
bin/xnet.exe cli.lua notify-test
  1. start.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 600519
bin/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 复制来的模块子集,不是 submodule
  • bin/ 不进版本库,运行时按平台从 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,代价是每只股票的缓存变大。

致谢

  • xnet2lua:运行时
  • gitloom:模块隔离、原子写入、协程与定时器的工程做法

许可证

BSD 2-Clause,与 xnet2lua 一致。

⚠️ 免责声明

本项目仅供学习和研究使用,不构成任何投资建议。输出的估值与判断基于公开数据和预设规则,可能存在数据错误和模型局限。投资有风险,决策需独立判断,作者不对使用本项目产生的任何损失负责。

About

Fundamental & value-investing research tool for A-share / HK / US stocks — earnings quality, valuation percentiles, dividends and red flags, summarized when filings land. Written in Lua on xnet2lua.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages