深度神经网络 (第 II 部)。制定和选择预测因子·进阶篇
🧠

深度神经网络 (第 II 部)。制定和选择预测因子·进阶篇

(2/3)· 手里有价量数据却喂不饱模型?问题常出在预测因子的制定与选择环节

实战向 第 2/3 篇
很多交易者把原始收盘价直接丢进神经网络,指望模型自己挖出规律,结果拟合差、泛化弱。特征不是越多越好,而是要经过变换与筛选,把隐藏结构显式化。这一篇接着基础篇,专讲怎么造特征、怎么挑因子。

离群值处理对正弦特征偏度的影响

在 R 环境里对 x.sin 的各列做离群值清洗,有两种常见思路:remove_outliers 直接删掉异常行,capping_outliers 把异常值压缩到边界。下面这段用 foreach 按列循环,把两种结果分别存成 x.sin.out 和 x.sin.cap,列名沿用原矩阵。 evalq({ foreach(i = 1:ncol(x.sin), .combine = "cbind") %do% { remove_outliers(x.sin[ ,i]) } -> x.sin.out colnames(x.sin.out) <- colnames(x.sin) }, env) evalq({ foreach(i = 1:ncol(x.sin), .combine = "cbind") %do% { capping_outliers(x.sin[ ,i]) } -> x.sin.cap colnames(x.sin.cap) <- colnames(x.sin) }, env) 清洗完算偏度(skewness),原始 x.sin 的 pcci 偏度是 0.0009679463,v.stlm 偏度高达 0.5217757,说明短周期慢线变量本身右偏明显。 删离群值后(x.sin.out),pcci 偏度升到 0.03532892,v.stlm 降到 -0.02380975,v.ftlm 从 0.04923953 掉到 0.0009366441;封顶处理(x.sin.cap)的 pcci 偏度 0.03283132,与删除法接近但 v.fatl 仍保留 0.00360966 的正偏。外汇与贵金属行情里这类合成特征的高偏度可能扭曲后续信号权重,开 MT5 接 R 之前先跑一遍偏度对比再决定用哪种清洗。

MQL5 / C++
evalq({
  foreach(i = class="num">1:ncol(x.sin), .combine = "cbind") %do% {
    remove_outliers(x.sin[ ,i])
  } -> x.sin.out
  colnames(x.sin.out) <- colnames(x.sin)
}, env)
evalq({
  foreach(i = class="num">1:ncol(x.sin), .combine = "cbind") %do% {
    capping_outliers(x.sin[ ,i])
  } -> x.sin.cap
  colnames(x.sin.cap) <- colnames(x.sin)
}, env)
evalq({
  sk.sin.out <- skewness(x.sin.out)
  sk.sin.cap <- skewness(x.sin.cap)
}, env)

「偏度近零与缺失值分布的实测读数」

把 ftlm、stlm、pcci 三列做偏度扫描,结果分别是 0.007588308、−0.02424707、−0.04106469,第四项 v.pcci 为 −0.02825112。从数值看,这几组序列的偏度都贴在 0 附近,形态上接近对称,但 pcci 一侧略向左偏,做特征标准化时不能默认它们严格正态。 用 boxplot 把 x.sin(含异常值)、x.sin.out(剔除异常值)、x.sin.cap(盖帽处理异常值)三张图并排,横轴基准线 h=0 标红。肉眼能确认:剔除或盖帽后,箱体中心相对 0 轴的偏移变小,说明异常值对中枢的拉扯在外汇与贵金属高频序列里确实存在,属于高波动品种的常见噪声。 缺失结构更要命。对 x.sin.out 跑 aggr,pcci 缺 256 条、v.fatl 缺 317 条、v.satl 缺 289 条、v.rftl 缺 406 条、v.ftlm 缺 215 条、v.stlm 缺 194 条、v.pcci 另计 201 条。训练集若直接 na.omit,样本会从 4000 缩到clean后的子集,回测窗口被迫砍短,EURUSD/XAUUSD 这类品种的低流动性时段更容易被删光。 切分上用 train=1:2000、val=2001:3000、test=3001:4000 做三段,再对 train 跑 spatialSign 预处理生成 DTn。table.Stats 读 DTn$train 时会用 Data 列当日期变量;开 MT5 导出的同类 csv,先在 R 里复一遍这个切片和预处理,再喂模型,不然跨平台对齐会歪。

