- Published on
矩阵函数:JD
- Authors

- Name
- CoresightQuant
NOTE
本文为公开交易策略的技战术复盘,聚焦方法逻辑、交易场景与风险边界。
策略解读
这段脚本注释来自一位名为 Duyck 的交易研究者,其标题“Matrix functions - JD”直译过来是“矩阵函数——JD”。从标签“动量/趋势”可知,作者试图利用矩阵工具来服务动量与趋势分析。说白了,就是把平时按时间顺序排列的一串价格、涨跌幅、指标值等数据,重新排列成一个类似 Excel 表格的二维结构:行与列。行的维度可以理解为时间窗口的滑动,列的维度可以理解为不同的资产、不同的指标或不同的参数组合。于是,原来只能按顺序一个一个看的数列,变成了一张可以横向比较、纵向回溯的“数据棋盘”。
在传统的技术指标里,我们通常面对的是单个序列,比如收盘价序列、成交量序列。而一维数组更像是一个“口袋”,可以装下很多个序列的切片。但一维终究是线性的,许多高级分析需要同时观察多个窗口、多个标的或多种状态。矩阵的出现,相当于把一维的口袋摊开成一张网格,让我们能逐格对比。例如,我们可以把最近 30 天的每日动量值放成一列,把 20 个不同标的的动量值排成多列,从而形成一张“动量热度表”。再配合逐行扫描,就能发现哪些标的在不同时间窗口内都保持了强势。
作者 Duyck 的贡献在于,他设计了一组函数,用来完成这种“一维转二维”的数据整形工作。有了它们,我们就不用手工复制粘贴数十次历史数据,也不必反复循环遍历数组。无论是提取某一列做排序,还是对每一行做统计计算,都变得清晰直接。更重要的是,矩阵结构天然支持“截面分析”——即在同一个时间点比较多个对象,这正是动量策略和趋势筛选的核心需求。
从实战角度看,这种矩阵化处理至少带来三个直接好处:第一,扫描全市场股票时,不再需要为每只股票写单独的计算逻辑;第二,多周期动量可以打包进同一张表,方便观察拐点;第三,可以轻松计算矩阵中行与行之间的差异,捕捉动能变化的速度。当然,矩阵本身不是策略,而是一种高效的“容器”。真正的交易决策仍然需要人设定规则,比如“当某标的在 5 日、10 日、20 日三列动量值中都排名前 10% 时,视为强势”。矩阵函数只是让这类规则执行得更快、更直观。
名词解释
-
一维数组(线性队列)
一种按顺序排列的数据集合,如同一条线上串着多个数值。在交易软件中,它常用于保存收盘价、最高价、指标输出等历史序列。一维数组只能通过索引(位置序号)访问元素,形态单一。 -
二维矩阵(表格结构)
由行与列组成的数据网格,每个位置由“行号+列号”共同确定。例如,一张 5 行 3 列的矩阵可以保存 5 个交易日 × 3 种指标的数据。矩阵便于做横向比较(同一时间不同指标)和纵向比较(同一指标不同时间)。 -
动量(Momentum)
衡量价格在一定时间内变化幅度的指标,通常计算为当前价格与 N 期前价格的差值或比率。动量为正表示上涨趋势,为负表示下跌趋势。高动量常被视为趋势延续的信号,但过度极端时也可能提示超买。 -
趋势(Trend)
价格在一段时间内总体运动的方向,分为上升、下降和横盘。趋势跟踪策略的核心是“顺势而为”,通过过滤噪声来识别长期方向。矩阵化趋势分析往往同时观察多个时间周期的趋势斜率,以确认一致性。 -
截面分析(Cross-Sectional Analysis)
在同一个时间点上,对多个对象(如不同股票、不同币种)进行横向比较的方法。与时间序列分析不同,它不关注单一对象的历史演变,而是关注群体内的相对强弱。动量排序、行业轮动都依赖截面数据。 -
时间窗口(Lookback Window)
计算指标时回顾的历史长度,例如“20 日动量”中的 20 日就是一个时间窗口。不同窗口捕捉不同级别的趋势,短窗口敏感、长窗口稳定。矩阵化的优势之一,就是能同时容纳多个窗口的计算结果。
策略思路讲解
动量/趋势类策略的底层逻辑很朴素:过去一段时间表现好的资产,未来一段往往继续表现好;反之亦然。但实施时有个难题——市场上可能有数百甚至数千个交易标的,而每个标的又有多个时间周期。如果逐个手工计算,效率极低。矩阵函数恰好解决了这个痛点。
具体来说,我们可以用以下步骤构建一个基于矩阵的动量趋势策略:
第一步,数据准备。
将原始价格序列按标的分组,并将每个标的不同时间窗口(比如 5 日、10 日、20 日、60 日)的动量值计算出来。此时,每个标的有四个数值,可以排成一行;所有标的合起来就是一个“标的 × 窗口”的二维矩阵。
第二步,矩阵转换。
借助一维转二维函数,把原本线性排列的数据重新组织。假如我们原本把 100 个标的的 20 日动量依次放在一个长数组里,转换后,就能得到一个 100 行、1 列的矩阵;再添加其他窗口,就变成 100 行多列。作者设计的函数允许动态指定行列数,并且支持滚动更新——每次新数据到来时,矩阵自动右移,保持最新状态。
第三步,逐列与逐行分析。
有了矩阵,我们就可以做两件事:一是“逐列排名”,即对每个时间窗口内部,对所有标的的动量大小进行排序。排名靠前的标的意味着在该周期内相对强势。二是“逐行计分”,即对每个标的,计算它跨各窗口的相对排名均值。如果某标的的 5 日、20 日、60 日动量排名都很靠前,说明短期、中期、长期趋势共振,这是非常强的信号。
第四步,建立信号规则。
一个典型的规则是:当某标的的“多窗口动量综合得分”进入全体标的前 5% 时,开仓做多;当得分跌出前 10% 时,平仓离场。同时,可以根据矩阵中的列差异来调整仓位——例如,若短期动量排名显著高于长期动量排名,说明趋势正在加速,可以适当增加仓位;反之则减少。
第五步,风险控制与组合构建。
矩阵还可以用来监控组合的风险。比如,将持仓标的的当日涨跌幅放入一个子矩阵,实时计算整个组合的平均动量、分散度以及相关性。一旦发现动量整体衰减或者标的间相关性骤然升高,就降低总仓位,防止系统性回撤。
其实,这整条思路并不需要编写复杂的循环或条件语句,核心逻辑都隐藏在二维表格的“看”之中:哪一行颜色最亮?哪一列数值持续增加?矩阵函数把“看”变成了一种可编程、可回测的机械动作。交易者只需定义好规则,剩下的交给数据的网格。
优点
-
极大提升多标的扫描效率
使用矩阵化处理后,原本需要重复执行的单标的计算,变成了一次二维运算。对全市场 5000 只股票做动量排序,耗时从数分钟降低到秒级。这在实时交易中至关重要,因为机会稍纵即逝。 -
便于多周期共振验证
矩阵天然支持多列多窗口。交易者可以一眼看出某标的在 5 日、20 日、60 日窗口上的动量是否都处于高位,避免单一周期产生的假信号。这种“多周期确认”是趋势跟踪成功的关键。 -
代码逻辑清晰,易于扩展
虽然我们不写代码,但从设计理念上看,矩阵函数将“数据整形”与“策略逻辑”分离。无论日后增加新的指标(如欧奈尔的 RPS)、新的市场、新的周期,只需调整矩阵的维度或填充内容,而不需要颠覆原始逻辑。这对维护和迭代非常友好。 -
支持精巧的截面排名策略
动量因子的超额收益主要来自相对强弱,而非绝对涨跌。矩阵化的截面数据让“相对”变得直观。交易者可以直接按行排名,选出强者,规避弱者,非常契合 A 股、美股等个股分化明显的市场。 -
降低内存占用与运行开销
一维转二维后,数据存储更紧凑。对历史数据做滚动窗口计算时,矩阵结构允许复用中间结果,避免重复计算。这在长时间回测或高频数据上尤其有价值。
缺点
-
学习曲线陡峭,概念抽象
对于习惯了看 K 线和简单均线的交易者来说,“二维矩阵”“行列索引”“滚动更新”这些概念需要时间消化。如果理解不透彻,很容易在设置矩阵维度时出错,导致数据错位,信号失真。 -
对数据对齐要求极高
矩阵中同一列必须对应相同时间戳,同一行必须对应同一标的。如果不同标的有停牌、缺失数据或上市时间不同,直接填充矩阵会留下空洞,甚至造成错位。若不做严格对齐,排名结果将毫无意义。 -
过度工程化,可能脱离实际行情
矩阵函数本身只是数据处理工具,并不产生 alpha。新手容易沉迷于“把数据做成花哨的表”,却忘了交易的核心是盈亏比和风险管理。华丽的数据表格不等于有效的策略。 -
样本内过度优化的风险增加
当矩阵同时展示多个窗口、多种分位数、多种组合方式时,研究者容易尝试大量参数组合,最终“选择”出一套在历史数据上表现极佳、但未来会迅速失效的规则。这种过拟合是通过复杂工具更容易掉入的陷阱。 -
实时计算可能面临延迟问题
虽然矩阵化整体上提升效率,但如果矩阵规模过大(比如 5000 标的 × 100 窗口 × 每分钟刷新),每次重建矩阵与排序仍会产生一定延迟。在毫秒级交易场景中,这种开销不可忽略。
起源年份考证
需要说明,“矩阵”本身是数学和计算机科学中的古老概念,可以追溯到 19 世纪凯莱创立的矩阵论。但将矩阵函数用于金融技术分析,尤其是普通交易者手中的数据脚本,则要晚得多。按照该方法类型的行业发展脉络,我们给出以下时间线:
- 1960 年代:量化投资萌芽。马科维茨提出投资组合理论,将协方差矩阵引入资产配置。这是金融领域第一次大规模使用“矩阵”概念。但那时的“矩阵”是理论推导工具,并非实时交易脚本。
- 1980 年代至 1990 年代:个人电脑普及,技术分析软件开始流行。分析师常用表格软件(如 Lotus 1-2-3、Excel)手工构建“电子表格矩阵”来计算动量排名。当时已有今天所谓“截面动量”的雏形,但操作繁琐。
- 2003 年:论文《Value and Momentum Everywhere》发表(Asness、Moskowitz、Pedersen),系统证明了动量因子在全球市场有效。此后,动量策略成为量化研究的主流方向之一,研究者开始追求更高效的多资产多周期动量计算工具。
- 2010 年代中期:公开交易社区(如新兴的脚本化策略平台)逐渐普及。早期脚本语言只支持简单的数组和循环,无法优雅地处理多维数据。许多开发者开始尝试用自定义函数模拟矩阵操作。
- 2018 年前后:随着数组函数库的日益丰富,多位开发者在公开社区发布了“一维转二维”的工具函数。作者 Duyck 发布的“Matrix functions - JD”正是这一波方法中的代表作品之一。具体发布日期无法精确考证,但从该类方法的活跃时期来看,大致可以认定在 2018 年至 2020 年之间。
需要强调的是:上述时间线是基于“一维数组转二维矩阵”这类方法在普通交易脚本中的普及历程做的行业考证,并非针对 Duyck 个人发布日期的直接证据。若需确切时间,只能以原始脚本在社区中的首发记录为准。
改进建议
-
增加缺失值处理机制
建议设计矩阵时,预留“空值”标识,并自动跳过缺数据标的企业。例如,当某只股票上市不足 60 天时,就不参与 60 日动量排名,而不是硬塞一个 0 值。这样可以避免大量前期无效信号。 -
加入动态时间窗自适应
固定窗口无法适应不同波动环境的品种。可以设计成:根据矩阵中每列的波动率自动调整窗口长度。波动大时缩短窗口,波动小时延长窗口。这样能更好地捕捉相对稳定的动量。 -
与风险指标矩阵合并使用
目前矩阵主要存储动量/趋势数据。可以扩展为同时保存波动率、最大回撤、成交量等风险度量。每增加一个维度(用第三层数组或列表嵌套)即可形成“风险-收益矩阵”。交易者可按不同风险预算筛选标的,让信号更稳健。 -
引入衰减权重
动量计算虽然通常采用简单差分,但更细致的做法是给近期价格更高权重。建议在矩阵转换后,对列向量乘上一组时间衰减系数。例如,第 t 天的动量贡献权重为 0.95^(N-t)。这能减少极端价格冲击带来的跳变。 -
提供交互式快照对比
在回测时,可以设计一种“矩阵快照”功能,定时保存每个月末的截面矩阵。这样就能复盘不同市场阶段(牛市、熊市、震荡市)中动量分布的模样。长期积累后,可以训练出更适应周期切换的规则。 -
考虑交易成本与流动性过滤
矩阵中的动量排名往往包含大量小市值股票,它们的交易成本高、滑点大。建议在矩阵中加入“成交额”列,并在排名时剔除流动性不足的标的。同时提供交易成本模拟器,将成本矩阵化,评估净收益。 -
多层背景色提示与交互
虽然不写界面,但从易用性上,可以对矩阵中的数值设置颜色梯度,比如强动量标红、弱动量标绿。这样实战时不需要逐格读数字,只要扫一眼“颜色矩阵”,就能迅速锁定重点关注对象。这也是“Matrix functions”这个名字的视觉体现。 -
定期重新校准矩阵维度
市场结构会变化,十年前 60 日动量可能有效,如今或许 30 日更合适。建议定期(如每季度)回测不同窗口组合在矩阵中的表现,动态调整列的数量和间距。让矩阵始终匹配当前市场的“节奏”。
总结
“Matrix functions - JD”本质上是一个精巧的数据整形工具,它把一维的线性数组转换成二维矩阵,使得动量/趋势策略的研究与执行变得更加直观和高效。作者 Duyck 用一组函数,为交易者打开了一扇“多维度观察市场”的窗口。
我们不应把矩阵函数看作一个可直接盈利的“圣杯”,而应将其视为一种思维方式:把繁琐的时间序列处理,转化成清晰的截面比较。真正让策略赚钱的,仍然是对动量本质的理解——趋势会延续,但也会反转;强者恒强,但也会衰竭。矩阵只是让我们能比别人更快地看到“强”与“弱”的分布。
在实际应用中,我们可以借用它的优点扫描全市场,筛选出多周期共振的标的;利用它的缺点警示自己不要过度拟合,不要忽略数据对齐等基础问题。结合对历史起源的考证,我们也能感受到:量化工具的发展是逐步累积的,从马科维茨的协方差矩阵,到电子表格,再到脚本函数,每一步都在降低普通人参与专业分析的门槛。
最后,无论工具如何先进,交易纪律与风控永远居于首位。矩阵能让你的视野更广,但能不能握住好牌、及时离场,依然取决于你内心的规则。愿每一位读者都能把这张“数据棋盘”下成自己的常胜之局。