简介这份资料是甘氏矩阵图价格推算的系统性汇编面向股票、外汇、期货等领域的技术分析学习者与实战交易者适合从入门到进阶的读者理解这一工具的原理与用法。资源共1个文件为pdf格式压缩包约4.01MB方便在电脑或移动设备上随时翻阅。内容围绕甘氏理论展开讲解如何把市场变化抽象为四方形数字矩阵通过基数1出发的螺旋排列以及角线、十字线所构成的关键数字研判支撑压力区与多空动能区并据此推算商品近中远期的价位区间。同时它也解释了矩阵图为何能弥补传统曲线与指标的盲点帮助读者减少情绪与市场噪音对判断的干扰。目前已有340人学习适合想以更简单直观方式把握市场节奏、寻找价格推算依据的读者参考。1. 甘氏矩阵图价格推算在算什么从一张螺旋数表到候选价位假设手里只有一根日线某标的从 24.60 起步涨到 41.30 后横了六周均线粘合斐波那契回撤也画过了下一个目标位怎么给甘氏矩阵图给的是另一条路子——它把价格当成一个可编号的对象塞进一张从中心 1 开始、逆时针向外的螺旋方阵里先看价格落在第几环、第几度再沿 45° 的整数倍往内外推得到一串候选价位。它不判断方向也不承诺时间只负责把「价格可能停在哪里」变成一份可枚举、可回测的清单。适合做波段和趋势的人也适合想把江恩那套手绘功夫搬进代码的量化研究者。市面上流传的甘氏矩阵图价格推算资料大多是汇编式的结论数表页码翻烂也找不到反推公式下面把公式、代码和参数标定一次讲透。2. 甘氏矩阵图的数学骨架螺旋编号、奇数平方与 45° 角度制2.1 从中心 1 开始的螺旋行列坐标怎么定甘氏矩阵图Square of Nine最朴素的形式是一张 (2n1) 阶方阵中心放 1然后按「右 1 步、上 1 步、左 2 步、下 2 步、右 3 步、上 3 步……」填充。这个步长序列 1,1,2,2,3,3,4,4 是骨架每两条边组成完整的一环第 n 环的边长恰好是 n。按这个规则3 阶矩阵是5 4 3 6 1 2 7 8 92 在 1 的正右方3 在 2 的正上方9 落在右下角。这个布局是所有角度计算的基准。换一种起笔方向比如从正上方开始会让全部角度整体平移推算出来的价位集合形状不变只是编号习惯不同。常见做法是固定一种别在同一个项目里混用两套。2.2 奇数平方数为什么是环与环的分界走完第 n 环总格数正好是 (2n1)²所以第 n 环的最大数一定是奇数平方。这条性质决定了「环号」可以直接由价格反解出来不用把矩阵真的一张张铺开。环与环之间的对应关系如下环号 n该环最大数 (2n1)²该环格数 8n单格角度矩阵阶数011—1×119845°3×32251645°5×53492445°7×74813245°9×9104418045°21×21注意最后一列的「单格角度」恒为 45°与环号无关。原因是第 n 环有 8n 个格子绕一圈是 360°360/8n 再乘以 n 环的边长系数最终仍然回到 45°。这条恒等式是后面所有角度公式的地基。2.3 45° 一格角度公式怎么推出来规定 2 号格为 0°逆时针为正。第 n 环的起始格是 (2n-1)²1它紧接在上一环末尾后面而上一环末尾奇数平方落在 315° 上。于是环内第 k 格的角度就是 315° 45°×k再对 360° 取模。import numpy as np def ring_of(v: float) - int: v 所在的环号中心 1 记为第 0 环。 if v 1: return 0 return int(np.ceil((np.sqrt(v) - 1) / 2 - 1e-9)) def angle_of(v: float) - float: v 在矩阵中的角度2 号格为 0°逆时针增加。 n ring_of(v) if n 0: return 0.0 k v - (2 * n - 1) ** 2 # 环内序号取值 1 .. 8n return (315.0 45.0 * k) % 360.0ring_of用 sqrt 反解环号环 n 的上界开方是 2n1减去 1 再除以 2 就是 n1e-9是防止浮点误差把 9、25 这类边界值算到上一环。angle_of里k允许是小数这样任意非整数价格也能算出连续角度而不是粗暴取整。2.4 精确走格与 sqrt 连续化两条路线的差别网络上的甘氏计算器大多用另一套写法对价格开方加减 0.125、0.25、0.375分别对应 45°、90°、135°再平方回去。这套写法把 sqrt(价格) 当成一个 360° 的圆一整圈等于 1.0。它和矩阵几何并不等价。在矩阵里从第 n 环跨到第 n1 环开方值从 2n1 变成 2n3差值是 2不是 1。环内每格的 Δsqrt 约等于 1/(4n)n2 时正好是 0.125n20 时已经掉到 0.0125。也就是说0.125 这个常数只在第 2 环附近与矩阵吻合环号一大就完全对不上两套结果能差出一个数量级。提示选一套就一路走到底。要几何精确、能对着矩阵数格子的用环号加角度公式要跟老工具、老研报对数的用 0.125 那套但别声称它等价于矩阵。3. 用 Python 实现甘氏矩阵图价格推算的最小可运行代码3.1 生成矩阵三十行搞定螺旋填充矩阵本身只用于校验和可视化价格推算走的是闭式公式但先用代码把矩阵铺出来才能确认环号和角度没算错。def build_matrix(rings: int) - np.ndarray: 生成 (2*rings1) 阶甘氏矩阵图中心为 1方向顺序右、上、左、下。 size 2 * rings 1 mat np.zeros((size, size), dtypeint) r c rings mat[r, c] 1 val, length, d 1, 1, 0 dirs [(0, 1), (-1, 0), (0, -1), (1, 0)] # 右、上、左、下 while True: for _ in range(2): # 每条边长走两次方向转一次 dr, dc dirs[d % 4] for _ in range(length): r, c r dr, c dc val 1 mat[r, c] val if val size * size: return mat d 1 length 1 print(build_matrix(2))length从 1 开始每走完两条边自增一次正好复现 1,1,2,2,3,3 的边长序列。dirs的顺序决定了旋转方向把它改成[(0,1),(-1,0),(0,-1),(1,0)]之外的排列矩阵会镜像角度基准也随之变化所以这段不要随手改。3.2 反查任意价格落在第几环第几度真实价格动辄几千直接把 5000 塞进矩阵是没意义的必须先除以一个价格步长step换算成「格值」。5000 元、步长 10 元格值就是 500落在第 11 环角度可算。def gann_targets(price: float, step: float, levels: int 6) - dict: 把价格换算成格值给出同角度向外和向内的候选目标价。 v price / step return { ring: ring_of(v), angle: round(angle_of(v), 1), up: [round(c * step, 4) for c in ray_cells(v, levels, True)], down: [round(c * step, 4) for c in ray_cells(v, levels, False)], } def ray_cells(v: float, levels: int 6, outward: bool True) - list: 保持角度不变向外(内)跨环返回格值列表。 out, cur [], v sign 1 if outward else -1 for _ in range(levels): n max(ring_of(cur), 1) cur cur sign * 8 * n # 同角度跨一环格值增加 8n if cur 1: break out.append(cur) return out8 * n是核心常数。第 n 环环内第 k 格是 (2n-1)²k第 n1 环同角度的格子是 (2n1)²k两者相减正好是 8n。所以「同角度向外推一环」在格值上就是加 8n。相邻两环的价格比值是 ((n1)/n)²n8 时约 1.27n20 时约 1.10越往外越密这是甘氏矩阵图的固有几何特征不是参数没调好。3.3 参数怎么设层数、步长、方向参数含义常用取值影响step每个格值代表多少价格ATR(14)/2 或 1/100 价位量级决定网格疏密最关键levels向外推几环4 ~ 8太少给不出远端目标太多全是噪声rings矩阵铺几层只做校验时取 5 ~ 10与推算无关纯可视化起笔方向螺旋旋转朝向右起、逆时针全体角度平移不改变集合形状步长的选法先看标的的 14 日 ATR。ATR 是 0.20 元的股票step 取 0.10 元基准价 24.60 元对应格值 246落在第 8 环相邻目标位间隔约 26%、23%、21%节奏合理。若把 step 设成 0.01格值变成 2460环号升到 25相邻目标位间隔降到 8% 左右一串价位挤在一起回测时几乎每根 K 线都能碰到其中一个命中率必然虚高。注意不要为了让某个历史高点「刚好落在射线」上而反复回调 step。这是甘氏类工具最典型的过拟合方式第 4 章的随机基准就是用来识破它的。4. 实战把甘氏矩阵图推算结果接到真实行情上4.1 基点三选法低点、高点、区间中值同一个价格用不同基点算出来的射线不一样。工程上常用三种起点各自解决的问题不同。第一种是摆动低点用于推上方阻力适合上升趋势中回踩结束的位置。第二种是摆动高点用于推下方支撑适合下跌中继的反弹判断。第三种是区间中值比如 (最高最低)/2用于震荡区间内找中轴附近的密集位。三种基点算出的价位往往互相印证。实战做法是把三组结果合并落在 1.5 倍 step 以内的候选位归并成一个「价位簇」簇的成员越多说明这个位置在多个基点下都成立权重越高。def merge_levels(groups, tol): 把多组候选位按容差归并成价位簇返回 (中心价, 成员数)。 flat sorted(x for g in groups for x in g) clusters, cur [], [flat[0]] for x in flat[1:]: if x - cur[-1] tol: cur.append(x) else: clusters.append((round(sum(cur) / len(cur), 4), len(cur))) cur [x] clusters.append((round(sum(cur) / len(cur), 4), len(cur))) return clusterstol取 1.5 倍 step 是经验值太松会把相隔很远的价位糊在一起太紧则归并没效果。返回的成员数是排序依据成员数 3 以上的簇才值得挂单。4.2 回测触及率必须和随机基准比光看「命中了几次」毫无意义因为候选位越密命中越多。必须同时算一个随机基准候选位的总带宽占整个价格区间的比例。如果触及率只是略高于这个比例说明这套网格没有超出随机水平的解释力。def touch_rate(series, levels, tol, horizon): 未来 horizon 根 K 线内每个候选位被触及的比例不重叠窗口。 hit tot 0 for i in range(0, len(series) - horizon, horizon): w series[i 1:i 1 horizon] for lv in levels: tot 1 if np.any(np.abs(w - lv) tol): hit 1 return hit / tot if tot else 0.0 def null_rate(levels, series, tol): 随机基准候选位带宽占价格区间之比。 span series.max() - series.min() return min(1.0, len(levels) * 2 * tol / span) # 超发比 touch_rate / null_rate低于 1.2 视为无优势horizon建议取 10 到 20并且用不重叠窗口否则相邻窗口高度相关会把样本量虚增几倍。tol取 step 的一半。超发比这个指标比单看命中率靠谱得多指标计算方式参考阈值说明触及率命中数 / 候选位总数—单独看没有意义随机基准候选位带宽 / 价格区间—密度越高基准越高超发比触及率 / 随机基准 1.2 无优势主判据簇命中占比成员数≥3 的簇命中数 / 总命中数 0.5 可用衡量筛选是否有效跑一轮真实数据把 levels 从 8 降到 4再把 step 从 ATR/4 调到 ATR/2你会看到触及率断崖式下跌而超发比反而上升——这就是「候选位变少、每个更有含金量」的正常反应。反过来任何让触及率上涨但超发比不动甚至下降的调参都是在往噪声里塞参数。5. 标定与排错让甘氏矩阵图推算结果能被证伪5.1 用 ATR 校准步长而不是死守 0.125步长决定了环号环号决定了射线间距这是整条链路里唯一真正需要标定的参数。固定用 0.125 起步的写法在不同价位量级的标的上会给出完全不同的疏密根本无法横向比较。改成按波动率标定就稳了def auto_step(highs, lows, closes, k0.5): 按 ATR(14) 反推价格步长k 控制疏密。 tr np.maximum(highs[1:] - lows[1:], np.maximum(np.abs(highs[1:] - closes[:-1]), np.abs(lows[1:] - closes[:-1]))) atr tr[-14:].mean() return round(atr * k, 6)k0.5时网格间距约等于半个 ATR一个波段里通常能筛出三到五个有效簇k0.25更密适合日内k1.0很稀只适合大级别。这个写法还有一个好处ATR 随波动率变化步长跟着变网格自动适配牛熊切换不会在低波动期给出一堆永远碰不到的远端目标。5.2 三类高频错误基点漂移、环数不足、角度方向搞反基点漂移最常见。回测时用窗口内的极值做基点实盘却用固定日期两者算出的射线完全不同结果就是回测漂亮实盘失灵。正确做法是在窗口起始时刻锁定基点并写进状态后面不再改。环数不足体现在只在近端找目标。levels 取 2 时能给的候选位太少超发比看着很高其实是样本太小。建议至少 4 环并且把超出价格区间 20% 以外的远端结果直接丢掉而不是硬留着凑数。角度方向搞反则是实现层面的。dirs的排列决定了矩阵是逆时针还是顺时针ray_cells里的8n是加还是减决定了射线朝外还是朝内。验证方法很简单拿矩阵图打印出来手工数一遍 9 和 17 的角度是否同为 315°对不上就是方向反了。这一步用build_matrix(3)输出后肉眼核对比读十遍公式快。还有一个隐性坑ring_of在整数平方处会因浮点误差跨环。9、25、49 这些值必须落在第 1、2、3 环若出现偏差把1e-9调到1e-6再试。整条链路跑通之后把 step 设成 ATR(14)/2 再跑第 4 章的回测循环通常能看到超发比在 1.3 到 1.6 之间——那个数字才是这套东西真实的水平也是继续调参的起点。本文还有配套的精品资源点击获取