18 Commits

Author SHA1 Message Date
xbtlin 8ab676f18c terminal_value.py 新增 audit 准出检查;接进 investment-research skill 成为流程硬约束
一、tools/terminal_value.py 新增 audit 子命令
把三条纪律从"文档里的提醒"变成程序判定的【准出】/【打回】(退出码 0/1):

  C1 币种一致性 — r 落在别的币种区间、或基准档 g 超过本币上限即打回。
     内置护栏:CNY r∈[6%,9%] g≤2% Rf=1.70%;USD/HKD r∈[9%,11.5%] g≤4% Rf=4.70%。
     两个币种 r 区间差的3个百分点全部是国债利差,不含风险判断差异。
     乐观档按设计是基准+1pct,故额外放宽1pct。
  C2 分母宽度 — 任一档 r-g < 5pct 即打回,≤0 判模型失效。
     确需做上行/下行情景可加 --upside-only 显式声明,但报告须写明"是情景不是估值"。
  C3 离散风险归属 — 风险归属写成 折现率/r/beta 一律打回;未建模仅警告但须进"限制"章节。
     β 偏离 1.0 必须给 --beta-justification。

二、skills/investment-research.md 第七步新增"长期折现估值(十年尺度)"
四步流程:定输入(r/ROIC/g 三张判断表 + 常见错误)→ audit 准出 → 出数 → 报告必写四件事。
明确终值倍数只有永续增长模型一个合法来源,不许用同业类比(循环论证)。
明确 g 不随 r 变:g 是对终值年后经济的判断,r 是要求回报,做敏感性时只动 r。

三、准出流程新增 Step 4 估值口径复检
第七步的 audit 在算数之前,而写报告时常回头调 g 或 r——准出前最后一次 audit
才是对报告负责的那一次。退出码 1 即打回。
2026-08-17 03:18:42 +08:00
xbtlin a7df541ddc 新增 tools/terminal_value.py;7公司横评恢复 r=6% 档(人民币口径)
一、新增终值倍数与十年IRR推演工具 tools/terminal_value.py
零外部依赖,Python 3.7+,7家公司参数(ROIC/三档g/三档概率/IRR锚点)内置为预设。
六个子命令:pe(单点退出PE带完整算式) / company(单公司三档) / table(横评排序) /
sweep(多档r敏感性+排序稳定性) / check(分母宽度体检) / irr(从零算IRR)。

工具内置三条纪律:
  1. --g-shift 强制显式声明币种换算,不允许 r 与 g 隐式混用
  2. 每格自动体检分母 r-g,低于5pct打警告、为负判失效
  3. 文档头写明离散风险(退市/VIE/地缘)不得放进 r 或 beta

校验:反算初版 r=10% 与 r=8% 两张表,退出倍数与三档IRR逐项吻合。

二、恢复 r=6% 档(新增 3.6.5 节)
上一版以"隐含股权风险溢价仅1.3个百分点"为由删除 r=6%,但那个1.3%是在美元口径下
算的(4.70%美债+1.3%),删除理由本身犯了它想修正的那个错。换成人民币口径,
r=6% = 1.70%国债 + 4.3%溢价,几乎正好等于成熟市场的4.17%,完全站得住。
同一个6%在美元口径下荒谬、在人民币口径下合理——这是"r必须跟币种绑定"的第二次自证。
过程保留在报告里,不掩饰。

恢复但明确标注为上行情景,不是第二个可下单的估值:
  - 21格中15格分母跌破5pct有效性下限(MiniMax乐观档仅2.0pct,PE顶到40倍,不引用)
  - g 不随 r 变(g是对2036年后经济的判断,r是要求回报,两件独立的事)
  - 排序只动一处:茅台第四→第三,与拼多多换位;其余六家纹丝不动
  - 用法:8%做买入门槛,6%理解上行空间。误差代价不对称——按6%买入而真相是8%,
    腾讯终值差50%,等于多付三分之一;反过来只是少赚

