简介:《甘氏矩阵图价格推算》汇编PDF面向股票、外汇、期货等金融市场的技术分析学习者与交易者,帮助读者跳出繁杂指标与线条,用一张方形数字矩阵理解行情的进退节奏与趋势拐点。全书围绕甘氏矩阵图的原理展开,从基数「1」的螺旋排列讲起,详解两条对角角线、水平线与垂直十字线所构成的角度区域,并列出各条线上的关键数字序列,说明支撑、压力与多空动能的判断依据;同时给出近、远期价位的推算思路与「大数推算」方法,强调以固定、有序的数字规律替代主观情绪,减少心理弱点与人为陷阱的干扰。压缩包内为1个PDF文件,大小约4.01MB,内容完整、便于归档查阅。目前已有340人学习下载,适合作为技术分析专题的系统入门与工具手册。
1. 甘氏矩阵图价格推算落成代码要解决的核心问题
行情软件里那张螺旋排布的九宫格,绝大多数人只把它当装饰。真要用它推算价位,麻烦立刻出现:手工在图上数格子,一圈一圈往外数,数到第六圈眼睛就花了;一份《甘氏矩阵图价格推算[汇编]》几百页,翻到某一页某个基准价对应的 90 度阻力位,抄错一位小数就把整条交易计划带偏。更现实的问题是,汇编里的数字是死的,行情是活的,基准价一变,整张表的推算结果全部作废。把这件事写成代码,核心就三件事:用确定性的规则把螺旋矩阵生成出来,用平方根和角度的换算把任意基准价的上下档位一次性算出来,再把 PDF 汇编里的历史数据抽成结构化字段回算校验,确认自己理解的规则和汇编作者一致。适合做量化复盘、做日内价位带、或者单纯想把技术分析里的模糊步骤变精确的人。
2. 甘氏矩阵图的螺旋生成:从中心 1 到 9×9 网格的正确落位
甘氏矩阵图(Square of 9,国内常叫甘氏九宫格)的骨架是一个从中心向外逆时针盘旋的数字方阵。中心放 1,向右走一格放 2,然后向上、向左、向下依次绕行,每绕半圈步长加一。这个规则听着简单,但落到代码里有三处细节必须钉死,否则生成出来的矩阵和别人手里的图镜像对不上,后面所有角度推算都是错的。
2.1 起点、旋向与步长:决定矩阵长相的三个量
第一个量是起点方向。中心值为 1 时,2 放在 1 的正右方还是正上方,直接决定整套图是顺时针还是逆时针。业内通行的版本是 2 居中宫之右,此后按右、上、左、下循环转向,这样得到的图里,1、9、25、49、81 这几个奇数平方数会整齐地落在从中心出发的右下对角线上。第二个量是步长序列,走完一段直线才转向,步长依次为 1、1、2、2、3、3、4、4……不是等步长。第三个量是中心值,实盘推算时有人固定用 1,也有人把当前基准价直接放中心再铺开,两种做法的角度换算公式完全一致,只是查表口径不同。下表把常见参数组合和后果列清楚:
| 参数 | 常见取值 | 改错后的现象 |
|---|---|---|
| 起始方向 | 右 | 图整体镜像,45 度位与 315 度位互换 |
| 转向顺序 | 右→上→左→下 | 变成顺时针螺旋,平方数落到左上对角线 |
| 步长增长 | 每两个方向 +1 | 等步长会出现空洞,数字总数对不上 |
| 中心值 | 1 或基准价 | 只影响读数口径,不影响相对角度 |
2.2 一个生成函数把矩阵画出来
把上面三个量写进一个函数就够了。下面这段代码按radius控制半径,radius=4生成 9×9 的方阵,返回值用坐标作键,y 轴向上为正,方便后面直接算角度。
def build_square_of_nine(radius=4, start=1): """生成 (2*radius+1)^2 的九宫格矩阵。 radius: 半径,4 表示 9x9 start : 中心起始值 返回 grid[(x, y)] = value,y 轴向上为正 """ total = (2 * radius + 1) ** 2 grid = {(0, 0): start} x = y = 0 value = start dirs = [(1, 0), (0, 1), (-1, 0), (0, -1)] # 右、上、左、下 step_len = 1 # 当前方向连续走几步 d = 0 # 方向指针 while len(grid) < total: for _ in range(2): # 每个步长覆盖两个方向 dx, dy = dirs[d % 4] for _ in range(step_len): if len(grid) >= total: break x += dx y += dy value += 1 grid[(x, y)] = value d += 1 step_len += 1 # 每绕半圈,步长加一 return grid def render(grid, radius=4): for y in range(radius, -radius - 1, -1): row = [f"{grid.get((x, y), 0):>6}" for x in range(-radius, radius + 1)] print("".join(row)) render(build_square_of_nine(4))跑出来的结果应该是这样,注意右下角那条对角线:
65 64 63 62 61 60 59 58 57 66 37 36 35 34 33 32 31 56 67 38 17 16 15 14 13 30 55 68 39 18 5 4 3 12 29 54 69 40 19 6 1 2 11 28 53 70 41 20 7 8 9 10 27 52 71 42 21 22 23 24 25 26 51 72 43 44 45 46 47 48 49 50 73 74 75 76 77 78 79 80 81step_len += 1放在内层循环之外,是为了保证每两个方向走完后步长才增长一次;如果写在内层循环里,步长会变成每换向就加一,矩阵立刻变形。d % 4用来循环方向指针,不取模会越界。total的边界判断放在三层循环的最里面,是因为最后一圈通常走不满,越界写入会污染坐标。
2.3 用 25、49、81 落位反查生成是否正确
生成完不要急着往下算,先做一次落位校验。奇数平方数在标准甘氏矩阵图里必须落在同一条对角线上,而且方向一致。上面那张图里,1 在 (0,0),9 在 (1,-1),25 在 (2,-2),49 在 (3,-3),81 在 (4,-4),全部压在主对角线上。可以用三行代码断言:
grid = build_square_of_nine(4) squares = {1: (0, 0), 9: (1, -1), 25: (2, -2), 49: (3, -3), 81: (4, -4)} for v, pos in squares.items(): assert grid[pos] == v, f"{v} 应该落在 {pos},实际是 {grid.get(pos)}" print("落位校验通过")任何一条断言失败,都说明起始方向或者转向顺序被改动了,这时候先别怀疑公式,回到 2.1 的三个参数逐一比对。这份校验一次写好,以后换中心值、换半径都能复用,比自己盯屏幕数格子靠谱得多。
3. 角度与平方根换算:甘氏矩阵图价格推算公式的推导与参数
矩阵只是底图,真正用来推算价格的是平方根和角度之间的那条线性关系。很多人直接把sqrt(价格) ± 0.25当口诀背下来,用是能用,但一旦遇到 135 度、270 度这种非整档角度就卡壳,也不知道该加几圈。把推导走一遍,参数就能自己算。
3.1 一圈 360 度为什么等于平方根加 2
看 2.2 那张图的右下方对角线。同一角度方向上,相邻两圈的数字分别是 (2k+1)² 和 (2k+3)² 附近,例如 9、25、49、81。把它们的平方根取出来:3、5、7、9,差值恒定是 2。换句话说,在甘氏矩阵图上绕中心走完整整一圈 360 度,对应的平方根增加量就是 2。这个关系是整个价格推算法则的地基,它不是拟合出来的经验值,而是螺旋方阵本身的几何性质。
既然 360 度对应平方根增量 2,角度到增量的换算是纯线性的:
$$\Delta\sqrt{P} = 2 \times \frac{\theta}{360} = \frac{\theta}{180}$$
于是 45 度对应 0.25,90 度对应 0.5,180 度对应 1,360 度对应 2。反过来说,已知某个价位想求它相对基准价的角度,把两个价位分别开方相减,再乘 180 就得到角度差。这就是为什么老手看盘时习惯先算开方——所有角度关系在平方根尺度上才是一把直尺。
3.2 45/90/180/360 度价位表与常用参数
把公式写成表格更直观。以基准价 100 为例,sqrt(100) = 10,上下各档位如下:
| 角度 | Δsqrt | 上方阻力 | 下方支撑 | 说明 |
|---|---|---|---|---|
| 22.5 | 0.125 | 102.52 | 97.52 | 半分位,用于窄幅整理 |
| 45 | 0.25 | 105.06 | 95.06 | 最常用,日内第一阻力 |
| 90 | 0.5 | 110.25 | 90.25 | 次级结构位 |
| 135 | 0.75 | 115.56 | 85.56 | 常被忽略,实盘有反应 |
| 180 | 1.0 | 121.00 | 81.00 | 强支撑阻力,整数平方 |
| 270 | 1.5 | 132.25 | 72.25 | 跨圈位,用于大级别 |
| 360 | 2.0 | 144.00 | 64.00 | 一整圈,趋势反转参考 |
表里 180 度那行最值得记:基准价 100 的上下 180 度位正好是 121 和 81,两个完全平方数。选基准价时如果刻意避开整数平方附近,反而会让 180 度位落在小数上,读数不干净。这是选基准价的一个实用偏好。
提示:角度超过 360 度就进入第二圈,公式不变,但实务中很少用到三圈以外,因为误差积累和噪音会淹没信号。
3.3 从矩阵落点到价格:写一个 level 函数
把公式封成函数,输入基准价和角度序列,直接输出上下档位。注意支持位可能算出负数,需要做保护。
import math def sq9_levels(base_price, angles=(22.5, 45, 90, 135, 180, 270, 360)): """按甘氏矩阵图平方根法推算上下档位。 base_price: 基准价,必须为正数 angles : 要推算的角度序列,单位度 返回 list[dict] """ if base_price <= 0: raise ValueError("基准价必须为正数") root = math.sqrt(base_price) rows = [] for a in angles: delta = a / 180.0 up_root = root + delta down_root = root - delta rows.append({ "angle": a, "delta_sqrt": round(delta, 4), "resistance": round(up_root ** 2, 4), "support": round(down_root ** 2, 4) if down_root > 0 else None, }) return rows for r in sq9_levels(100): print(r)base_price <= 0的检查不能省,负数开方会直接抛异常,而基准价来自行情接口或 PDF 解析结果时,脏数据很常见。down_root > 0的判断同样必要:当基准价很小、角度很大时,例如基准价 1.2 推 360 度,sqrt(1.2) - 2是负数,平方之后得到一个虚假的正支撑位,这种位必须返回 None 而不是数字。delta_sqrt单独保留在返回值里,是为了排查时能一眼看出用的是哪个换算口径——有人按 0.125 的倍数记,有人按角度记,两者等价,但混用就会出现四分之一档的偏差。
4. 解析甘氏矩阵图价格推算[汇编].pdf:表格抽取与矩阵反查校验
手上有《甘氏矩阵图价格推算[汇编]》这类 PDF 时,最省事的做法是把里面的价位抽出来,用第 3 章的公式反算一遍,对得上说明规则一致,对不上就得去看是汇编用了别的口径,还是自己抄错了。PDF 解析的坑集中在两点:矩阵页和表格页的取数方式完全不同。
4.1 pdfplumber 抽文本层与表格层的取舍
带线框的表格页,extract_tables()能直接给出二维列表,省事但依赖线框完整;而九宫格矩阵页通常没有线框,数字是一个个独立的文本对象,只能靠坐标还原。这时候用extract_words()拿到每个词的包围盒,再按 y 坐标聚类成行、按 x 坐标排序成列。
import pdfplumber import re def extract_numeric_words(pdf_path, page_index): """从指定页抽取所有纯数字文本及其坐标。""" with pdfplumber.open(pdf_path) as pdf: page = pdf.pages[page_index] words = page.extract_words(keep_blank_chars=False) cells = [] for w in words: t = w["text"].strip().replace(",", "") if re.fullmatch(r"\d+(\.\d+)?", t): cells.append({ "value": float(t), "x": round(w["x0"], 1), "y": round(w["top"], 1), }) return cells def group_rows(cells, tol=3.0): """按 y 坐标把数字聚成行,容差 tol 单位是 pt。""" rows = [] for c in sorted(cells, key=lambda c: c["y"]): if rows and abs(c["y"] - rows[-1][0]["y"]) <= tol: rows[-1].append(c) else: rows.append([c]) return [sorted(r, key=lambda c: c["x"]) for r in rows]keep_blank_chars=False是为了避免空格被当成独立文本对象混进来。re.fullmatch而不是search,是防止「12.5%」这类带单位的字符串被误判成数字。tol=3.0这个容差是经验值,正常 PDF 同一行内数字的top抖动在 1 到 3 pt 之间,字号越大抖动越大,正文字号 10 pt 左右取 3 就够,如果发现同一行被拆成两行,把 tol 调到字号的一半再试。
4.2 列名标准化与基准价对齐
抽出来的行只是数字序列,还得映射到「基准价 / 角度 / 价位」这三个语义字段。汇编的排版习惯不一样,有的把基准价放在页眉,有的把角度写成「45°」「45度」「1/8 圈」混用。清洗时统一成数值。
| 原始形态 | 标准化目标 | 处理方式 |
|---|---|---|
45°、45度 | 45.0 | 正则提取数字 |
1/8 圈、1/4 圈 | 45.0、90.0 | 分数乘 360 |
1,234.5 | 1234.5 | 去掉千分位逗号 |
| 页眉里的基准价 | 单独字段 | 从页首文本块提取,不参与行聚类 |
对齐基准价有个常见误区:把页面上出现的第一个大数字当基准价。汇编排版里,页眉的页码、章节号往往和基准价字号接近。稳妥做法是记录页面上所有数字的坐标,取位于页面上部四分之一区域、且字号最大的那个,再人工抽查前几页确认。
4.3 用生成矩阵反查校验解析结果
抽完之后立刻做回算校验,这一步能挡掉八成以上的低级错误。
import math def verify_level(price, base, angle, rel_tol=0.001): """校验某个价位是否符合 sqrt 角度公式,rel_tol 为相对误差上限。""" expect = (math.sqrt(base) + angle / 180.0) ** 2 return abs(price - expect) <= expect * rel_tol, expect ok, expect = verify_level(121.2, 100, 180) print(ok, round(expect, 2)) # True 121.0rel_tol用相对误差而不是绝对误差,是因为汇编里价位往往保留两位小数,基准价越大绝对误差越大。0.1% 的相对容差对 100 附近的价位相当于 0.12,对 10000 附近的价位相当于 12,这个尺度变化正好对应排版精度。如果某个价位的回算偏差稳定在某个固定比例上,比如总是偏 0.13%,那多半不是抄错,而是汇编作者用了 0.125 的整数倍做档位、或者把一个圆周按 8 等分而不是按角度插值。这种系统性偏差要用「偏差是否同号」来区分:随机正负是抄录错误,同号同幅是口径差异。
注意:解析结果不要直接进交易信号,至少人工核对前 5 页,确认基准价字段和角度口径与自己的实现一致之后再批量跑。
5. 多周期共振与价格推算偏差排查的实战技巧
5.1 用多个基准价做平方根共振筛选
单个基准价算出来的档位,噪音大。实务里更常用的做法是选多个基准价——比如一段区间的最高价、最低价、整数关口——分别推档位,然后看哪些价位被重复命中。命中次数越多,这个价位越值得盯。
def resonance(hits, rel_tol=0.002): """把多个来源推出来的价位聚成簇,返回 (中心价, 命中次数)。""" hits = sorted(hits) clusters = [] for p in hits: if clusters and abs(p - clusters[-1][0]) / clusters[-1][0] <= rel_tol: clusters[-1].append(p) else: clusters.append([p]) return [(round(sum(c) / len(c), 4), len(c)) for c in clusters] bases = [98.5, 100.0, 103.2] hits = [] for b in bases: for r in sq9_levels(b): hits.append(r["resistance"]) if r["support"]: hits.append(r["support"]) print([c for c in resonance(hits) if c[1] >= 2])rel_tol=0.002是聚簇的关键参数。调大,不同来源的档位会被合并成一簇,看着命中多其实是虚的;调小,同一个理论价位因为各基准价取整方式不同会被拆开。判断标准很简单:用纯随机价位跑一遍,如果聚出来的簇数量和真实数据差不多,容差就设得太松了。if c[1] >= 2只保留至少被两个基准价命中过的价位,这是最基础的一层过滤。
5.2 偏差排查的三步顺序
推算结果和盘中实际反应对不上时,按下面顺序查,不要跳步:
| 顺序 | 检查项 | 典型症状 | 定位手段 |
|---|---|---|---|
| 1 | 角度口径 | 所有档位整体偏移 1 到 2 个点 | 打印delta_sqrt,看是否为 0.125 的整数倍 |
| 2 | 基准价更新时间 | 只有某一段行情偏差大 | 对齐基准价的时间戳与 K 线时间 |
| 3 | 矩阵落位 | 平方数不在对角线 | 复用 2.3 的断言脚本 |
第一步永远先查角度口径,因为它是全局性的,一错全错。只有当偏差是局部出现时,才去怀疑基准价取错或矩阵生成有问题。矩阵落位出错的情况其实很少,因为 2.3 的断言只要跑过一次就会暴露,但换了起始方向之后忘了重跑断言,图会悄悄镜像,这时候 45 度位和 315 度位互换,盘中表现是「明明该是阻力却一穿而过」。
5.3 一个容易被忽略的收尾动作
每换一个品种或者换一个基准价区间,把共振簇的中心价和当前实际价位一起打印出来做一次目视比对。共振簇如果出现连续三档中心价间隔都接近同一个数值,说明这几个基准价选得太近,等于在同一个价位上重复计数,命中次数会虚高。这时候把基准价的间隔拉大到至少 180 度档位差的两倍,簇的分布才会重新变得有区分度。这个参数没有理论最优值,只能靠每次重跑共振函数时看一眼簇间距来调。
本文还有配套的精品资源,点击获取