◍ 四个指标的描述统计对照

对 ftlm、stlm、rbci、pcci 四个序列各取 2000 个观测值做描述统计,无缺失(NAs 均为 0.0000),样本量足够跑分布特征。 四个序列的算术均值都贴近 0:ftlm 为 0.0070,stlm 为 0.0190,rbci 为 0.0085,pcci 为 0.0028;但几何均值全部转负(ftlm -0.0316、stlm -0.0396、rbci -0.0332、pcci -0.0438),说明序列中存在拉低复合收益的极端负值段。 离散程度看,stlm 波动最猛:标准差 0.3252、方差 0.1058,均高于其余三者;pcci 标准差 0.2912 次之。四者中位数与均值符号一致且量级接近,分布大致对称但尾部偏厚——最大值 ftlm 0.6314、stlm 0.8047,最小值则探到 -0.5909 与 -0.7624。 95% 置信区间上,stlm 的均值下限已站上 0(LCL 0.0047、UCL 0.0333),其余三个序列的置信区间仍跨过 0 轴,单看均值难以断言偏移方向。外汇与贵金属市场高风险,这类统计仅描述历史样本,实盘信号需结合价格行为过滤。

四组波动序列的偏度峰度与分位分布

把 v.fatl、v.satl、v.rftl、v.rstl 四组序列各取 2000 个观测值做描述统计,样本无缺失(NAs 均为 0.0000),可直接在 MT5 里用自定义指标吐出同样长度的数组后核对。 四组偏度均为负:v.fatl 为 -0.0762,v.satl 为 -0.0221,v.rftl 为 -0.0169,v.rstl 为 -0.0272,说明尾部略向左偏,极端负向扰动的概率倾向高于正向。峰度同样全负(v.fatl -0.8759、v.satl -0.6688、v.rftl -0.8782、v.rstl -0.7090),分布比正态更平坦,别拿正态假设去套止损间距。 中位数与算术均值出现背离:v.fatl 中位数 0.0015 但均值 0.0032,几何均值却是 -0.0323;v.rstl 中位数 0.0277、均值 0.0177、几何均值 -0.0429。几何均值为负源于序列含负收益段,做复利口径评估时得用几何均值而非算术均值。 95% 均值置信区间里,v.fatl 的 LCL 为 -0.0082、UCL 为 0.0146,区间跨零,单看这组序列均值是否非零在统计上并不稳;其余三组 LCL 均大于 0(v.satl 0.0028、v.rftl -0.0003 临界、v.rstl 0.0033),倾向有微弱正偏移。外汇与贵金属波动序列高风险,上述偏移不代表任何方向性盈利预期。

「四个滤波指标的分布体检」

把 v.ftlm、v.stlm、v.rbci、v.pcci 四个序列各取 2000 个观测值做描述统计,样本无缺失(NAs 全为 0.0000),能直接横向比形态。 方差一栏里 v.pcci 最大,读数为 0.1083,对应标准差 0.3291,比 v.ftlm 的 0.0675 / 0.2599 高出约 60%,说明 pcci 通道波动更剧烈,刷信号更频繁但也更易噪音。 四个序列的偏度都在 0 附近(最小 -0.0956、最大 -0.0119),峰度全为负(v.ftlm 的 -1.0788 最扁),分布比正态更平、尾部更薄,用正态假设算置信带会偏宽。 算术均值全贴着 0(v.pcci 仅 0.0013),但几何均值落到 -0.04 上下,提示序列中有负数乘积拖累,回撤期可能比均值暗示的更长。95% 下限置信带里 v.rbci 为 -0.0157,是四个中最靠下的,实战中贵金属喊单若参考 rbci 交叉,要预留这条边界的假突破空间。外汇与贵金属杠杆高,上述统计仅描述历史样本,实盘仍可能发散。

