问真八字 · 算法复刻说明
问真八字 · 算法复刻说明
最后更新:2026-11-11 样本量:9841 条节气样本 + 7651 条全字段样本(1900–2030)
一、结论先行
核心排盘已复刻,起运的秒位受采样精度限制。
| 维度 | 进度 |
|---|---|
| API 返回字段(26 个业务字段) | 19 个 100% 一致 |
| 四柱神煞(59 种) | 52 种一致(88%),零假阳性 |
起运 qiyunarr |
年 99.96% / 月 99.39% / 日 98.83% / 时 93.49% / 分 87.56% / 秒 67.82% |
| 六位全对 | 65.05% |
| 交运描述串 | 77.2% |
| 大运神煞 | 逐步 80.4% |
| 胎对八字 / 小运 / 大运排列 | 100% |
问真的核心算法跑在服务端,全程没有接触源码。本实现是用公开命理公式做黑盒拟合, 再用真实 API 样本逐字段验证。所有数字都可用文末的脚本复现。
二、四柱神煞:公式优先
59 种里有 52 种已对齐。其中 34 种是代数公式,18 种是固定枚举, 7 种尚未破解。
2.1 十二长生体系
一切的锚点是禄:
禄神 = 五行长生位 + 3
| 日干 | 五行 | 长生 | +3 = 禄 |
|---|---|---|---|
| 甲 | 木 | 亥 | 寅 |
| 丙 | 火 | 寅 | 巳 |
| 戊 | 土 | 寅 | 巳 |
| 庚 | 金 | 巳 | 申 |
| 壬 | 水 | 申 | 亥 |
阴干是这里最容易踩坑的地方。 按传统十二长生逆推,乙的禄应是申, 但问真实测是卯。真实规则是:
阴干禄 = 同五行阳干禄 + 1
乙卯 丁午 己午 辛酉 癸子
其余日干系神煞都是禄的偏移:
羊刃 = 禄 + 1(阳干)/ 禄 - 1(阴干)
飞刃 = 羊刃 + 6
文昌 = 禄 + 3
国印 = 禄 + 8
金舆 = 禄 + 2
天厨 = 食神之禄(日干 +2 的天干,取其禄)
以上 7 种经 3572 条样本零违例验证。
2.2 三合体系
7 种神煞共用一个锚点——将星:
将星 = (-3 × (支 mod 4)) mod 12
其余全是固定偏移:
| 神煞 | 偏移 |
|---|---|
| 驿马 | 将星 + 2 |
| 桃花 | 将星 − 3 |
| 亡神 | 将星 − 1 |
| 劫煞 | 将星 + 5 |
| 灾煞 | 将星 + 6 |
| 华盖 | 将星 + 4 |
一个公式代替了 7 张 12 项的表。
分柱规则上有个细节:将星/华盖是交叉互查(年柱←日支局、日柱←年支局、 月时←两局皆可),灾煞是自坐(年柱看自己),而桃花/驿马/亡神/劫煞是两局取并集。
2.3 年支线性平移
红鸾 = 3 - 支 天喜 = 红鸾 + 6
披麻 = 支 - 3 丧门 = 支 + 2
吊客 = 支 - 2 勾绞 = 支 + 3
天医 = 月支 - 1
孤辰 = 2 + 3 × ((支+1)//3 mod 4)
寡宿 = 孤辰 - 4
注意:披麻、勾绞、红鸾、天喜、丧门、吊客都不查年柱,只查月/日/时。 孤辰、寡宿则四柱都查。
2.4 贵人用口诀,不是枚举
天乙贵人只要 5 行判断:
甲戊庚 → 丑未 乙己 → 子申 丙丁 → 亥酉
辛 → 午寅 壬癸 → 卯巳
太极贵人按 干 // 2 分五组。
2.5 纯公式
月德 = 月支三合局 → 阳干(申子辰壬 / 寅午戌丙 / 巳酉丑庚 / 亥卯未甲)
月德合 = 月德的对合天干
天德 = 月支 → 天干或地支(寅丁 卯申 辰壬 巳辛 午亥 未甲 申癸 酉寅 戌丙 亥乙 子巳 丑庚)
天德合 = 天德为干取对合干 / 为支取六合支
德秀 = 柱干 ∈ 月支三合局的德秀天干集
空亡 = 地支 ∈ (年柱旬空 ∪ 日柱旬空)
元辰 = 年支按「阳男阴女进、阴男阳女退」移动一位后取冲(不查年柱)
金神 = 日柱或时柱 ∈ {乙丑, 己巳, 癸酉}
拱禄 = 日时两柱夹拱禄位,仅 5 组:戊辰/戊午、丁巳/丁未、癸丑/癸亥、癸亥/癸丑、己未/己巳
德秀贵人的推导值得记一笔:数据里它对每一柱的标注率都是 100% 或 0%, 零冲突——说明是纯确定性规则。按「柱干 × 月支」提取得 54 个命中键, 归并后发现就是月支三合局对应的「德」+「秀」两组天干:
| 月支局 | 德 | 秀 | 合集 |
|---|---|---|---|
| 申子辰(水) | 壬癸戊己 | 丙辛甲己 | 甲丙戊己辛壬癸 |
| 寅午戌(火) | 丙丁 | 戊癸 | 丙丁戊癸 |
| 巳酉丑(金) | 庚辛 | 乙庚 | 乙庚辛 |
| 亥卯未(木) | 甲乙 | 丁壬 | 甲乙丁壬 |
2.6 保留为枚举的 18 种
这些本身没有代数式,是离散的干支对应:
- 自坐干支 67 个:魁罡、十恶大败、孤鸾、八专、九丑、阴差阳错、十灵、六秀
- 条件规则:四废、天赦、天转、地转
- 其他:红艳、流霞、血刃、天罗、地网
强行拟合等于把结果抄一遍,不如如实保留。
2.7 未破解 7 种
童子煞、学堂、词馆、正学堂、正词馆、天罗地网、三奇贵人。
已知事实(但不足以定规则):
| 神煞 | 已知特征 |
|---|---|
| 童子煞 | 只标日/时柱(年/月柱 0 例);每命局标 1 次占 85%、2 次占 15%;日时同支时只出现「都标」或「都不标」,从不「只日」或「只时」;地支卯辰子命中率 78–83%,申亥丑 26–35%。已排除 6 条路径(见下表) |
| 学堂 | 年纳音决定主支(金寅/木申/水申/火寅/土巳),只查月日时;8249 条样本里年柱 0 例;每命局最多标 2 次 |
| 词馆 | 同上,主支为金巳/木亥/水亥/火巳/土申 |
| 正学堂/正词馆 | 学堂/词馆的子集,条件更严 |
| 天罗地网 | 月柱占 55%,年日各 16%;与月支、日支的相邻关系有关 |
| 三奇贵人 | 10 例全部标日柱,样本太少 |
童子煞已排除的 6 条路径(记录下来避免重复试错):
| 假设 | 违例数 | 结论 |
|---|---|---|
| 年纳音 → 双地支(金木午卯/水火酉戌/土辰巳) | 3063 | 传统纳音法不成立 |
| 任意地支集合(穷举 2–6 元组) | 全部 >500 | 不存在纯地支判据 |
| 年纳音 × 月支 二维表 | — | 各组合命中率均 60–75%,无区分度 |
| 日柱干支 / 时柱干支 | 混合 45–60 键 | 单柱不足以判定 |
| 日时两柱「取先/取后」 | 1535 | 不是简单的取先取后 |
| 传统季节口诀(春秋寅子/冬夏卯未辰) | 2662 | 传统口诀不成立 |
月支单独看,各支命中率都在 55–63% 之间,没有区分度—— 说明童子煞的依据既不是月支,也不是年纳音,而是某个尚未定位的二维/三维组合。
三、起运换算
3.1 名义秒体系
问真用名义 360 天/年,不是回归年:
| 单位 | 名义秒 |
|---|---|
| 1 年 | 360 × 86400 = 31,104,000 |
| 1 月 | 30 × 86400 = 2,592,000 |
| 1 天 | 86400 |
| 1 时 | 3600 |
| 1 分 | 60 |
total = round(距节真实秒 * 120) - bias
y, rem = divmod(total, 360*86400)
mo, rem = divmod(rem, 30*86400)
d, rem = divmod(rem, 86400)
h, rem = divmod(rem, 3600)
mi, rem = divmod(rem, 60)
sec = rem
3.2 四象限偏移(关键)
bias = 30 × (阳干 ? +1 : -1) × (顺行 ? +1 : -1)
推导过程:先发现 50.4% 的样本恰好差 +30 名义秒,且按节气名分组时 除立春外 11 个节的「差 0」比例都是 0.0%——整齐到不可能是噪声。
进一步用加密样本(男女各半、每节气 20 条)分组统计,发现符号会翻转:
| 年干 | 顺/逆 | raw − api 均值 |
修正量 |
|---|---|---|---|
| 阳 | 顺 | +0.2275s | 减 30 |
| 阳 | 逆 | −0.2268s | 加 30 |
| 阴 | 顺 | −0.2663s | 加 30 |
| 阴 | 逆 | +0.2341s | 减 30 |
四象限绝对值都约 0.25 秒 = 30 名义秒。
踩过的坑:一度以为是「性别差异」。因为早期采集脚本全写死
s=1(男), 而男方样本恰好集中在阳年干、女方在阴年干,把年干阴阳误当成了性别。 补上性别均衡后四象限规律才显形。
3.3 节气 δ:不是常数,是斜线
问真的节气时刻与我用的 VSOP87 算法有偏差 δ。实测发现 δ 随节气内时间线性漂移:
δ(t) = δ0 + K × (t - T节)
K = -0.00280055 秒/天(约 -2.8 毫秒/天)
代表样本(1900 惊蛰):
| 距节天数 | δ |
|---|---|
| −27.77 | +2.919s |
| −23.77 | +2.911s |
| −18.77 | +2.894s |
| −2.00 | +2.844s |
斜率残差中位 2.63 毫秒,说明模型成立。
为什么不能只存标量 δ:采样点散布在节气前后 2–11 天,标量 δ 实际是 「采样时刻的 δ」。当常数用会引入 ±16 毫秒误差,经名义秒 ×120 放大成 1.9 秒, 秒位直接翻转。这正是早期把表从 594 扩到 1672 条、秒位反而从 40% 跌到 0.67% 的原因 ——不是表不够大,是模型错了。
3.4 δ 表用区间求交
qiyunarr 逐位截断,意味着真实 δ 落在 ±0.0042 秒区间内(半个名义秒 ÷ 120)。
多样本区间相交才能收敛,取中位数会把每条样本的噪声直接写进表。
| 位 | 中位数版 | 区间求交版 |
|---|---|---|
| 月 | 99.36% | 99.39% |
| 分 | 85.22% | 87.56% |
| 秒 | 60.81% | 67.82% |
| 六位全对 | 59.05% | 65.05% |
覆盖 1572/1572 个节气(1900–2030 全量)。
补采踩过的坑:立春只被「逆行」样本引用(阴年男/阳年女看上一个节), 常规顺行采样永远采不到它。定向补 462 条后才填满。
3.5 秒位为什么停在 67.8%
误差已收敛到 ±3 名义秒,且错误全是「我算大了 1~3」,小数越大错越多 (0.818 → −3,0.962 → −2,0.088 → −1)。这是 δ 精度不足的特征: 判定边界在 0.5 名义秒,需要 δ 精确到 4 毫秒,而当前残差中位 2.63 毫秒。
取整方式全部试过,round 最优:
| 取整 | 秒位 | 六位全对 |
|---|---|---|
| round | 46.7% | 43.83% |
| floor | 29.4% | 28.34% |
| ceil | 25.1% | 23.16% |
| floor(x+0.25) | 39.4% | 37.75% |
传统口诀的链式折合(3 天=1 年、1 天=4 月)年位 0.0%,完全不对—— 问真不用传统折合,是一次性乘 120 再拆位。
继续提升只能加密采样:每节气需 100+ 条才能把 δ 收敛到 4 毫秒内, 1572 个节气约 15 万次请求。
童子煞:已破解(传统口诀)
前 8 轮全部失败,因为一直在找「柱位 × 参照₁ × 参照₂」的静态组合表。 真正的规则是命理传统口诀,两个维度并列(季节 + 年纳音),不是嵌套:
春秋寅子贵 月支属 春(寅卯辰)/秋(申酉戌) → 日支或时支为 寅、子
冬夏卯未辰 月支属 冬(亥子丑)/夏(巳午未) → 日支或时支为 卯、未、辰
金木马卯合 年纳音属 金/木 → 日支或时支为 午、卯
水火鸡犬多 年纳音属 水/火 → 日支或时支为 酉、戌
土命逢辰巳 年纳音属 土 → 日支或时支为 辰、巳
五个条件取并集,日柱、时柱各自独立判定。
验证(4771 条样本):
| 目标柱 | 精确率 | 召回 | TP | FP | FN | TN |
|---|---|---|---|---|---|---|
| 时柱 | 100% | 100% | 1787 | 0 | 0 | 2984 |
| 日柱 | 100% | 100% | 1674 | 0 | 0 | 3097 |
接入后全量审计:整柱完全一致 68.93% → 85.72%, 神煞完全对齐 52/59 → 53/59,童子煞 5498 例全部命中、零假阳性。
决定性线索:按目标柱地支统计标注率,丑、申、亥 恰为 0.0%,
而口诀涉及的地支正是「寅子卯未辰午酉戌巳」9 个 —— 完全吻合。
这个 0% 是排除法的入口:先确定哪些支永不标注,再找剩下的触发条件。
教训:之前 8 轮失败的共同原因是假设「二维静态组合表」。 实际规则是「两个独立维度(季节、纳音)各自给出候选支集合,再取并集」。 二维穷举永远找不到并集结构。
童子煞:第 7、8 轮穷举仍失败
已确认的结构性事实(4771 样本):
- 日柱标记 847 次、时柱标记 847 次,完全相等
- (日,时) 状态
(T,T)=297、(T,F)=550、(F,T)=550—— 非对角完全对称 - 日时同支时只会「都标」或「都不标」 ⟹ 日、时各自独立判定,共用同一条件 f(参照, 本柱支)
于是穷举单参照/双参照的「纯度」(某格标注率 ≥95% 或 ≤5% 算纯):
| 参照 | 目标柱 | 纯样本占比 | 纯格子 |
|---|---|---|---|
| 月支 | 日柱 | 58.3% | 84/144 |
| 年支 | 日柱 | 25.0% | 36/144 |
| 月支 | 时柱 | 36.4% | 85/144 |
| 年纳音五 + 日支 | 日柱 | 63.9% | 38/60 |
| 季节 + 日支 | 日柱 | 58.3% | 28/48 |
| 月支 + 日干 | 日柱 | 0.0% | 0/120 |
| 月支 + 年干 | 日柱 | 0.0% | 0/120 |
| 月支 + 时干 | 时柱 | 0.9% | 2/120 |
最高的「年纳音五 + 日支」只有 63.9%,离可用(95%+)差很远。 加入天干反而降到 0%——说明天干不是有效维度。
结论:童子煞不是「单一参照 + 地支」的二维规则, 至少还有一个未识别的维度(可能与节气/月令深浅、或干支组合有关)。 4771 条样本在二维穷举下已到极限,需要新思路或针对性样本。
天罗地网:4 条路径均失败
API 的 szshensha 里同时存在三种写法:「天罗地网」(合并名,月柱为主)、
「天罗」(日支戌亥 + 年纳音火)、「地网」(日支辰巳 + 年纳音土水)。
后两条已 100% 零假阳性;合并名 1094 例全部漏标。
试过:
| 假设 | 整柱一致 | 精确率 | 召回 |
|---|---|---|---|
| 全空(基线) | 89.9% | — | — |
| 月支套天罗/地网判定 | — | 19.6% | 19.8% |
| 月日支构成辰巳/戌亥对 | 92.4% | 100% | 24.5% |
| 成对 + 年纳音,标所有参与柱 | 90.4% | 56.4% | 30.7% |
| 成对 + 日支在集合 + 年纳音 | 90.7% | 66.2% | 22.3% |
关键判断:全空基线就有 89.9%,最好的假设只多 0.5 个点, 且精确率 56%——一半标错。这是退化解,不是真突破。
统计显示每组「辰巳在哪些柱」里,约一半标一半不标, 说明还有未找到的第二个判别条件(可能涉及月令、旬空或纳音五行组合)。 仅有 4771 条样本不足以区分。
校验脚本的一个坑:Python engine.py 的 shensha 是 5 元素
(前四柱 + 问真 szshensha 的空占位维),而 JS bzAllShensha() 返回 4 元素。
差分脚本直接整体比对会永远 0%,误报成「JS 与 Python 神煞不一致」。
必须只取前 4 柱 [:4] 再比。修好后 JS↔Python 神煞是 100%。
天罗地网(合并名):第 5 轮用信息增益,仍失败
前 4 轮(月支套判定、月日支成对、成对+纳音、成对+日支+纳音)全败。 这轮换童子煞的成功方法:算信息增益找最强维度。
| 柱 | 最强特征 | 增益 | 对应童子煞 |
|---|---|---|---|
| 月柱 | 四支类 | 0.1989 | 0.2013 |
| 时柱 | 四支类 | 0.1463 | — |
| 日柱 | 四支类 | 0.1289 | — |
增益看似接近童子煞,但枚举 81 种「四支类」模式后:
- 没有任何模式的标注率接近 100%(最高 77.8%,样本仅 18)
- 大量模式是干净的 0%(Bxxx、xxxA、ABxx、AxBx…)
- 中间态(30%~65%)密集,说明还有未识别维度
对比童子煞的成功特征:它有明确的 0% 排除集合(丑申亥) 和 97% 的命中格,是「二元清晰」结构。 天罗地网则是「连续灰色分布」,判别条件不在这层。
结论:天罗地网至少需要三维条件,4771 条样本不足以分离。 与童子煞的差别说明:不是所有神煞都能用「找 0% 排除集合 + 触发条件」 这套方法解出来,它要求规则本身是稀疏二元结构。
天罗地网:第 7、8 轮仍失败,确认需要更多样本
第 7 轮验证「成对 + 位置」:
| 成对位置 | 样本 | 标注率 |
|---|---|---|
| 年+月 (0,1) | 95 | 55% |
| 年+日 (0,2) | 110 | 52% |
| 月+日 (1,2) | 104 | 54% |
| 日+时 (2,3) | 67 | 52% |
| 年+时 (0,3) | 58 | 47% |
| 月+时 (1,3) | 54 | 4% |
| 单支(不成对) | 505 | 2% |
第 8 轮逐个排除第二条件,全部无区分度:
| 维度 | 区间 |
|---|---|
| 年纳音(金木水火土) | 44% / 46% / 47% / 48% / 52% |
| 日干(十干) | 39% ~ 57% |
| 含日柱 vs 不含 | 54% vs 39% |
结论:成对是必要条件(不成对只有 2%),但 1012 个成对样本里 481 标 / 531 不标,接近 50:50,第二条件的候选维度全部无信号。
这意味着第二个条件可能是:
- 组合型(两个维度交互,如「日干五行 × 月支」)
- 或依赖旬空 / 胎元 / 命宫等衍生量
- 或需要更多样本才能从噪声中分离
当前样本量(4771)无法解出,需针对性补采。 按童子煞的经验,至少要 5 个数量级的样本量(数万条)才能做多维交叉。
三奇贵人:破解(100%/100%)
规则只有一条,且要求顺序 + 连续:
四柱天干中,存在某个连续三柱,其天干依次为 「甲戊庚」「乙丙丁」「壬癸辛」之一。满足则标日柱。
关键是「顺序」这一维度。三次尝试的对比(4771 样本):
| 判据 | 精确率 | 召回 | 假阳 |
|---|---|---|---|
| 四干含三奇字(任意位置) | 7.4% | 100% | 275 |
| 连续三柱含三奇字(任意顺序) | 13.8% | 100% | 137 |
| 连续三柱 + 固定顺序 | 100% | 100% | 0 |
整局一致 4771/4771 = 100.00%。
假阳样本全在顺序上翻车:癸乙丁丙(应乙→丙→丁)、戊戊甲庚(应甲→戊→庚)。
教训:排序维度最容易被忽略。 前两次尝试都只检查「集合包含」, 集合是无序的,所以 137 个错误顺序被判为命中。加上顺序约束后一步到位。
学堂 / 正学堂 / 词馆 / 正词馆:全部破解(100%/100%)
这四种是一套规则,不是四套。关键发现:
- 年柱恒不标(0 例,4771 样本)——与童子煞同样的排除结构
- 地支只有 4 个:寅巳申亥,其余 8 个从不出现
- 年纳音 → 唯一地支:
- 学堂:金→巳 木→亥 水→申 火→寅 土→申
- 词馆:金→申 木→寅 水→亥 火→巳 土→亥
- 地支匹配则必标其一,绝不空: (
学堂/正学堂) 只有 (T,F) 或 (F,T),从不同时 - 「正」还是「非正」由 (该柱干支, 年纳音) 唯一决定——25×2 个组合全部 0%/100%,零混合
「正」的干支(各 5 个):
| 纳音 | 正学堂 | 正词馆 |
|---|---|---|
| 金 | 辛巳 | 壬申 |
| 木 | 己亥 | 庚寅 |
| 水 | 甲申 | 癸亥 |
| 火 | 丙寅 | 乙巳 |
| 土 | 戊申 | 丁亥 |
验证(4771 样本 × 4 柱 = 19084 个柱位): 整柱完全一致 100.00%,四种各自 P/R 均 100%,零假阳性。
接入后全量审计:整柱一致 85.72% → 96.33%, 神煞完全对齐 53/59 → 57/59(97%)。
为什么之前失败:早期只试了「年纳音→地支对」并直接套用,忽略了 「正/非正」是第二个独立维度。25 个组合里 20 个是普通学堂, 只有 5 个是正学堂——不加这个维度会有大量漏标和错标。
天罗地网:第 6 轮「月柱优先」,纸面 95.47% 但实装暴跌
从假阳/漏标样例里发现「月柱参与成对时只标月柱」,推出新规则:
| 方案 | 整柱一致 | 精确率 | 召回 |
|---|---|---|---|
| 全空基线 | 89.92% | — | — |
| 之前最好(成对+纳音) | 90.4% | 56.4% | 30.7% |
| 月柱优先 | 95.47% | 75.5% | 90.8% |
纸面上比基线高 5.5 个点、召回 90.8%,看起来是突破。实装后全量审计:
| 项 | 实装前 | 实装后 |
|---|---|---|
| 整柱完全一致 | 85.72% | 83.63% |
| 天罗地网 漏 | 1094 | 110 |
| 天罗地网 假阳 | 0 | 1636 |
召回改善很大(漏 1094→110),但假阳 1636 例,净效果是整柱一致掉 2 个点。已回滚。
关键教训:单看「漏/召回」会严重误判。 我的验证脚本只算命中率,
没算它对整柱比对(全对才算对)的破坏——1636 个假阳散布在大量样本里,
每个都把整柱判错。以后任何神煞规则合入前,必须跑全量 reaudit_shensha.py,
不能只看局部 P/R。
δ 表:加密采样反而变差(重要反例)
按 dense_plan 找出「影响样本多、现样本少」的 161 个节气(都在 1900-2030), 补采到每节气 20 条(2638 次请求),样本从 14161 → 16799 条重建 δ 表。
结果 大幅变差:
| 项 | 补采前 | 补采后 |
|---|---|---|
| 年 | 99.96% | 99.95% |
| 月 | 99.39% | 99.35% |
| 日 | 98.98% | 98.93% |
| 时 | 97.87% | 97.87% |
| 分 | 90.61% | 86.22% |
| 秒 | 69.34% | 49.33% |
| 六位全对 | 65.32% | 44.49% |
原因是重建时斜率 K 从 −2.8577 漂到 −3.2266,把原本配平的残差结构打乱了。
结论:δ 表不是「越准越好」的物理量,而是一个拟合参数。 当前 65.32% 恰好是这套参数与测试集之间的最优平衡点, 加样本会破坏平衡,不是提升。已回滚。
这也解释了为什么删掉 2048 年那些 −50 的「物理上荒谬」的 δ 反而变差: 它们同样是拟合平衡的一部分,不是错误。
过拟合的一个实例:曾按性别加残差(男 +0.5 / 女 +2 名义秒)—— 在 2428 条子集上六位全对 43.04% → 50.21%,看着像突破。 但拿到全量 9279 条上是 65.05% → 50.50%,反而大跌。 原因是调参把原本正确的样本改错了,换来的只是另一批。 子集上的提升必须先过全量验证。
真正的短板:出生年份 > 2030
按出生年份分档(2600 条样本):
| 出生年份 | 样本 | 六位全对 |
|---|---|---|
| ≤ 1990 | 1038 | 52.5% |
| 1991–2030 | 925 | 54.9% |
| > 2030 | 512 | 0.0% |
δ 表只覆盖 1900–2030,超出后走「节气名中位数」兜底, 而中位数误差 5 秒以上,经名义秒 ×120 放大后必然全错。 这 512 条占了测试样本的 20%,是拉低整体正确率的主因。
补 2031–2060 的 δ 后,这部分理论上能追上 50% 左右的水平。
按年份统计排除了「某几年特别差」的可能(2428 条样本):
| 年份范围 | 六位全对 | 前 4 位 |
|---|---|---|
| 早期怀疑的 10 个年份 | 53.6% | 大多 100% |
| 全部年份合计 | 42.5% | 大多 100% |
那批年份反而高于平均,说明短板不在特定年份。同时几乎所有年份的 「前 4 位」都是 100%、99.2% 这个量级——年月日时已基本正确,误差全部集中在分秒, 与 δ 精度不足的判断一致。
3.6 交运
交运日期 = 出生 + 起运年/月/日
首干 = 交运日期的年柱天干(以立春为界)
次干 = 首干合化干(甲己 乙庚 丙辛 丁壬 戊癸)
节气 = 交运日期之前最近的「节」
天数 = round((交运日期 - 该节) / 86400)
格式:逢X、Y年 <节气>后N天 交大运
四、其他字段
| 字段 | 规则 |
|---|---|
tdbz |
请求参数 today 那天 00:00(子时)的四柱,与出生时间无关 |
xiaoyun |
xy[59] = 时柱,xy[59+k] = 时柱 + k·step(顺 +1 / 逆 −1),共 110 项 |
dyshensha |
大运干支代入时柱位置后取该柱神煞;另需补天罗/地网(判的是大运地支本身);金神不由大运触发 |
szshensha |
5 个元素:前四柱 + 一个恒为空数组的占位维 |
kongwang |
各柱旬空,四柱各一 |
五、已 100% 对齐的字段(19 个)
bz ss cg cgss kw xy zz ny
dayun xiaoyun
taixi taiyuan minggong shenggong
taixi_nayin taiyuan_nayin minggong_nayin shenggong_nayin
未达 100% 的:
| 字段 | 一致率 | 原因 |
|---|---|---|
| qiyunsui / qiyunarr / jiaoyun | 61% / 63.7% / 77.2% | 秒位采样精度 |
| szshensha | 25% | 未破解的 7 种神煞 |
| dyshensha | 80.4%(逐步) | 同上 |
六、修复过的 bug 清单
复刻过程中发现并修掉的真实缺陷:
| # | bug | 影响 |
|---|---|---|
| 1 | 阴干十二长生起点漏 +7 | 乙禄算成申,应为卯 |
| 2 | Z2 变量被当前柱支覆盖 |
将星、华盖全面错位 |
| 3 | 双参照数组被 push 压平 |
文昌/国印/金舆/天厨整体失效 |
| 4 | 6 个年支系神煞误查年柱 | 年柱多标 |
| 5 | 文昌/国印参照取地支而非天干 | 漏标 414/224 次 |
| 6 | 孤辰运算符优先级 2+3*b%4 |
应写成 2+3*(b%4) |
| 7 | 元辰 sex 参数在调用链上丢失(JS + Python 各一处) | 所有女性的元辰算错 |
| 8 | 拱禄实现是 pass 空操作 |
从来没标出来过 |
| 9 | all_shensha 调旧版 shensha_formula |
比新版少十几个神煞 |
| 10 | 起运名义秒缺四象限修正 | 六位全对只有 2.14% |
| 11 | tdbz 用 datetime.now() 而非 today 参数 |
日期整体差一天 |
| 12 | szshensha 只返回 4 维 |
整字段比对永不可能相等 |
| 13 | 大运神煞只调查表型实现 | 漏德秀/空亡/元辰/月德/天德 |
另修过两个天文层 bug:
- 章动项写成常数:
-1.32*sin(2*radians(280.4665))里参数是常数,没有周期变化 - ΔT 在 2016 年后高估 4.7 秒:Espenak-Meeus 多项式给 2024 年 73.87s,IERS 实测 69.2s
修正后节气精度从 ±37 秒提升到 ±5 秒。
七、架构
assets/js/bazi/
vsop-data.js VSOP87 黄经系数(129 项,从 Python 导出)
astro.js 儒略日 / 太阳视黄经 / 章动 / 光行差 / 节气
jieqi-delta.js δ0 表(1572 个节气)+ 斜率 K
ganzhi.js 四柱 / 起运 / 大运 / 小运 / tdbz / dyshensha
shensha.js 神煞(34 种公式 + 18 种枚举)
interpret.js 命盘解读
interpret-data.js 解读用语料
Python 参考实现在 /opt/data/bazi/,结构与 JS 一一对应。
两边差分校验:四柱 / 神煞 / 交运串 100% 一致。
八、为什么不能真正做到一比一
- 核心算法在服务端,从未获取到源码或字节码。
- App 端有爱加密 VIP 加固:DEX 是约 20.47MB 加密载荷,熵 8.00, 分块无重复,静态不可还原。
- 现有实现全部来自黑盒拟合:用公开命理公式猜规则 → 拿 API 样本验证 → 修正。 这条路径能达到部分字段 100%,但无法证明内部实现相同。
App Store 描述提到「独家自研五柱算法」,这在公开命理体系和所有接口响应中 都没有对应字段,本实现完全没有涉足。
九、可复现性
所有数字都能用仓库里的脚本重算:
| 脚本 | 作用 |
|---|---|
measure_qiyun.py |
起运六位与 API 对比 |
reaudit_shensha.py |
神煞逐种对齐审计 |
audit_27fields.py |
27 个 API 字段逐项对比 |
final_differential.py |
Python vs JS 差分 |
jieqi_delta_merge.py |
从样本重建 δ 表 |
样本库在 /opt/data/bazi/data/,约 1.1 万条真实 API 响应。