非广延统计分布结构化分析的本征坐标法应用·综合运用
(3/3)· 当 q-Gaussian 只是数字近似而非解析真相,如何用本征坐标拆开分布的结构化属性
◍ 从一段日志看 EURUSD 噪声分布
下面这段 MT5 专家日志来自 EURUSD H1 图表上名为 EC_Example1-noise 的脚本,同一秒(2012.06.21 14:24:30)连续打印了三组数值,每组四个浮点数。 第一组序号 1 的四个数分别为 254.45082565、185.19087989、354.25574000、125.17343164;第二组序号 2 为 185.19087989、136.81028987、254.92996885、97.14705491;第三组序号 3 为 354.25574000、136.81028987 未出现而首值是 354.25574000、254.92996885、501.76021715、159.49440494。 注意序号 1 的第二数(185.19)正好是序号 2 的首数,序号 2 的第三数(254.93)又接近序号 1 的第三数(354.26 误植可能性需查源码),这种首尾承接说明脚本在按某种滑动窗口输出统计量。 外汇与贵金属属高风险品种,这类噪声估计仅用于刻画波动结构,不能直接推断后续方向,开 MT5 把这段日志对应的 EA 跑一遍 H1 才能确认计算逻辑。
class="num">2012.06.class="num">21 class="num">14:class="num">24:class="num">30 EC_Example1-noise(EURUSD,H1) class="num">1 class="num">254.45082565 class="num">185.19087989 class="num">354.25574000 class="num">125.17343164 class="num">2012.06.class="num">21 class="num">14:class="num">24:class="num">30 EC_Example1-noise(EURUSD,H1) class="num">2 class="num">185.19087989 class="num">136.81028987 class="num">254.92996885 class="num">97.14705491 class="num">2012.06.class="num">21 class="num">14:class="num">24:class="num">30 EC_Example1-noise(EURUSD,H1) class="num">3 class="num">354.25574000 class="num">254.92996885 class="num">501.76021715 class="num">159.49440494
把非广延分布拆成可积本征基
非广延统计框架下的概率密度 P1(x) 与 P2(x) 并不服从经典高斯假设,前者对应 q 指数型衰减,后者退化情形就是 q-Gaussian。对 P1(x) 做微分再在 [xm, x] 区间积分,可得到一组本征坐标 X1、X2,使原函数在基上近似线性展开;P2(x) 则引出 4 个本征坐标 X1–X4,参数间存在恒等式约束,严格对应的数据必然满足。 用 EURUSD H1 实测跑 EC_Example2,1000 点模型 P1(x,1,0.5,2) 反推得 theta=1.98665、a=0.50561,C1=-0.50561、C2=-0.49886,与预设 0.5/2 偏差不到 1.4%,说明本征展开对参数还原是有效的。图 19 里 Y1 在开头和三分之二处轻微弯折,根子是 X1(x) 不具备积分性质,不是数值误差。 P2(x) 的本征展开多一层代数消元,参数 B 仍由归一化条件定;若数据真来自 P2 族,展开系数间的关系式会恒成立,这能反过来证伪“硬套分布”的分析。外汇与贵金属价格服从此类厚尾分布的概率偏高,但杠杆品种回撤风险极大,验证前先用模拟盘跑通再上实盘。 下面这段是 EC_Example2 里算本征坐标的核心,直接抄进 MT5 自定义类就能用:
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| CalcY | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void CECCalculator::CalcY(class="type">class="kw">double &y[]) { if(m_size==class="num">0) class="kw">return; ArrayResize(y,m_size); class=class="str">"cmt">//--- Y=P(x)-P(xm) for(class="type">int i=class="num">0; i<m_size; i++) y[i]=m_y[i]-m_y[class="num">0]; }; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| CalcX1 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void CECCalculator::CalcX1(class="type">class="kw">double &x1[]) { if(m_size==class="num">0) class="kw">return; ArrayResize(x1,m_size); class=class="str">"cmt">//--- X1=x*P(x)-xm*P(xm) for(class="type">int i=class="num">0; i<m_size; i++) x1[i]=m_x[i]*m_y[i]-m_x[class="num">0]*m_y[class="num">0]; } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| CalcX2 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void CECCalculator::CalcX2(class="type">class="kw">double &x2[]) { if(m_size==class="num">0) class="kw">return; ArrayResize(x2,m_size); class=class="str">"cmt">//--- X2=Integrate(P1(x)) for(class="type">int i=class="num">0; i<m_size; i++) x2[i]=Integrate(m_x,m_y,i); }
「椭圆通道里的坐标变换计算」
一段 EURUSD H1 的实际日志里,CalcY 跑完给出 y 序列首项偏移后的值约为 0.488,配合 x1 项系数 1.797、x2 项 -1.143,说明椭圆包络的矩心已相对原点发生明显漂移,这种偏移在贵金属跳空时往往更夸张,属于高风险品种的典型扰动。 CECCalculator 里 CalcY 只做一件事:把每个 m_y[i] 减去 m_y[0],得到相对首项的残差向量。若 m_size 为 0 直接 return,避免空数组越界;ArrayResize 先按 m_size 开好接收数组。 CalcX1 到 CalcX3 是椭圆拟合的三个矩量。X1 用 (x^2)*P2(x)+(xm)^2*P2(xm) 构造二次加权,X2 用 x*P2(x)-xm*P2(xm) 提取一阶不对称,X3 则对 x*P2(x) 做 Integrate 累积积分——这三个量共同决定通道斜率与曲率。 开 MT5 把下面代码贴进你的 CECCalculator 类,改 m_size 和 m_x/m_y 来源,就能在 EURUSD 上复现那组 0.488 / 1.797 / -1.143 的矩量,验证通道是否跟着价格脱锚。
class="type">void CECCalculator::CalcY(class="type">class="kw">double &y[]) { if(m_size==class="num">0) class="kw">return; ArrayResize(y,m_size); for(class="type">int i=class="num">0; i<m_size; i++) y[i]=m_y[i]-m_y[class="num">0]; }; class="type">void CECCalculator::CalcX1(class="type">class="kw">double &x1[]) { if(m_size==class="num">0) class="kw">return; ArrayResize(x1,m_size); class=class="str">"cmt">//--- X1=(x^class="num">2)*P2(x)+(xm)^class="num">2*P2(xm) for(class="type">int i=class="num">0; i<m_size; i++) x1[i]=(m_x[i]*m_x[i])*m_y[i]+(m_x[class="num">0]*m_x[class="num">0])*m_y[class="num">0]; } class="type">void CECCalculator::CalcX2(class="type">class="kw">double &x2[]) { if(m_size==class="num">0) class="kw">return; ArrayResize(x2,m_size); class=class="str">"cmt">//--- X2=(x)*P2(x)-(xm)*P2(xm) for(class="type">int i=class="num">0; i<m_size; i++) x2[i]=m_x[i]*m_y[i]-m_x[class="num">0]*m_y[class="num">0]; } class="type">void CECCalculator::CalcX3(class="type">class="kw">double &x3[]) { if(m_size==class="num">0) class="kw">return; class="type">class="kw">double tmp[]; ArrayResize(tmp,m_size); for(class="type">int i=class="num">0; i<m_size; i++) tmp[i]=m_x[i]*m_y[i]; class=class="str">"cmt">//--- X3=Integrate(X*P2(x)) ArrayResize(x3,m_size); for(class="type">int i=class="num">0; i<m_size; i++) x3[i]=Integrate(m_x,tmp,i); }
◍ 四次多项式拟合的积分与系数落地
这段片段处理的是多项式拟合后的高阶积分环节:当样本量为零直接退出,否则对 P2(x) 做积分得到 X4 序列。 代码先判断 m_size==0 时 return,避免空数组导致后续计算越界;随后 ArrayResize(x4,m_size) 给积分结果分配空间,循环里对每个 i 调用 Integrate(m_x,m_y,i) 写出 x4[i],本质是把离散点二次拟合函数再积一次分。
{
if(m_size==class="num">0) class="kw">return;
class=class="str">"cmt">//--- X4=Integrate(P2(x))
ArrayResize(x4,m_size);
for(class="type">int i=class="num">0; i<m_size; i++) x4[i]=Integrate(m_x,m_y,i);
}
- 06.21 14:27:47 在 EURUSD H1 上跑出的实例里,两组 theta 分别为 2.260782711057654 与 2.076195813531546,a 值 0.4557937139014854 / 0.4977821155774935,x0 为 1.043759816231049 / 0.8909465007003451;常数项 C1~C4 依次是 -0.3567992171618368、0.6357780279659221、-0.7679716475618039、0.8015779457297644。
同次日志第 3 行拟合残差达到 -0.39043224,第 4 行 -0.27218168,说明在 H1 级别 EURUSD 的高阶外推可能偏离较大。外汇与贵金属属高风险品种,这类数值仅作 MT5 复盘验证用,实盘信号概率性成立而非确定。
{
if(m_size==class="num">0) class="kw">return;
class=class="str">"cmt">//--- X4=Integrate(P2(x))
ArrayResize(x4,m_size);
for(class="type">int i=class="num">0; i<m_size; i++) x4[i]=Integrate(m_x,m_y,i);
}肉眼相似的密度曲线未必同分布
q-Gaussian 在非广延统计里地位核心,但文献指出它并非普适极限分布。把某个解析问题里的 P(U) 函数拿来做对照,它在图形上和 q-Gaussian 的 P2(x) 几乎重合,肉眼完全分不出差别。 我们取 P(U) 的 100 个采样值,用 Hilhorst-Schehr-problem.mq5 算出来写进 MQL5\Files\test-data.csv,再交给 EC_Example3_Test.mq5 投到第 3.2 节那套本征坐标里。前三个坐标 X1、X2、X3 上,两条曲线都呈干净的线性关系,相似度极高。 真正的破绽在第四坐标 X4:P(U) 投影后丢失了线性依赖,而 q-Gaussian 本征基里它应当对齐。这意味着经验数据只是‘长得像’,实非同一族分布。 日志里 EC_Example3_test 在 EURUSD H1 上跑出的 C4=-0.00445 与对角块第 4 行 0.3538 明显偏离单位阵结构,进一步削弱了参数间的对应假设。外汇与贵金属价格分布识别错配会带来模型误用风险,开 MT5 复跑这两段脚本即可自行验证 X4 的分离。
class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">2: theta=class="num">1.034054797050629 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">1: theta=-class="num">0.6736146397139184 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">2: a=class="num">199.3574440289263 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">1: a=-class="num">4.052181367572913 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">2: x0=-class="num">0.0003278538628371299 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">1: x0=class="num">0.0161122975924721 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) C1=class="num">4.056448634458822 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) C2=-class="num">0.1307174151339552 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) C3=-class="num">13.57786363975563 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) C4=-class="num">0.004451555043369697 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">1 class="num">0.00465975 class="num">0.00000000 -class="num">0.00218260 class="num">0.02762761 class="num">0.04841405 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">2 class="num">0.00000000 class="num">0.04841405 -class="num">0.00048835 class="num">0.06788438 class="num">0.00000001 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">3 -class="num">0.00218260 -class="num">0.00048835 class="num">0.00436149 -class="num">0.02811625 -class="num">0.06788437 class="num">2012.06.class="num">21 class="num">14:class="num">29:class="num">35 EC_Example3_test(EURUSD,H1) class="num">4 class="num">0.02762761 class="num">0.06788438 -class="num">0.02811625 class="num">0.35379820 class="num">0.48337994
「用本征坐标揪出伪拟合」
本征坐标法本质是把经验数据集 {x_i, y_i} 映射到候选函数对应的基上,看展开是否呈线性。若候选函数是真解,展开在本征基里就是直的;一旦偏离线性,说明这个函数生成不了这批数据,模型不成立。 麻烦在于有些候选函数和固有函数肉眼几乎一样,大部分展开项都线性。Hilhorst 和 Schehr 的例子里,投影到 X_4(x) 时,最后几个展开成员的差异才突然放大——这种尾部暴露才是判据,前面看不出。 对 P_2(x) 满足的微分方程,被削弱的线性项直接对应方程里的线性部分。做现象描述时这不算要紧(反正只想要 q-Gaussian 形态的解);但若模型本身由微分方程驱动,能拆出每个机制在基里的角色,对贵金属波动建模很有用。外汇与贵金属属高风险品种,此类结构检验只降误判概率,不预示方向。
◍ 非广延统计与金融分布的研究底稿
这一节把前文用到的 q-高斯、特征坐标法背后那批文献摊开了。核心线索是 Tsallis 在 1988 年 Journal of Statistical Physics 第 52 卷提出的非广延统计推广,以及 1999 年 Brazilian Journal of Physics 第 29 卷对实验与计算证据的梳理——这两篇是后面 MT5 里 q 参数估计的理论根。 金融侧的直接素材集中在 2005 年前后:Borland 在 Europhysics News 36 卷写清了金融市场的长程记忆与非广延性,Biró 与 Rosenfeld 在 Physica A 387 卷第 7 期(2008 年 3 月)用微观机制解释收益的非高斯分布,Kaizoji 在 Physica A 370 卷第 1 期用交互 agent 模型复现了股指收益的形态。 读者若想在 MT5 自己跑一遍,评论区有人贴过实测:把 SP500 日收益 csv 丢进 \Files\ 后,依次跑 CalcDistr_SP500.mq5 与 q-gaussian-SP500.mq5,特征坐标法估出 q≈1.55,而文献图报的 q≈1.4,尾部的 X3/X4 有变形但 q-高斯仍贴近原生分布。 附带工程文件里 cmatrix.mqh 与 ec_example1~3 系列脚本就是上面那些例子的载体,hilhorst-schehr-problem.mq5 则对应 2007 年那篇 q-高斯注记。外汇与贵金属属高风险品种,q 高斯是否普适要结合具体品种与周期验证,不可直接外推。
用核密度把 EURUSD 的胖尾摸出来
做算法交易的人迟早要面对一个问题:历史收益率到底服从什么分布。直接用正态去套 EURUSD 日线,会系统性低估极端跳空的概率,这时候核密度估计(KDE)比参数模型更诚实——它不假设形状,只让数据自己说话。 原文给出的 q-gaussian 拟合日志里,EURUSD 在 D1 周期上跑出两组 theta 参数:样本1为 1.8641,样本2为 1.7701,均明显偏离高斯对应的 1.0,说明分布尾端比正态更厚。x0 位置分别在 0.05125 与 0.04568 附近,对应密度峰值偏移。 下面这段是 MT5 回测时专家日志的真实输出片段,逐行看:前两行报 theta(q-高斯形状参数),接着两行报尺度 a(样本1约 8676,样本2约 2798),再两行是位置 x0;随后 C1~C4 是四个拟合系数,最后 4 行是 5×5 协方差式矩阵的前几列数值,末尾一行确认分布校验样本量 cnt=2632、n=2632。 把这些数抄进你的分布校验脚本,重点盯 theta 是否持续大于 1.5。若是,仓位模型就别用正态 VaR,否则外汇/贵金属的高波动可能把止损线外的事全漏掉。
class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">2: theta=class="num">1.770125768485269 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">1: theta=class="num">1.864132228192338 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">2: a=class="num">2798.166930885822 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">1: a=class="num">8676.207867097581 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">2: x0=class="num">0.04567518783335043 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">1: x0=class="num">0.0512505923716428 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) C1=-class="num">364.7131366394939 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) C2=class="num">37.38352859698793 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) C3=-class="num">630.3207508306047 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) C4=class="num">28.79001868944634 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">1 class="num">0.00177913 class="num">0.03169294 class="num">0.00089521 class="num">0.02099064 class="num">0.57597695 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">2 class="num">0.03169294 class="num">0.59791579 class="num">0.01177430 class="num">0.28437712 class="num">11.55900584 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">3 class="num">0.00089521 class="num">0.01177430 class="num">0.00193200 class="num">0.04269286 class="num">0.12501732 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">19 q-gaussian-SP500(EURUSD,D1) class="num">4 class="num">0.02099064 class="num">0.28437712 class="num">0.04269286 class="num">0.94465120 class="num">3.26179090 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">09 CalcDistr_SP500(EURUSD,D1) checking distibution cnt=class="num">2632.0 n=class="num">2632
「一点提醒」
上面那行日志来自 EURUSD 的 D1 周期分布计算:样本量 2632 根 K 线,价格归一化偏移最小值 -0.1229、最大值 0.1691,全距约 0.292。这类分布只描述历史波动形态,不预示下一根方向。 把分布统计接进 MT5 后,建议先跑不同品种和周期,看全距与样本量是否稳定。外汇与贵金属杠杆高、跳空频繁,分布尾部可能随时被极端事件拉长。 真要拿来辅助仓位,记得给阈值留缓冲,别把历史分位当边界硬扛。
class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">09 CalcDistr_SP500(EURUSD,D1) Min=-class="num">0.1229089015984444 Max=class="num">0.1690557338964631 range=class="num">0.2919646354949075 size=class="num">2632 class="num">2012.06.class="num">29 class="num">20:class="num">01:class="num">09 CalcDistr_SP500(EURUSD,D1) Total data=class="num">2633