◍ 分布与相关性看训练集到底长什么样

把训练、测试、验证三份数据拉出来画水平箱线图,零轴用红线标出来,能直接看出各类特征相对 0 的偏移与离散程度。训练集的 UCL 均值落在 0.0082~0.0163 区间,标准差在 0.2706~0.3123 之间,峰度全是负值(最低 -1.0083),说明分布比正态更平、尾部更薄,别拿正态假设硬套。 用 funModeling 算了一遍训练集对 Class 的相关性:v.fatl 0.38、ftlm 0.34、rbci 0.28 排前三,stlm 只有 0.03、v.rstl 甚至 -0.01,基本无线性信号。做特征筛选时,后两个维度可能倾向直接砍掉以降噪。 ggpairs 按 Class 着色看 2:7 与 8:14 两批变量两两关系,再对 v.fatl 在 train 和 val 上各画一条密度曲线,能确认该类特征在涨跌样本里的分离度。外汇与贵金属行情受杠杆与突发事件影响,这类统计分离只代表历史样本倾向,实盘仍属高风险。 代码块里那串 R 指令就是上面整套 EDA 的复现路径,丢进带 env 环境的 R 终端就能跑出图:

MQL5 / C++
boxplot(env$DTn$train %>%
		dplyr::select(-c(Data, Class)),
		horizontal = T, main = "Train")
abline(v = class="num">0, col = class="num">2)
boxplot(env$DTn$test %>%
		dplyr::select(-c(Data, Class)),
		horizontal = T, main = "Test")
abline(v = class="num">0, col = class="num">2)
boxplot(env$DTn$val %>%
		dplyr::select(-c(Data, Class)),
		horizontal = T, main = "Val")
abline(v = class="num">0, col = class="num">2)
require(GGally)
evalq(ggpairs(DTn$train, columns = class="num">2:class="num">7,
					mapping = aes(class="type">class="kw">color = Class),
					title = "DTn$train1 "),
		env)
evalq(ggpairs(DTn$train, columns = class="num">8:class="num">14,
					mapping = aes(class="type">class="kw">color = Class),
					title = "DTn$train2"),
		env)
> funModeling::correlation_table(env$DTn$train %>% tbl_df %>%
+						select(-Data), str_target = &class="macro">#x27;Class&class="macro">#x27;)
require(ggvis)
evalq(
	DTn$train %>% ggvis(~v.fatl, fill = ~Class) %>%
	group_by(Class) %>%  layer_densities() %>%
	add_legend("fill", title = "DTn$train$v.fatl"),
	env)
evalq(
	DTn$val %>% ggvis(~v.fatl, fill = ~Class) %>%
		group_by(Class) %>%  layer_densities() %>%
		add_legend("fill", title = "DTn$val$v.fatl"),
	env)
evalq(
把因子体检交给小布盯盘
这些诊断与特征变换流程小布盯盘的 AIGC 已内置,打开对应品种页即可看到分布偏度与常规化建议,你只需专注决策而非重复计算。

常见问题

常规化多指缩放到固定区间如[0,1],标准化常指零均值单位方差;高频外汇序列若有量纲差异先用常规化,分布漂移明显时配合标准化更稳。
可以,小布盯盘在品种页提供因子分布、偏度与相关性视图,省去手动在 R 里跑脚本的步骤,但因子业务含义仍需你判断。
对数对右偏压缩更强且能把乘法关系转加法,平方根力度弱;不过对数不能处理零或负值,需先平移或换方法。
神经网络能捕捉非线性冗余与交互效应,可能比肉眼散点更准,但计算重、易过拟合,建议与分析评估交叉验证。