三、报告新增"复现方式"章节,列出六条可直接执行的复现命令
2026-08-17 03:11:20 +08:00
HuangCaiBao f45bb8c01e fix(tools): 修复 report_audit 数字提取丢负号与两个工具的 Windows GBK 崩溃 (#84)
* fix(report_audit): 修复数字提取丢失负号与 Windows GBK 编码崩溃

## BUG-1 数字提取丢失负号(严重)

7 处正则用 `([\d,,\.]+)` 捕获数字,未包含符号位。报告中的
"-1.72%" 被提取为 1.72,核验阶段与信源的 -1.72 比对,得出
200% 偏差,产出**假打回**。

危害在于它不抛异常、不报错,只是静默地把结论弄反——一份数据
完全正确的报告会被判定为「打回」,而使用者无从察觉原因。

实测:某份 422 个数据点的报告,修复前提取到的负值为 **0 个**
(全部被吃掉符号),修复后为 **39 个**。

修复:
- 新增 `_SIGN = r'[+\-−–-+]?'`,接入全部 7 处数字捕获组
  (_PATTERNS 6 处 + _LABEL_RE + _TABLE_ROW_RE + _KV_TABLE_RE
   + _KV_LABEL_RE + _parse_md_tables 内联正则)
- `_clean_num` 归一化 Unicode 减号 U+2212、en-dash U+2013、
  全角减号 U+FF0D、全角加号 U+FF0B —— 研报与 Markdown 编辑器
  中这几种字符都会被当作正负号使用

## BUG-2 Windows 控制台 GBK 编码崩溃

`main()` 中 `print(json.dumps(...))` 遇到 € / → / ★ 等字符抛
UnicodeEncodeError 直接退出,需靠 `PYTHONUTF8=1` 才能绕过。

修复:新增 `_force_utf8_stdio()`,在 main() 开头将 stdout/stderr
切至 UTF-8(errors='replace'),对不可 reconfigure 的流静默跳过。

## 附带修复

`val > 1e15` 上限判断对负数恒为假,改用 `abs(val)`,否则负向
异常值无法被过滤。

## 测试

新增 tests/test_report_audit.py,17 个用例。在修复前的代码上运行
会产生 12 个失败/错误,修复后全部通过。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(financial_rigor): 修复 Windows GBK 控制台下告警路径崩溃

`verify_market_cap()` 在偏差 > 5% 时打印 " 警告",U+274C 在
GBK 控制台抛 UnicodeEncodeError 直接退出。

这个 bug 的危害被它的触发条件放大了:**崩溃的恰恰是「市值验算
偏差超标」这条最该被看到的告警路径**。偏差正常时打印  同样
会崩,但至少能从非零退出码察觉;而在验算失败时静默退出,容易
让人误以为脚本没跑或已通过——而这个工具存在的全部意义就是拦住
错误数据。

同样受影响的还有 cross-validate、three-scenario、verify-valuation
等所有输出 /⚠️/ 的子命令。

修复:新增 `_force_utf8_stdio()`,在 main() 开头将 stdout/stderr
切至 UTF-8(errors='replace'),对不可 reconfigure 的流静默跳过。
与 report_audit.py 的同名修复保持一致实现。

未改动任何计算逻辑,测试中含两条断言专门确认这一点。

测试:新增 tests/test_financial_rigor.py,9 个用例,逐条覆盖
/⚠️/ 三档输出路径。在修复前的代码上运行会产生 9 个失败/错误,
修复后全部通过。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-27 01:13:41 +08:00
Vik1n9 726d35d1ac Claude/finmind taiwan stock integration nho04m (#72)
* 新增台股FinMind数据源整合:twstock_data.py工具 + 各Skill台股取数规范

- tools/twstock_data.py:FinMind API取数工具(零依赖),支持行情/估值/近5年财务/月营收/股利/代码搜索,输出自带市值验算
- skills/financial-data.md:新增台股数据源优先级(FinMind主+Goodinfo副+MOPS原始),含月营收披露、单季加总、ADR存托比率等台股特别规则
- earnings-review/investment-team:标准数据源清单加入台股(FinMind+Goodinfo)
- bottleneck-hunter:估值检查章节指明台股标的统一用twstock_data.py取数
- CLAUDE.md:注意事项补充新台币单位与台股取数入口
- codex-skills 同步再生成

* FinMind token 只存本机:支持 local/finmind_token.txt 读取,gitignore 排除密钥文件

- twstock_data.py 读取 token 优先级:环境变量 FINMIND_TOKEN > local/finmind_token.txt(local/ 已被 gitignore 永久排除),都没有则匿名访问
- .gitignore 新增密钥类通配规则(.env、*_token.txt、*.token),任何位置一律不入库
- financial-data.md 写明 token 只存本机、严禁出现在报告/skill/commit 中
- 已核查:repo 与 git 全部历史中无任何真实 token

* twstock_data.py 健壮性修复:无效token给出明确提示,管道截断静默退出

- token 无效/过期时(HTTP 400/401/402/403)不再抛原始 traceback,改为提示检查 FINMIND_TOKEN 或 local/finmind_token.txt
- 网络错误统一转为可读的 ConnectionError 信息
- 输出被管道截断(如 | head)时静默退出;BrokenPipeError 是 ConnectionError 子类,处理顺序须在前

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-18 00:00:08 +08:00
xbtlin d92286c30d 修复ashare_data.py 52周高低点取错字段:腾讯协议47/48位实为涨跌停价,改从东方财富f174/f175获取(issue #70) 2026-07-15 11:39:44 +08:00
xbtlin b573b4b522 star 曲线复刻 star-history 原版样式:xkcd 手绘滤镜+嵌入字体+标题头像+图例水印,浅深双主题 2026-07-15 00:18:27 +08:00
xbtlin 4632856f62 修复 README 失效的 star history 图表:GitHub 已限制第三方读取 stargazers 数据,改为自托管 SVG 2026-07-14 23:47:29 +08:00
Subhansh Kumar 3f62d025c9 fix: make eastmoney search token configurable via env var (#50) 2026-07-07 00:22:48 +08:00
Ricky Tan 9472222a86 [codex] Fix Codex skill tool path guidance (#43)
* Fix skill tool path guidance

* feat: runnable
2026-07-04 00:59:07 +08:00
xbtlin 9940161804 新增 A 股数据工具:腾讯行情 + 东方财富财务数据,零外部依赖 2026-06-24 16:23:39 +08:00
xbtlin 6cc92bf788 添加晨星深度低估研究:31家公司深度分析报告 + 公允价值筛选工具
- 新增 morningstar_fair_value.py:从晨星API抓取840只股票的公允价值数据
- 新增 morningstar_fair_value_20260519.csv:全量数据(840只股票按潜在涨幅排序)
- 新增 reports/晨星深度低估/ 目录:31家公司独立研究报告
  - 宽护城河+低估>50%:23家(BABA/NKE/SAP/FICO/DHR/ZTS等)
  - 重点中概股:TME/BILI/PDD/NTES
  - 其他关注标的:LULU/PYPL/FISV/NOW
- 每份报告包含:公司概况、财务分析、护城河分析、估值分析、风险因素、投资论点
2026-05-19 23:48:49 +08:00
xbtlin 5c112b22e5 新增"动量发现+价值验证"选股框架:screener + 回测工具
核心思路:用价格突破发现"刚开始暴涨"的股票,再用基本面验证筛掉假突破。
回测验证(NVDA/AMD/MU):框架在 2023-05 AI 炸弹财报后给出 NVDA 买入信号(+294%),
MU 在 2023-12 EPS超预期68%时触发(+44%),AMD 信号较弱(+5.6%,正确反映弱基本面)。

三个回测改进点已固化到 screener:
1. 毛利率连续2季改善 → 独立买入条件(解决 NVDA 2023-01 漏判)
2. EPS超预期>30% → 周期股独立条件(解决 MU 底部信号)
3. 信号分级:3/6=试探仓3% | 4/6=标准仓5% | 5-6/6=确信仓8%

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 01:49:38 +08:00
xbtlin ddc2c50d53 雪球爬虫新增全量缓存与离线过滤模式
- 新增 --dump-all:爬取时同时保存该用户所有原发言(不按关键词过滤),供后续离线多主题分析
- 新增 --from-cache:跳过爬取,直接从已有全量缓存按关键词过滤生成 markdown
- --keywords 与 --output 改为可选(仅 from-cache 模式下必填)

这样同一个用户时间线只需爬一次,换主题时从本地缓存秒出,不用重复登录/遍历

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 00:40:27 +08:00
xbtlin a9329224f8 固化雪球通用爬虫 tools/xueqiu_scraper.py
重构自本地 xueqiu_login_scraper 等三个实验脚本,合并为可复用的通用工具:
- 移除所有硬编码凭据,改用环境变量 XQ_PHONE / XQ_PASSWORD(或手动登录)
- 参数化 --user-id / --keywords / --output / --state-path
- 登录态持久化 + 断点续爬 + 双通道 fetch + 随机抖动反限流
- 仅收录目标用户的原发言,自动剔除纯转发

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:21:34 +08:00
xbtlin 96ffd6e0f9 更新CLAUDE.md客观性原则 + 添加指令日志系统
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 00:53:43 +08:00
xbtlin eb8b397c33 添加数据抽检工具(report_audit.py),更新四个skill加入准出流程
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 00:20:31 +08:00
xbtlin a5cfbacb1d Fix: use python3 instead of python3.11 for portability
The financial rigor tool uses only Python stdlib (decimal, json, math),
so it works with any Python >= 3.7. No need to hardcode python3.11.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 15:55:29 +08:00
xbtlin 1b932ffe4a Add financial rigor toolkit: exact arithmetic, market cap verification, Benford's Law
Pain point: LLM mental arithmetic is unreliable for financial calculations —
a misplaced decimal in PE or a unit error in market cap can lead to wrong
investment decisions.

Solution: tools/financial_rigor.py provides program-verified calculations:
- Market cap verification (price × shares vs reported, exact Decimal)
- Valuation metrics (PE/PB/ROE/FCF Yield, banker's rounding)
- Multi-source cross-validation with tolerance-based alerting
- Three-scenario valuation model (bull/base/bear)
- Benford's Law analysis for detecting fabricated financial data
- Exact calculator (replaces LLM mental math)

Skills updated to call the tool at critical checkpoints:
- investment-research: data verification + valuation steps
- investment-team: financial-analyst agent task
- investment-checklist: gates 2 and 5

All calculations use Python decimal.Decimal, not float.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 15:51:38 +08:00