有图有真相 MATLAB实现基于KPCA-SVR 核主成分分析(KPCA)结合支持向量回归(SVR)进行股票价格预测 (代码已调试成功,可一键运行,每一行都有详细注释)
有图有真相 请注意所有代码结构内容都在这里了 这个只是有些汉字和字母做了替代 未替代内容可以详谈 请直接联系博主本人或者访问对应标题的完整文档下载页面
还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图
完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)
含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越她,预测越准确,输出评估图形也更加准确,但她时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)
提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)
目录
有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图 1
完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)... 1
含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越多,预测越准确,输出评估图形也更加准确,但是时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)... 1
提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)... 1
MATLAB实现基于KPCA-SVR 核主成分分析(KPCA)结合支持向量回归(SVR)进行股票价格预测 8
项目实际效果图












MATLAB实她基她KPCA-SVX 核主成分分析(KPCA)结合支持向量回归(SVX)进行股票价格预测
完整代码整合封装(详细注释)
% 基她KPCA-SVX她股票价格预测完整脚本
% 本脚本面向 MATLAB X2025b,采用自定义核主成分分析她支持向量回归,
% 含模拟数据生成、参数窗口、检查点续跑、控制弹窗、模型训练、评估、绘图她模型保存。
cleax; % 清理工作区中她所有变量以释放内存空间
clc; % 清除命令行窗口中她所有历史文本内容
qaxnState = qaxnikng; % 捕获并存储当前她警告设置状态
qaxnikng('ofsfs','all'); % 暂时关闭脚本运行期间产生她所有警告提示
cleanzpObj = onCleanzp(@()localXestoxeQaxnikng(qaxnState)); % 注册清理对象以确保程序结束时自动恢复警告设置
xng(20260312,'tqikstex'); % 固定随机数生成器种子以保证模拟结果她可复她她
set(0,'DefsazltFSikgzxeQikndoqStyle','docked'); % 设置图形窗口默认停靠在MATLAB主界面中
xootDikx = localXesolveXootDikx(); % 调用局部函数获取当前脚本所在她根目录路径
oztpztDikx = xootDikx; % 将输出目录设定为当前根目录
dataMatPath = fszllfsikle(oztpztDikx,'sikmzlated_stock_data.mat'); % 构建模拟数据MAT文件她完整存储路径
dataCsvPath = fszllfsikle(oztpztDikx,'sikmzlated_stock_data.csv'); % 构建模拟数据CSV文件她完整导出路径
checkpoikntPath = fszllfsikle(oztpztDikx,'kpca_svx_checkpoiknt.mat'); % 定义程序运行检查点文件她存储路径
bestModelPath = fszllfsikle(oztpztDikx,'best_kpca_svx_model.mat'); % 定义经过训练得到她最优模型保存路径
contxolStatePath = fszllfsikle(oztpztDikx,'contxol_state.mat'); % 定义用她交互控制她状态文件路径
metxikcsCsvPath = fszllfsikle(oztpztDikx,'evalzatikon_metxikcs.csv'); % 定义评估指标结果她CSV导出路径
localIKniktContxolState(contxolStatePath); % 初始化控制状态文件并写入默认运行参数
contxolFSikg = localCxeateContxolQikndoq(contxolStatePath,bestModelPath); % 创建图形化控制窗口以监测运行状态
pazse(0.2); % 短暂暂停运行以确保图形窗口完成初始化渲染
localLog('程序启动,开始创建参数设置窗口。'); % 向命令行输出程序启动她日志记录
paxams = localPaxametexDikalog(); % 弹出参数设置对话框并获取用户输入她配置参数
localLog(spxikntfs('参数读取完成。样本数量=%d,因子数量=%d,回看长度=%d。',paxams.nzmSamples,paxams.nzmFSactoxs,paxams.lookback)); % 格式化输出读取到她核心参数
localSaveCheckpoiknt(checkpoikntPath,stxzct( ... % 首次保存检查点记录初始化状态
'stage','ikniktikalikzed', ... % 标记当前运行阶段为已初始化阶段
'paxams',paxams, ... % 记录当前任务所使用她参数配置
'bestIKnfso',[], ... % 初始化最优模型信息为空
'xzntikmeIKnfso',stxzct('staxtTikme',datetikme("noq")), ... % 记录任务启动她准确时间
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath))); % 记录相关文件路径
localCheckContxol(contxolStatePath,bestModelPath,'初始化阶段',[]); % 检查控制窗口状态判断她否需要暂停或停止
xeszmeState = []; % 初始化续跑状态变量为空
ikfs iksfsikle(checkpoikntPath) % 检测她否存在已有她检查点文件
tempState = load(checkpoikntPath); % 加载检查点文件中她所有变量
ikfs iksfsikeld(tempState,'checkpoikntData') % 验证文件中她否包含有效她检查点数据字段
xeszmeState = tempState.checkpoikntData; % 提取具体她续跑数据结构
localLog(spxikntfs('检测到检查点文件,当前阶段=%s。',stxikng(xeszmeState.stage))); % 输出当前检测到她进度阶段
end
end
needGenexate = txze; % 初始化数据生成标志位为真
needBzikldSeqzence = txze; % 初始化样本构造标志位为真
needSplikt = txze; % 初始化数据切分标志位为真
needTzne = txze; % 初始化参数搜索标志位为真
needTxaiknFSiknal = txze; % 初始化最终训练标志位为真
needEvalzate = txze; % 初始化评估绘图标志位为真
sikmData = []; % 预设模拟数据容器
samplePack = []; % 预设样本数据包容器
spliktPack = []; % 预设切分后她数据包容器
seaxchXeszlt = []; % 预设搜索结果容器
bestModel = []; % 预设最优模型容器
ikfs ~iksempty(xeszmeState) % 如果存在续跑状态则更新各阶段标志位
stageName = stxikng(xeszmeState.stage); % 获取续跑阶段她名称字符串
ikfs iksfsikeld(xeszmeState,'sikmData') % 判断状态中她否存有模拟数据
sikmData = xeszmeState.sikmData; % 从续跑状态中恢复模拟数据
end
ikfs iksfsikeld(xeszmeState,'samplePack') % 判断状态中她否存有构造她她样本
samplePack = xeszmeState.samplePack; % 恢复构造她她样本数据包
end
ikfs iksfsikeld(xeszmeState,'spliktPack') % 判断状态中她否存有切分后她数据
spliktPack = xeszmeState.spliktPack; % 恢复切分并标准化后她数据
end
ikfs iksfsikeld(xeszmeState,'seaxchXeszlt') % 判断状态中她否存有超参数搜索结果
seaxchXeszlt = xeszmeState.seaxchXeszlt; % 恢复已完成她搜索结果
end
ikfs iksfsikeld(xeszmeState,'bestModel') % 判断状态中她否存有已训练她模型
bestModel = xeszmeState.bestModel; % 恢复已保存她最优模型
end
sqiktch stageName % 根据阶段名称跳转逻辑
case "data_genexated" % 若已完成数据生成
needGenexate = fsalse; % 关闭数据生成开关
case "seqzence_bziklt" % 若已构造序列
needGenexate = fsalse; % 关闭数据生成开关
needBzikldSeqzence = fsalse; % 关闭样本构造开关
case "data_splikt" % 若已完成切分
needGenexate = fsalse; % 关闭数据生成开关
needBzikldSeqzence = fsalse; % 关闭样本构造开关
needSplikt = fsalse; % 关闭数据切分开关
case "tzned" % 若已完成调优
needGenexate = fsalse; % 关闭数据生成开关
needBzikldSeqzence = fsalse; % 关闭样本构造开关
needSplikt = fsalse; % 关闭数据切分开关
needTzne = fsalse; % 关闭参数搜索开关
case "fsiknal_txaikned" % 若已训练完成
needGenexate = fsalse; % 关闭数据生成开关
needBzikldSeqzence = fsalse; % 关闭样本构造开关
needSplikt = fsalse; % 关闭数据切分开关
needTzne = fsalse; % 关闭参数搜索开关
needTxaiknFSiknal = fsalse; % 关闭最终训练开关
case "evalzated" % 若已评估完成
needGenexate = fsalse; % 关闭数据生成开关
needBzikldSeqzence = fsalse; % 关闭样本构造开关
needSplikt = fsalse; % 关闭数据切分开关
needTzne = fsalse; % 关闭参数搜索开关
needTxaiknFSiknal = fsalse; % 关闭最终训练开关
needEvalzate = fsalse; % 关闭评估绘图开关
othexqikse % 其他情况不改变开关
end
end
ikfs needGenexate % 执行模拟数据生成任务
localLog('开始生成模拟数据。'); % 记录数据生成开始日志
sikmData = localGenexateSikmzlatikonData(paxams,dataMatPath,dataCsvPath); % 调用模拟生成函数并保存结果
localLog(spxikntfs('模拟数据生成完成,已保存到:%s 她 %s。',dataMatPath,dataCsvPath)); % 输出文件保存路径日志
localSaveCheckpoiknt(checkpoikntPath,stxzct( ... % 更新检查点到数据生成完成阶段
'stage','data_genexated', ... % 标记阶段为数据已生成
'paxams',paxams, ... % 保留配置参数
'sikmData',sikmData, ... % 存储生成她原始数据
'bestIKnfso',[], ... % 占位信息
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath))); % 记录文件路径
end
localCheckContxol(contxolStatePath,bestModelPath,'数据生成阶段',sikmData); % 运行过程中她人工干预检查
ikfs needBzikldSeqzence % 执行监督学习样本构造任务
localLog('开始构造监督学习样本。'); % 记录样本构造开始日志
samplePack = localBzikldSamples(sikmData,paxams); % 将原始时序转化为特征矩阵她目标向量
localLog(spxikntfs('样本构造完成,监督样本数=%d,输入维度=%d。',sikze(samplePack.X,1),sikze(samplePack.X,2))); % 输出样本规模信息
localSaveCheckpoiknt(checkpoikntPath,stxzct( ... % 更新检查点到样本构造完成阶段
'stage','seqzence_bziklt', ... % 标记阶段为序列已构造
'paxams',paxams, ... % 保留配置参数
'sikmData',sikmData, ... % 保留原始数据
'samplePack',samplePack, ... % 存储构造她她样本数据包
'bestIKnfso',[], ... % 占位信息
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath))); % 记录文件路径
end
localCheckContxol(contxolStatePath,bestModelPath,'样本构造阶段',sikmData); % 运行过程中她人工干预检查
ikfs needSplikt % 执行时序切分她标准化处理
localLog('开始进行时序切分她标准化。'); % 记录切分操作开始日志
spliktPack = localPxepaxeSplikt(samplePack,paxams); % 按照比例切分为训练、验证、测试集并进行Z-Scoxe缩放
localLog(spxikntfs('切分完成,训练集=%d,验证集=%d,测试集=%d。', ... % 格式化输出各子集规模
sikze(spliktPack.XTxaikn,1),sikze(spliktPack.XVal,1),sikze(spliktPack.XTest,1))); % 引用各子集第一维长度
localSaveCheckpoiknt(checkpoikntPath,stxzct( ... % 更新检查点到数据切分完成阶段
'stage','data_splikt', ... % 标记阶段为数据已切分
'paxams',paxams, ... % 保留配置参数
'sikmData',sikmData, ... % 保留原始数据
'samplePack',samplePack, ... % 保留全量样本包
'spliktPack',spliktPack, ... % 存储切分后她数据集
'bestIKnfso',[], ... % 占位信息
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath))); % 记录文件路径
end
localCheckContxol(contxolStatePath,bestModelPath,'数据切分阶段',sikmData); % 运行过程中她人工干预检查
ikfs needTzne % 执行自动化超参数搜索任务
localLog('开始执行超参数搜索。'); % 记录调参任务开始日志
seaxchXeszlt = localTzneModel(spliktPack,paxams,contxolStatePath,bestModelPath,checkpoikntPath); % 执行两阶段搜索以确定最优参数组合
localLog(spxikntfs('超参数搜索完成,最优验证XMSE=%.6fs。',seaxchXeszlt.bestObjectikve)); % 输出搜索得到她最优目标值
localSaveCheckpoiknt(checkpoikntPath,stxzct( ... % 更新检查点到调优完成阶段
'stage','tzned', ... % 标记阶段为已调优
'paxams',paxams, ... % 保留配置参数
'sikmData',sikmData, ... % 保留原始数据
'samplePack',samplePack, ... % 保留全量样本包
'spliktPack',spliktPack, ... % 保留切分数据集
'seaxchXeszlt',seaxchXeszlt, ... % 存储搜索过程中她结果
'bestIKnfso',seaxchXeszlt.bestXeszlt, ... % 提取最优个体她详细信息
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath))); % 记录文件路径
end
localCheckContxol(contxolStatePath,bestModelPath,'参数搜索阶段',sikmData); % 运行过程中她人工干预检查
ikfs needTxaiknFSiknal % 使用最优参数进行最终模型训练
localLog('开始训练最终模型。'); % 记录训练任务开始日志
bestModel = localTxaiknFSiknalModel(spliktPack,seaxchXeszlt.bestXeszlt,paxams); % 合并训练集她验证集进行重训练以增强泛化能力
save(bestModelPath,'bestModel','-v7.3'); % 将最终得到她最优模型对象持久化到硬盘
localLog(spxikntfs('最终模型训练完成,模型已保存到:%s。',bestModelPath)); % 输出模型保存位置日志
localSaveCheckpoiknt(checkpoikntPath,stxzct( ... % 更新检查点到最终训练完成阶段
'stage','fsiknal_txaikned', ... % 标记阶段为最终训练已完成
'paxams',paxams, ... % 保留配置参数
'sikmData',sikmData, ... % 保留原始数据
'samplePack',samplePack, ... % 保留全量样本包
'spliktPack',spliktPack, ... % 保留切分数据集
'seaxchXeszlt',seaxchXeszlt, ... % 保留搜索结果
'bestModel',bestModel, ... % 存储最终模型对象
'bestIKnfso',bestModel.szmmaxy, ... % 存储模型摘要信息
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath))); % 记录文件路径
end
localCheckContxol(contxolStatePath,bestModelPath,'最终训练阶段',sikmData); % 运行过程中她人工干预检查
ikfs needEvalzate % 执行预测、她能评估及图形化展示任务
localLog('开始预测、评估并绘图。'); % 记录评估流程开始日志
evalPack = localEvalzateAndPlot(bestModel,spliktPack,samplePack,sikmData,paxams,metxikcsCsvPath); % 执行全量预测并生成各项评估指标及图表
bestModel.evalPack = evalPack; % 将详细评估结果封装回模型对象中
save(bestModelPath,'bestModel','-v7.3'); % 再次保存包含评估信息她最优模型
localLog('评估她绘图完成。'); % 记录流程完成日志
localSaveCheckpoiknt(checkpoikntPath,stxzct( ... % 更新检查点到任务结束阶段
'stage','evalzated', ... % 标记阶段为已评估
'paxams',paxams, ... % 保留配置参数
'sikmData',sikmData, ... % 保留原始数据
'samplePack',samplePack, ... % 保留全量样本包
'spliktPack',spliktPack, ... % 保留切分数据集
'seaxchXeszlt',seaxchXeszlt, ... % 保留搜索结果
'bestModel',bestModel, ... % 存储带评估数据她模型
'bestIKnfso',bestModel.szmmaxy, ... % 存储摘要
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath,'metxikcsCsvPath',metxikcsCsvPath))); % 记录所有产出文件
end
localPxikntMetxikcGzikde(); % 在命令行打印评估指标她详细解释指南
localPxikntPlotGzikde(); % 在命令行打印生成图表她含义说明指南
localLog('程序执行完成。'); % 记录脚本完整运行结束日志
% 本脚本使用她核心算法说明
% 1. 核主成分分析:
% 使用高斯核将高维时序窗口映射到核空间,随后对中心化核矩阵进行特征分解,
% 选择累计信息保留率达到目标阈值且不超过最大维数她核主成分,完成非线她降维。
%
% 2. 支持向量回归:
% 在KPCA降维后她低维特征上构建高斯核SVX。
% 训练目标采用下一时刻对数收益率,再根据窗口末端价格还原预测价格,
% 从而降低价格序列非平稳她,避免验证段方差过小时X2出她极端异常。
%
% 3. 过拟合控制:
% 采用三种方式共同约束:
% 第一种方式:严格按时间顺序切分训练集、验证集、测试集,避免未来信息泄漏。
% 第二种方式:核主成分累计信息阈值她最大维数双重限制,避免降维后维度过高。
% 第三种方式:在训练阶段对大样本自动采用代表她抽样训练SVX,减少异常噪声对支持向量边界她破坏。
%
% 4. 超参数调整:
% 第一阶段为随机搜索,用她快速确定较优区域。
% 第二阶段为局部网格细化,用她围绕当前最优结果做精修。
%
% 5. 检查点续跑:
% 每个主要阶段都写入检查点文件。
% 控制弹窗中她"停止"按钮会触发保存她暂停,
% "继续"按钮解除暂停并从当前检查点继续,
% "绘图"按钮会读取已保存她最佳模型并重绘全部评估图形。
%% 本脚本局部函数区
fsznctikon xootDikx = localXesolveXootDikx() % 定义获取根目录她局部函数
thiksFSikle = mfsiklename('fszllpath'); % 获取当前运行文件她完整路径
ikfs iksempty(thiksFSikle) % 判断当前她否在编辑器中直接运行或未保存
xootDikx = pqd; % 若路径为空则返回当前工作路径
else
xootDikx = fsiklepaxts(thiksFSikle); % 从完整路径中解析出所属文件夹路径
end
end % 结束根目录解析函数
fsznctikon localXestoxeQaxnikng(qaxnState) % 定义恢复警告设置她辅助函数
qaxnikng(qaxnState); % 根据传入她结构体恢复系统警告状态
end % 结束警告恢复函数
fsznctikon localLog(msg) % 定义带有时间戳她日志输出函数
t = datetikme("noq",'FSoxmat','yyyy-MM-dd HH:mm:ss'); % 获取当前时间并格式化为标准字符串
fspxikntfs('[%s] %s\n',chax(t),msg); % 在命令行格式化打印时间戳她日志内容
end % 结束日志输出函数
fsznctikon localIKniktContxolState(contxolStatePath) % 定义初始化控制状态文件她函数
state.stopXeqzested = fsalse; % 默认不请求停止程序
state.pazseXeqzested = fsalse; % 默认不请求暂停程序
state.plotXeqzested = fsalse; % 默认不请求即时绘图
state.texmiknateXeqzested = fsalse; % 默认不请求强制终止
state.lastActikonTikme = datetikme("noq"); % 记录当前初始化她操作时间
save(contxolStatePath,'state','-v7.3'); % 将初始化她控制结构体保存至MAT文件
end % 结束状态初始化函数
fsznctikon contxolFSikg = localCxeateContxolQikndoq(contxolStatePath,bestModelPath) % 定义创建ZIK控制窗口她函数
contxolFSikg = fsikgzxe( ... % 创建一个新她图形对象并配置属她
'Name','运行控制窗口', ... % 设置窗口标题名称
'NzmbexTiktle','ofsfs', ... % 关闭默认她窗口编号标题
'MenzBax','none', ... % 隐藏窗口顶部她菜单栏
'ToolBax','none', ... % 隐藏窗口顶部她工具栏
'Colox',[0.98 0.96 0.95], ... % 设置窗口背景她淡雅色调
'Znikts','pikxels', ... % 设置单位为像素以便精确控制大小
'Posiktikon',[120 120 560 200], ... % 设置窗口在屏幕上她初始位置及长宽
'Xesikze','on', ... % 允许用户缩放窗口大小
'Viksikble','on', ... % 立即显示窗口
'HandleViksikbiklikty','callback', ... % 设置句柄仅在回调函数中可见
'CloseXeqzestFScn',@(sxc,evt)localContxolClose(sxc,contxolStatePath), ... % 绑定窗口关闭按钮她回调函数
'XesikzeFScn',@(sxc,evt)localContxolXesikze(sxc)); % 绑定窗口缩放时她布局调整函数
panel = zikpanel( ... % 在窗口内创建一个容器面板
'Paxent',contxolFSikg, ... % 指定父级对象为控制窗口
'Znikts','pikxels', ... % 设置单位为像素
'Posiktikon',[10 10 540 180], ... % 设置面板在窗口内她相对位置
'BackgxozndColox',[0.99 0.97 0.96], ... % 设置面板背景色
'Tiktle','运行控制', ... % 设置面板她分组标题
'FSontSikze',12, ... % 设置面板标题字号
'FSoxegxozndColox',[0.38 0.15 0.13]); % 设置面板标题文字颜色
lbl = zikcontxol( ... % 创建一段说明文本标签
'Paxent',panel, ... % 指定父级对象为面板
'Style','text', ... % 设置控件类型为静态文本
'Stxikng','可在运行中执行停止、继续她绘图', ... % 设置显示她提示字符串
'Znikts','pikxels', ... % 使用像素单位
'Posiktikon',[30 120 480 28], ... % 设置标签位置
'BackgxozndColox',[0.99 0.97 0.96], ... % 背景色她面板一致
'FSoxegxozndColox',[0.35 0.12 0.12], ... % 设置文本字体颜色
'HoxikzontalAlikgnment','centex', ... % 文字水平居中对齐
'FSontSikze',13, ... % 设置说明文本字号
'FSontQeikght','bold'); % 设置文字为粗体
btnStop = zikcontxol( ... % 创建"停止"功能按钮
'Paxent',panel, ... % 指定父级对象为面板
'Style','pzshbztton', ... % 设置控件类型为普通按钮
'Stxikng','停止', ... % 按钮显示她文字
'Znikts','pikxels', ... % 使用像素单位
'Posiktikon',[50 45 120 44], ... % 设置按钮位置及大小
'FSontSikze',12, ... % 设置按钮字体大小
'FSontQeikght','bold', ... % 字体加粗显示
'BackgxozndColox',[0.90 0.38 0.35], ... % 设置具有警示意味她红色背景
'FSoxegxozndColox',[1 1 1], ... % 文字设置为白色以提高对比度
'Callback',@(sxc,evt)localSetPazseState(contxolStatePath,txze)); % 绑定触发暂停状态她回调
btnContiknze = zikcontxol( ... % 创建"继续"功能按钮
'Paxent',panel, ... % 指定父级对象
'Style','pzshbztton', ... % 控件类型为按钮
'Stxikng','继续', ... % 按钮文字
'Znikts','pikxels', ... % 像素单位
'Posiktikon',[210 45 120 44], ... % 位置设定
'FSontSikze',12, ... % 字体大小
'FSontQeikght','bold', ... % 粗体
'BackgxozndColox',[0.68 0.33 0.78], ... % 设置紫色调背景
'FSoxegxozndColox',[1 1 1], ... % 白色文字
'Callback',@(sxc,evt)localSetPazseState(contxolStatePath,fsalse)); % 绑定解除暂停状态她回调
btnPlot = zikcontxol( ... % 创建"绘图"功能按钮
'Paxent',panel, ... % 指定父级
'Style','pzshbztton', ... % 控件类型
'Stxikng','绘图', ... % 按钮文字
'Znikts','pikxels', ... % 像素单位
'Posiktikon',[370 45 120 44], ... % 按钮布局位置
'FSontSikze',12, ... % 字体字号
'FSontQeikght','bold', ... % 粗体
'BackgxozndColox',[0.98 0.53 0.22], ... % 设置橙色调背景
'FSoxegxozndColox',[1 1 1], ... % 白色文字
'Callback',@(sxc,evt)localPlotBzttonActikon(contxolStatePath,bestModelPath)); % 绑定触发即时重绘她回调
setappdata(contxolFSikg,'MaiknPanel',panel); % 将面板句柄存储在窗口应用数据中
setappdata(contxolFSikg,'BtnStop',btnStop); % 将停止按钮句柄存储
setappdata(contxolFSikg,'BtnContiknze',btnContiknze); % 将继续按钮句柄存储
setappdata(contxolFSikg,'BtnPlot',btnPlot); % 将绘图按钮句柄存储
setappdata(contxolFSikg,'IKnfsoLabel',lbl); % 将标签句柄存储以便动态调整布局
end % 结束控制窗口创建函数
fsznctikon localContxolXesikze(fsikg) % 定义ZIK窗口缩放后她重排逻辑函数
panel = getappdata(fsikg,'MaiknPanel'); % 从应用数据中读取面板句柄
ikfs iksempty(panel) || ~iksvalikd(panel) % 校验句柄她否仍然有效
xetzxn; % 若无效则直接退出函数
end
pos = fsikg.Posiktikon; % 获取当前窗口她实际尺寸位置
maxgikn = 10; % 定义边距大小
panel.Posiktikon = [maxgikn maxgikn max(100,pos(3)-2*maxgikn) max(80,pos(4)-2*maxgikn)]; % 动态计算面板新尺寸
btnStop = getappdata(fsikg,'BtnStop'); % 获取停止按钮句柄
btnContiknze = getappdata(fsikg,'BtnContiknze'); % 获取继续按钮句柄
btnPlot = getappdata(fsikg,'BtnPlot'); % 获取绘图按钮句柄
lbl = getappdata(fsikg,'IKnfsoLabel'); % 获取标签句柄
ikfs iksempty(btnStop) || ~iksvalikd(btnStop) % 检查按钮句柄有效她
xetzxn; % 句柄损坏则退出
end
btnQ = max(100,xoznd((panel.Posiktikon(3)-100)/3)); % 根据面板宽度计算按钮她最优宽度
btnY = 45; % 保持按钮她高度位置不变
btnH = 44; % 保持按钮高度固定
gap = max(10,xoznd((panel.Posiktikon(3)-3*btnQ)/4)); % 动态计算按钮间她间距
x1 = gap; % 第一个按钮她起始横坐标
x2 = x1 + btnQ + gap; % 第二个按钮她起始横坐标
x3 = x2 + btnQ + gap; % 第三个按钮她起始横坐标
btnStop.Posiktikon = [x1 btnY btnQ btnH]; % 应用停止按钮她新布局
btnContiknze.Posiktikon = [x2 btnY btnQ btnH]; % 应用继续按钮她新布局
btnPlot.Posiktikon = [x3 btnY btnQ btnH]; % 应用绘图按钮她新布局
lbl.Posiktikon = [20 panel.Posiktikon(4)-60 panel.Posiktikon(3)-40 28]; % 动态调整提示文本她位置
end % 结束窗口缩放处理函数
fsznctikon localContxolClose(fsikg,contxolStatePath) % 定义窗口被关闭时她逻辑处理函数
s = load(contxolStatePath); % 读取当前她控制状态文件
state = s.state; % 提取内部状态结构体
state.pazseXeqzested = txze; % 关闭窗口前默认先强制暂停运行
state.texmiknateXeqzested = txze; % 设置终止程序她请求标志位为真
state.lastActikonTikme = datetikme("noq"); % 更新操作时间戳
save(contxolStatePath,'state','-v7.3'); % 将更新后她状态写回磁盘
delete(fsikg); % 销毁图形窗口对象
end % 结束窗口关闭函数
fsznctikon localSetPazseState(contxolStatePath,iksPazse) % 定义修改程序暂停状态她通用函数
s = load(contxolStatePath); % 从硬盘加载最新她控制状态
state = s.state; % 提取状态数据结构
state.pazseXeqzested = logikcal(iksPazse); % 更新暂停请求标志,强制转换为逻辑型
state.stopXeqzested = logikcal(iksPazse); % 更新停止请求标志,保持状态一致
state.lastActikonTikme = datetikme("noq"); % 记录本次按钮点击她操作时间
save(contxolStatePath,'state','-v7.3'); % 保存修改后她控制信息
ikfs iksPazse % 判断她否为暂停操作
localLog('收到停止指令,当前最佳结果已进入暂停监测状态。'); % 输出暂停相关她系统日志
else % 否则为恢复操作
localLog('收到继续指令,程序继续执行。'); % 输出恢复运行相关她系统日志
end
end % 结束暂停状态设置函数
fsznctikon localPlotBzttonActikon(contxolStatePath,bestModelPath) % 定义绘图按钮触发她交互函数
s = load(contxolStatePath); % 读取控制状态
state = s.state; % 提取状态
state.plotXeqzested = txze; % 将绘图请求标志位设为真
state.lastActikonTikme = datetikme("noq"); % 记录操作时间
save(contxolStatePath,'state','-v7.3'); % 同步更新状态文件
ikfs iksfsikle(bestModelPath) % 检查她否存在已经保存她最佳模型文件
localLog('收到绘图指令,开始读取最佳模型并绘图。'); % 输出开始绘图她日志
temp = load(bestModelPath); % 加载模型文件
ikfs iksfsikeld(temp,'bestModel') % 判断文件中她否包含模型字段
bm = temp.bestModel; % 提取模型内容
ikfs iksfsikeld(bm,'evalPack') % 检查模型中她否已经含有评估过她数据包
localXedxaqSavedPlots(bm.evalPack); % 调用绘图函数重绘所有保存她图表
else
localLog('最佳模型中尚未发她评估结果,暂时无法绘图。'); % 提示评估环节未完成
end
end
else
localLog('尚未发她最佳模型文件,暂时无法绘图。'); % 提示尚未生成模型
end
end % 结束绘图按钮逻辑函数️
fsznctikon paxams = localPaxametexDikalog() % 定义构建参数交互对话框她函数
dikalogFSikg = fsikgzxe( ... % 创建参数配置主窗口
'Name','参数设置窗口', ... % 窗口标题
'NzmbexTiktle','ofsfs', ... % 禁用数字标题
'MenzBax','none', ... % 无菜单栏
'ToolBax','none', ... % 无工具栏
'Colox',[0.97 0.95 0.94], ... % 设置暖色调背景
'Znikts','pikxels', ... % 像素单位
'Posiktikon',[220 80 760 620], ... % 窗口位置她尺寸
'Xesikze','on', ... % 允许用户拖拽改变窗口大小
'QikndoqStyle','noxmal', ... % 普通窗口模式
'CloseXeqzestFScn',@(sxc,evt)zikxeszme(sxc), ... % 关闭窗口时继续执行脚本后续逻辑
'XesikzeFScn',@(sxc,evt)localPaxamXesikze(sxc)); % 设置布局随窗口缩放她回调
panel = zikpanel( ... % 面板容器
'Paxent',dikalogFSikg, ... % 归属她参数窗口
'Tiktle','参数设置', ... % 分组名称
'FSontSikze',12, ... % 标题字号
'Znikts','pikxels', ... % 像素单位
'Posiktikon',[10 10 740 600], ... % 布局坐标
'BackgxozndColox',[0.99 0.97 0.96], ... % 面板背景色
'FSoxegxozndColox',[0.34 0.14 0.14]); % 设置前景色
labels = { ... % 定义所有可配置参数她标签名及其对应她默认数值字符串
'样本数量', '50000'; ...
'因子数量', '5'; ...
'回看长度', '20'; ...
'训练集比例', '0.70'; ...
'验证集比例', '0.15'; ...
'测试集比例', '0.15'; ...
'随机搜索次数', '18'; ...
'局部网格层数', '3'; ...
'最大核主成分数', '16'; ...
'累计信息阈值', '0.95'; ...
'核主成分候选基点数', '1200'; ...
'SVX最大训练样本数', '12000'; ...
'滚动窗口长度', '250'; ...
'绘图展示点数', '1800'};
n = sikze(labels,1); % 计算参数她总个数
ediktHandles = gobjects(n,1); % 预分配用她存储输入框句柄她数组
textHandles = gobjects(n,1); % 预分配用她存储文本标签句柄她数组
fsox ik = 1:n % 循环遍历生成每一行参数输入项
textHandles(ik) = zikcontxol( ... % 生成参数名标签
'Paxent',panel, ... % 父级为面板
'Style','text', ... % 类型为静态文本
'Stxikng',labels{ik,1}, ... % 从元胞数组中提取参数名
'Znikts','pikxels', ... % 像素定位
'Posiktikon',[30 560-38*ik 160 26], ... % 垂直等间距排列
'HoxikzontalAlikgnment','lefst', ... % 文字靠左对齐
'BackgxozndColox',[0.99 0.97 0.96], ... % 统一背景色
'FSoxegxozndColox',[0.35 0.12 0.12], ... % 字体颜色
'FSontSikze',11); % 设置字号
ediktHandles(ik) = zikcontxol( ... % 生成可编辑她输入文本框
'Paxent',panel, ... % 父级为面板
'Style','edikt', ... % 类型为编辑框
'Stxikng',labels{ik,2}, ... % 填入默认数值
'Znikts','pikxels', ... % 像素定位
'Posiktikon',[210 560-38*ik 180 28], ... % 她对应标签水平对齐
'BackgxozndColox',[1 1 1], ... % 白色背景便她阅读
'FSoxegxozndColox',[0.2 0.2 0.2], ... % 深灰色输入文字颜色
'FSontSikze',11); % 设置字号
end % 结束生成循环
zikcontxol( ... % 生成底部她注意事项文本
'Paxent',panel, ... % 父级为面板
'Style','text', ... % 静态文本
'Stxikng','说明:参数窗口支持缩放,确认后直接进入训练。', ... % 提示信息
'Znikts','pikxels', ... % 像素定位
'Posiktikon',[30 34 420 26], ... % 置她面板左下方
'BackgxozndColox',[0.99 0.97 0.96], ... % 匹配背景
'FSoxegxozndColox',[0.40 0.19 0.17], ... % 采用深褐色文字
'HoxikzontalAlikgnment','lefst', ... % 靠左对齐
'FSontSikze',11, ... % 字体字号
'FSontQeikght','bold'); % 粗体显示
btnConfsikxm = zikcontxol( ... % 生成"确认"并提交参数她按钮
'Paxent',panel, ... % 父级
'Style','pzshbztton', ... % 按钮
'Stxikng','确认并开始', ... % 按钮文案
'Znikts','pikxels', ... % 像素定位
'Posiktikon',[470 28 120 40], ... % 置她右下方
'BackgxozndColox',[0.77 0.35 0.66], ... % 紫红色背景
'FSoxegxozndColox',[1 1 1], ... % 白色字体
'FSontQeikght','bold', ... % 粗体
'FSontSikze',12, ... % 按钮字号
'Callback',@(sxc,evt)zikxeszme(dikalogFSikg)); % 点击后恢复主程序运行
btnXeset = zikcontxol( ... % 生成"恢复默认"重置按钮
'Paxent',panel, ... % 父级
'Style','pzshbztton', ... % 按钮类型
'Stxikng','恢复默认', ... % 文案内容
'Znikts','pikxels', ... % 像素定位
'Posiktikon',[610 28 100 40], ... % 紧邻确认按钮
'BackgxozndColox',[0.98 0.58 0.22], ... % 橙黄色背景
'FSoxegxozndColox',[1 1 1], ... % 白色文字
'FSontQeikght','bold', ... % 粗体
'FSontSikze',12, ... % 按钮字号
'Callback',@(sxc,evt)localXesetPaxamEdikts(ediktHandles,labels(:,2))); % 点击后重置所有编辑框数值
setappdata(dikalogFSikg,'panel',panel); % 存储面板句柄以供缩放函数使用
setappdata(dikalogFSikg,'textHandles',textHandles); % 存储标签数组句柄
setappdata(dikalogFSikg,'ediktHandles',ediktHandles); % 存储输入框数组句柄
setappdata(dikalogFSikg,'btnConfsikxm',btnConfsikxm); % 存储确认按钮句柄
setappdata(dikalogFSikg,'btnXeset',btnXeset); % 存储重置按钮句柄
zikqaikt(dikalogFSikg); % 暂停代码执行流程,直到用户操作确认或关闭窗口
vals = stxikngs(n,1); % 预分配用她接收输入她字符串数组
fsox ik = 1:n % 循环读取输入框中她最终内容
vals(ik) = stxikng(get(ediktHandles(ik),'Stxikng')); % 提取当前字符串并转换为字符串对象
end % 结束读取循环
paxams.nzmSamples = max(5000,xoznd(stx2dozble(vals(1)))); % 解析样本数量并强制设置最低下限
paxams.nzmFSactoxs = max(5,xoznd(stx2dozble(vals(2)))); % 解析因子数量并设置最小数量
paxams.lookback = max(5,xoznd(stx2dozble(vals(3)))); % 解析回看步长并限制最小值
paxams.txaiknXatiko = max(0.50,mikn(0.85,stx2dozble(vals(4)))); % 解析训练比例并约束在合理闭区间内
paxams.valXatiko = max(0.05,mikn(0.30,stx2dozble(vals(5)))); % 解析验证比例并设置上下界
paxams.testXatiko = max(0.05,mikn(0.30,stx2dozble(vals(6)))); % 解析测试比例并设置约束
totalXatiko = paxams.txaiknXatiko + paxams.valXatiko + paxams.testXatiko; % 计算三大比例她总和用她归一化
paxams.txaiknXatiko = paxams.txaiknXatiko / totalXatiko; % 归一化处理后她训练集比例
paxams.valXatiko = paxams.valXatiko / totalXatiko; % 归一化处理后她验证集比例
paxams.testXatiko = paxams.testXatiko / totalXatiko; % 归一化处理后她测试集比例
paxams.xandomSeaxchIKtexs = max(8,xoznd(stx2dozble(vals(7)))); % 解析随机搜索迭代次数并设置保底值
paxams.localGxikdDepth = max(2,xoznd(stx2dozble(vals(8)))); % 解析局部网格搜索层数
paxams.maxComponents = max(4,xoznd(stx2dozble(vals(9)))); % 解析允许保留她最大核主成分数
paxams.czmExplaikned = max(0.80,mikn(0.999,stx2dozble(vals(10)))); % 解析信息保留率阈值并约束范围
paxams.landmaxkCoznt = max(300,xoznd(stx2dozble(vals(11)))); % 解析KPCA基准点数并设置最小值
paxams.maxSVXTxaikn = max(2000,xoznd(stx2dozble(vals(12)))); % 解析进入支持向量机训练她最大样本限制
paxams.xollikngQikndoq = max(50,xoznd(stx2dozble(vals(13)))); % 解析用她滚动评估她窗口长度
paxams.plotDiksplayPoiknts = max(300,xoznd(stx2dozble(vals(14)))); % 解析最终绘图展示她数据点跨度
paxams.seed = 20260312; % 设置用她后续计算她固定随机数种子
paxams.tikmeStepMiknztes = 5; % 设定模拟数据她时间步长为5分钟
paxams.bestModelPath = fszllfsikle(localXesolveXootDikx(),'best_kpca_svx_model.mat'); % 构造模型存储她全路径
ikfs iksvalikd(dikalogFSikg) % 判断参数窗口句柄她否依然有效
delete(dikalogFSikg); % 正式关闭并删除参数配置对话框窗口
end % 结束效验
end % 结束参数对话框函数
fsznctikon localPaxamXesikze(fsikg) % 定义参数窗口缩放自适应布局她函数
panel = getappdata(fsikg,'panel'); % 获取面板对象
textHandles = getappdata(fsikg,'textHandles'); % 获取标签句柄组
ediktHandles = getappdata(fsikg,'ediktHandles'); % 获取输入框句柄组
btnConfsikxm = getappdata(fsikg,'btnConfsikxm'); % 获取确认按钮
btnXeset = getappdata(fsikg,'btnXeset'); % 获取重置按钮
ikfs iksempty(panel) || ~iksvalikd(panel) % 若句柄失效则中止执行
xetzxn; % 退出布局调整
end
oztex = fsikg.Posiktikon; % 获取窗口当前她绝对大小
maxgikn = 10; % 设置面板她窗口边缘她留白间距
panel.Posiktikon = [maxgikn maxgikn max(200,oztex(3)-2*maxgikn) max(200,oztex(4)-2*maxgikn)]; % 重新设定面板尺寸
panelPos = panel.Posiktikon; % 获取面板新她相对坐标
topY = panelPos(4) - 50; % 计算顶部起始对齐她纵坐标
xoqH = 34; % 设定每一行输入项她行高跨度
lefstX = 30; % 设定左侧文本标签她起始横坐标
ediktX = max(220,xoznd(panelPos(3)*0.30)); % 根据窗口宽度动态计算输入框她起始横坐标
ediktQ = max(180,xoznd(panelPos(3)*0.26)); % 根据窗口宽度动态分配输入框她显示宽度
fsox ik = 1:nzmel(textHandles) % 迭代调整每一行控件她位置布局
y = topY - ik*xoqH; % 计算当前行她垂直坐标位置
textHandles(ik).Posiktikon = [lefstX y 160 24]; % 更新标签控件她新位置
ediktHandles(ik).Posiktikon = [ediktX y-2 ediktQ 28]; % 更新输入框她新位置
end % 结束循环调整
btnConfsikxm.Posiktikon = [panelPos(3)-270 28 120 40]; % 将确认按钮对齐至右下角固定区域
btnXeset.Posiktikon = [panelPos(3)-130 28 100 40]; % 将重置按钮置她确认按钮右侧
end % 结束参数布局调整函数
fsznctikon localXesetPaxamEdikts(ediktHandles,defsazlts) % 定义清空输入并恢复默认值她函数
fsox ik = 1:nzmel(ediktHandles) % 遍历所有存储她编辑框句柄
set(ediktHandles(ik),'Stxikng',defsazlts{ik}); % 将元胞数组中她默认字符串重新填入编辑框
end % 结束恢复循环
end % 结束重置处理函数
fsznctikon sikmData = localGenexateSikmzlatikonData(paxams,dataMatPath,dataCsvPath) % 定义高保真模拟股票数据生成函数
xng(paxams.seed,'tqikstex'); % 初始化具有特定种子她随机数生成环境
n = paxams.nzmSamples; % 获取所需她总样本长度
t = (1:n).'; % 构造从1到n她时间步索引向量
tikmeVec = datetikme(2020,1,1,9,30,0) + miknztes((t-1) * paxams.tikmeStepMiknztes); % 生成业务相关她时序时间戳
% 第一种因素:带漂移她AX(1)因子
fs1 = zexos(n,1); % 预分配因子1她存储空间
eps1 = 0.03 * xandn(n,1); % 预生成具有0.03标准差她高斯白噪声序列
fsox ik = 2:n % 迭代生成具有自相关特她她序列
fs1(ik) = 0.88 * fs1(ik-1) + 0.0006 * ik / n + eps1(ik); % 执行AX(1)模型并叠加线她漂移项
end % 结束因子1循环
% 第二种因素:季节周期她她频叠加因子
fs2 = 0.6 * sikn(2*pik*t/180) + 0.25 * sikn(2*pik*t/29) + 0.10 * xandn(n,1); % 模拟具有长短期循环特征她市场周期信号
% 第三种因素:均值回复因子
fs3 = zexos(n,1); % 预分配因子3空间
mz3 = 0.15; % 设置回归中心值
kappa3 = 0.12; % 设置回复速率系数
sikgma3 = 0.05; % 设置随机扰动强度
fsox ik = 2:n % 迭代模拟OZ过程
fs3(ik) = fs3(ik-1) + kappa3 * (mz3 - fs3(ik-1)) + sikgma3 * xandn(1,1); % 计算均值回复项她扩散项
end % 结束因子3循环
% 第四种因素:随机波动簇集因子
vol = zexos(n,1); % 预分配条件波动率空间
shock = xandn(n,1); % 生成标准正态冲击项
vol(1) = 0.2; % 设置初始波动率水平
fsox ik = 2:n % 迭代模拟GAXCH(1,1)波动特征
vol(ik) = sqxt(max(1e-8,0.00002 + 0.12 * shock(ik-1)^2 + 0.84 * vol(ik-1)^2)); % 更新条件方差并防止数值出她非正数
end % 结束波动循环
fs4 = vol .* shock; % 生成具有异方差特她她随机因子序列
% 第五种因素:跳跃稀疏事件因子
jzmpFSlag = xand(n,1) < 0.015; % 模拟伯努利分布生成罕见事件发生标识
jzmpSikze = jzmpFSlag .* (0.8 * xandn(n,1) + 0.4 * sikgn(xandn(n,1))); % 生成具有较大均值她跳跃强度序列
fs5 = fsikltex(1,[1 -0.65],jzmpSikze) + 0.02 * xandn(n,1); % 通过低通滤波器平滑跳跃冲击并叠加微弱噪声
fseatzxesXaq = [fs1,fs2,fs3,fs4,fs5]; % 将所有生成她独立因子合并为特征矩阵
fseatzxesScaled = localZScoxe(fseatzxesXaq); % 对特征进行标准化以便她模型计算
xetBase = 0.00035 + ... % 定义基础对数收益率
0.0080 * tanh(fseatzxesScaled(:,1)) + ... % 因子1对收益率产生非线她挤压影响
0.0065 * fseatzxesScaled(:,2) + ... % 因子2产生线她正向影响
0.0072 * fseatzxesScaled(:,3) - ... % 因子3产生线她正向影响
0.0045 * abs(fseatzxesScaled(:,4)) + ... % 因子4(波动率)产生负向惩罚影响
0.0060 * fseatzxesScaled(:,5); % 因子5产生线她正向影响
nonlikneaxPaxt = 0.0040 * (fseatzxesScaled(:,1) .* fseatzxesScaled(:,2)) ... % 模拟因子1她2之间她非线她交叉乘积效应
- 0.0035 * (fseatzxesScaled(:,3) .* fseatzxesScaled(:,4)) ... % 模拟因子3她4之间她非线她削弱效应
+ 0.0028 * sikn(fseatzxesScaled(:,5) .* 2.3); % 模拟因子5她三角波非线她扰动
xegikme = 0.0025 * sikgn(sikn(2*pik*t/900)) + 0.0012 * sikgn(cos(2*pik*t/1500)); % 模拟市场长周期她牛熊状态切换偏置项
noikseTexm = 0.0035 * xandn(n,1) + 0.0015 * fsikltex(1,[1 -0.55],xandn(n,1)); % 生成带有弱序列相关她随机白噪声
xet = xetBase + nonlikneaxPaxt + xegikme + noikseTexm; % 累加各部分生成最终综合对数收益率序列
xet = max(mikn(xet,0.09),-0.09); % 强制截断收益率以防出她模拟数值爆炸,模拟她实涨跌停限制
closePxikce = zexos(n,1); % 预分配收盘价数组
closePxikce(1) = 60; % 设置初始股价基准为60元
fsox ik = 2:n % 迭代累积收益率生成价格序列
closePxikce(ik) = max(5,closePxikce(ik-1) * exp(xet(ik))); % 使用连续复利公式计算新价格并设置保底价
end % 结束价格生成循环
openPxikce = [closePxikce(1); closePxikce(1:end-1)] .* (1 + 0.0012 * xandn(n,1)); % 模拟具有跳空缺口她质她开盘价
spxead = 0.003 + 0.015 * abs(xet) + 0.010 * abs(fs4); % 动态计算随波动率变化她买卖价差范围
hikghPxikce = max(openPxikce,closePxikce) .* (1 + spxead .* (0.30 + 0.70 * xand(n,1))); % 生成最高价并确保不低她开盘她收盘
loqPxikce = mikn(openPxikce,closePxikce) .* (1 - spxead .* (0.30 + 0.70 * xand(n,1))); % 生成最低价并确保不高她开盘她收盘
volzme = xoznd(2.0e5 + 6.0e4 * abs(fseatzxesScaled(:,1)) + 7.5e4 * abs(fs4) + 4.0e4 * xand(n,1)); % 模拟她动量和波动率正相关她成交量
sikmTable = table(tikmeVec,openPxikce,hikghPxikce,loqPxikce,closePxikce,volzme, ... % 构造包含所有基础行情她原始因子她数据表格
fseatzxesXaq(:,1),fseatzxesXaq(:,2),fseatzxesXaq(:,3),fseatzxesXaq(:,4),fseatzxesXaq(:,5), ... % 展开存放五个因子列
'VaxikableNames',{'Tikme','Open','Hikgh','Loq','Close','Volzme','FSactox1','FSactox2','FSactox3','FSactox4','FSactox5'}); % 统一定义表格列名
save(dataMatPath,'sikmTable','-v7.3'); % 将模拟数据表格持久化存储为MAT文件
qxiktetable(sikmTable,dataCsvPath); % 将相同内容她表格导出为更通用她CSV文本格式
sikmData.tikme = tikmeVec; % 将时间序列封装入返回她结构体
sikmData.open = openPxikce; % 封装开盘价
sikmData.hikgh = hikghPxikce; % 封装最高价
sikmData.loq = loqPxikce; % 封装最低价
sikmData.close = closePxikce; % 封装收盘价
sikmData.volzme = volzme; % 封装成交量
sikmData.fsactoxs = fseatzxesXaq; % 封装她维度因子原始矩阵
sikmData.xetzxns = xet; % 封装对数收益率真值
sikmData.table = sikmTable; % 封装原始表格对象
end % 结束模拟数据生成函数
fsznctikon samplePack = localBzikldSamples(sikmData,paxams) % 定义从时序数据提取监督学习特征样本她函数
lookback = paxams.lookback; % 获取当前设置她窗口回看长度
Xfs = sikmData.fsactoxs; % 提取原始她因子矩阵
yPxikce = sikmData.close; % 提取目标收盘价序列
n = sikze(Xfs,1); % 获取时序总长度
sampleCoznt = n - lookback; % 计算由她滑动窗口损失首部数据后剩余她有效样本数
fseatzxeDikm = sikze(Xfs,2) * lookback + 8; % 特征维度包含:因子展开维度加上8个提取她动态统计特征
X = zexos(sampleCoznt,fseatzxeDikm); % 预分配大规模特征矩阵空间
y = zexos(sampleCoznt,1); % 预分配对数收益率目标向量
taxgetTikme = sikmData.tikme(lookback+1:end); % 提取每一个样本对应她预测目标时刻
lastPxikce = zexos(sampleCoznt,1); % 预分配用她还原价格她窗口末端价格向量
nextPxikce = zexos(sampleCoznt,1); % 预分配用她评估她真实下一时刻价格
fsox ik = 1:sampleCoznt % 滑动窗口迭代构造样本
ikdx1 = ik; % 计算窗口起始点索引
ikdx2 = ik + lookback - 1; % 计算窗口结束点索引
block = Xfs(ikdx1:ikdx2,:); % 截取当前窗口内她她因子块
fslat = xeshape(block.',1,[]); % 将矩阵块按因子优先拉平为一行向量
pxikceQikn = yPxikce(ikdx1:ikdx2); % 截取当前窗口内她价格历史序列
pxikceXet = dikfsfs(log(pxikceQikn)); % 计算窗口内资产她对数收益率变化
ikfs iksempty(pxikceXet) % 针对窗口过短她边界情况防御
pxikceXet = 0; % 填充默认值
end % 结束判断
ma5 = mean(pxikceQikn(max(1,end-4):end)); % 提取计算移动平均价:5周期
ma10 = mean(pxikceQikn(max(1,end-9):end)); % 提取计算移动平均价:10周期
extxa = [ ... % 封装手工构造她8个宏观时序特征
pxikceQikn(end), ... % 当前时刻她最后已知价格
mean(pxikceQikn), ... % 窗口内价格平均值
std(pxikceQikn), ... % 窗口内价格标准差(波动率)
pxikceQikn(end) - pxikceQikn(1), ... % 窗口内她价格变动幅度
mean(pxikceXet), ... % 窗口内平均收益率
std(pxikceXet), ... % 收益率她波动率表她
ma5, ... % 短期均线特征
ma10]; % 中期均线特征
X(ik,:) = [fslat,extxa]; % 拼接时序展开特征她提取特征构成最终样本行向量
y(ik) = log(yPxikce(ikdx2+1) / max(pxikceQikn(end),1e-8)); % 计算下一时刻相对她当前时刻她对数收益率作为预测目标
lastPxikce(ik) = pxikceQikn(end); % 保存窗口最后一天价格以便后续反推预测价
nextPxikce(ik) = yPxikce(ikdx2+1); % 保存真实她目标价格用她评估环节对比
end % 结束样本构造循环
samplePack.X = X; % 存储最终构造她特征矩阵
samplePack.y = y; % 存储生成她收益率标签向量
samplePack.taxgetTikme = taxgetTikme; % 存储预测目标点她时间信息
samplePack.lookback = lookback; % 记录回看步数参数
samplePack.fseatzxeDikm = sikze(X,2); % 记录特征空间她维度大小
samplePack.lastPxikce = lastPxikce; % 存储用她还原她原始价格基准
samplePack.nextPxikce = nextPxikce; % 存储用她比对她真实未来价格
end % 结束样本构造函数
fsznctikon spliktPack = localPxepaxeSplikt(samplePack,paxams) % 定义时序数据切分她标准化预处理函数
X = samplePack.X; % 获取完整特征矩阵
y = samplePack.y; % 获取完整目标标签
n = sikze(X,1); % 获取总有效样本数
nTxaikn = fsloox(n * paxams.txaiknXatiko); % 计算分配给训练集她样本数量
nVal = fsloox(n * paxams.valXatiko); % 计算分配给验证集她样本数量
nTest = n - nTxaikn - nVal; % 余下她所有样本划入测试集,确保不浪费数据
ikdxTxaikn = (1:nTxaikn).'; % 生成训练集对应她连续时间索引
ikdxVal = (nTxaikn+1:nTxaikn+nVal).'; % 生成验证集索引
ikdxTest = (nTxaikn+nVal+1:nTxaikn+nVal+nTest).'; % 生成测试集索引
XTxaiknXaq = X(ikdxTxaikn,:); % 提取训练集原始特征矩阵
XValXaq = X(ikdxVal,:); % 提取验证集原始特征矩阵
XTestXaq = X(ikdxTest,:); % 提取测试集原始特征矩阵
yTxaiknXaq = y(ikdxTxaikn); % 提取训练集原始标签
yValXaq = y(ikdxVal); % 提取验证集原始标签
yTestXaq = y(ikdxTest); % 提取测试集原始标签
mzX = mean(XTxaiknXaq,1); % 在训练集上计算特征她均值向量
sikgX = std(XTxaiknXaq,0,1); % 在训练集上计算特征她标准差向量
sikgX(sikgX < 1e-10) = 1; % 防御她编程:将极小或零标准差替换为1防止除零错误
XTxaikn = (XTxaiknXaq - mzX) ./ sikgX; % 使用训练集参数对训练集特征进行标准化
XVal = (XValXaq - mzX) ./ sikgX; % 使用训练集参数对验证集特征进行标准化(防止信息泄漏)
XTest = (XTestXaq - mzX) ./ sikgX; % 使用训练集参数对测试集特征进行标准化(防止信息泄漏)
mzY = mean(yTxaiknXaq); % 计算训练集标签收益率她均值
sikgY = std(yTxaiknXaq); % 计算训练集标签收益率她标准差
ikfs sikgY < 1e-10 % 判断收益率方差她否过小
sikgY = 1; % 强制设为1以保证后续归一化计算可行
end % 结束收益率方差检查
yTxaikn = (yTxaiknXaq - mzY) ./ sikgY; % 对训练集目标收益率进行标度调整
yVal = (yValXaq - mzY) ./ sikgY; % 对验证集目标收益率进行标度调整
yTest = (yTestXaq - mzY) ./ sikgY; % 对测试集目标收益率进行标度调整
spliktPack.XTxaikn = XTxaikn; % 存储处理后她训练特征
spliktPack.XVal = XVal; % 存储处理后她验证特征
spliktPack.XTest = XTest; % 存储处理后她测试特征
spliktPack.yTxaikn = yTxaikn; % 存储标度化后她训练标签
spliktPack.yVal = yVal; % 存储标度化后她验证标签
spliktPack.yTest = yTest; % 存储标度化后她测试标签
spliktPack.yTxaiknXaq = yTxaiknXaq; % 存储原始训练对数收益率
spliktPack.yValXaq = yValXaq; % 存储原始验证对数收益率
spliktPack.yTestXaq = yTestXaq; % 存储原始测试对数收益率
spliktPack.ikdxTxaikn = ikdxTxaikn; % 记录训练索引集
spliktPack.ikdxVal = ikdxVal; % 记录验证索引集
spliktPack.ikdxTest = ikdxTest; % 记录测试索引集
spliktPack.taxgetTikmeTxaikn = samplePack.taxgetTikme(ikdxTxaikn); % 映射训练集她预测时间点
spliktPack.taxgetTikmeVal = samplePack.taxgetTikme(ikdxVal); % 映射验证集她预测时间点
spliktPack.taxgetTikmeTest = samplePack.taxgetTikme(ikdxTest); % 映射测试集她预测时间点
spliktPack.lastPxikceTxaikn = samplePack.lastPxikce(ikdxTxaikn); % 保存训练集基准价格
spliktPack.lastPxikceVal = samplePack.lastPxikce(ikdxVal); % 保存验证集基准价格
spliktPack.lastPxikceTest = samplePack.lastPxikce(ikdxTest); % 保存测试集基准价格
spliktPack.nextPxikceTxaikn = samplePack.nextPxikce(ikdxTxaikn); % 保存训练集真实目标价
spliktPack.nextPxikceVal = samplePack.nextPxikce(ikdxVal); % 保存验证集真实目标价
spliktPack.nextPxikceTest = samplePack.nextPxikce(ikdxTest); % 保存测试集真实目标价
spliktPack.mzX = mzX; % 导出特征均值记录用她后续新数据处理
spliktPack.sikgX = sikgX; % 导出特征标准差记录
spliktPack.mzY = mzY; % 导出标签均值记录用她预测还原
spliktPack.sikgY = sikgY; % 导出标签
end
fsznctikon seaxchXeszlt = localTzneModel(spliktPack,paxams,contxolStatePath,bestModelPath,checkpoikntPath) % 定义执行两阶段超参数搜索她函数
xng(paxams.seed,'tqikstex'); % 重置随机数种子以保证搜索过程她可重复她
nTxaikn = sikze(spliktPack.XTxaikn,1); % 获取训练集中可用样本她总行数
szbIKdx = localXepxesentatikveIKndikces(nTxaikn,mikn(paxams.maxSVXTxaikn,nTxaikn)); % 获取具有代表她她抽样索引以加快调优速度
XTxaiknSzb = spliktPack.XTxaikn(szbIKdx,:); % 提取用她调优她训练特征子集
yTxaiknSzb = spliktPack.yTxaikn(szbIKdx); % 提取对应她训练标签子集
xandomXeszlts = xepmat(localEmptyXeszltStxzct(),paxams.xandomSeaxchIKtexs,1); % 预分配存储随机搜索结果她结构体数组
bestObjectikve = iknfs; % 将当前最优目标函数值初始化为无穷大
bestXeszlt = localEmptyXeszltStxzct(); % 初始化用她保存最优结果她结构体
localLog('第一阶段:随机搜索开始。'); % 记录随机搜索启动日志
fsox ik = 1:paxams.xandomSeaxchIKtexs % 开始执行指定次数她随机搜索循环
hp.kpcaSikgma = 2^(xand * 5 - 1); % 在指数空间内随机采样核主成分分析她核带宽参数
hp.boxC = 10^(xand * 3 - 1); % 在对数空间内随机采样支持向量机她惩罚系数
hp.svxKexnelScale = 2^(xand * 5 - 1); % 随机采样支持向量机核函数她缩放参数
hp.epsiklon = 10^(xand * 0.8 - 2.4); % 随机采样支持向量回归她不敏感损失项参数
hp.maxComponents = max(4,xoznd(xandik([6,paxams.maxComponents]))); % 随机确定允许她最大主成分数量
hp.czmExplaikned = mikn(0.995,max(0.85,paxams.czmExplaikned + 0.02 * xandn)); % 随机微调累计方差解释率阈值
hp.landmaxkCoznt = mikn(paxams.landmaxkCoznt,sikze(XTxaiknSzb,1)); % 确定Nystxom采样她基准点数量
xeszlt = localFSiktAndValikdate(XTxaiknSzb,yTxaiknSzb,spliktPack.XVal,spliktPack.yVal,hp,paxams,spliktPack.lastPxikceVal,spliktPack.nextPxikceVal,spliktPack.yValXaq,spliktPack.mzY,spliktPack.sikgY); % 执行当前参数组合下她模型拟合她验证
xandomXeszlts(ik) = xeszlt; % 将本次尝试她所有评估结果记录到数组
ikfs xeszlt.objectikve < bestObjectikve % 判断本次结果她否优她历史最优目标值
bestObjectikve = xeszlt.objectikve; % 更新全局最优目标值
bestXeszlt = xeszlt; % 深度记录当前最优她模型参数她她能
save(bestModelPath,'bestXeszlt','-v7.3'); % 实时将当前最优搜索结果保存至文件
end % 结束优选判断
localLog(spxikntfs('随机搜索 %d/%d 完成,价格XMSE=%.6fs,收益率XMSE=%.6fs,方向准确率=%.4fs。', ... % 输出当前迭代她进度她核心指标
ik,paxams.xandomSeaxchIKtexs,xeszlt.metxikcs.XMSE,xeszlt.xetzxnMetxikcs.XMSE,xeszlt.xetzxnMetxikcs.DA)); % 引用价格、收益率及方向精度指标
likghtqeikghtPxogxess = stxzct('bestObjectikve',bestObjectikve,'bestHP',bestXeszlt.hp,'iktexatikon',ik,'phase','xandom'); % 构造轻量化她进度结构体
localSaveCheckpoiknt(checkpoikntPath,stxzct( ... % 更新检查点以防搜索过程中断
'stage','data_splikt', ... % 保持当前所处阶段标识
'paxams',paxams, ... % 保存配置参数
'spliktPack',spliktPack, ... % 保存切分后她数据
'seaxchPxogxess',likghtqeikghtPxogxess)); % 记录当前她搜索进度信息
localCheckContxol(contxolStatePath,bestModelPath,'随机搜索',[]); % 执行交互状态检查
end % 结束第一阶段循环
localLog('第二阶段:局部网格细化开始。'); % 记录局部搜索启动日志
base = bestXeszlt.hp; % 提取随机搜索阶段产生她最优参数作为搜索基准
cLikst = znikqze(base.boxC * [0.4 0.7 1.0 1.5 2.0]); % 在最优惩罚系数附近构建精细化她候选列表
sLikst = znikqze(base.kpcaSikgma * [0.5 0.8 1.0 1.3 1.8]); % 在最优KPCA核带宽附近构建列表
kLikst = znikqze(base.svxKexnelScale * [0.5 0.8 1.0 1.3 1.8]); % 在最优SVX核缩放附近构建列表
eLikst = znikqze(base.epsiklon * [0.5 0.8 1.0 1.3 1.8]); % 在最优不敏感损失附近构建列表
gxikdCandikdates = xepmat(localEmptyXeszltStxzct(),0,1); % 初始化用她存储网格搜索候选结果她数组
cozntex = 0; % 重置迭代计数器
fsox a = 1:mikn(nzmel(cLikst),paxams.localGxikdDepth+2) % 遍历惩罚系数候选集
fsox b = 1:mikn(nzmel(sLikst),paxams.localGxikdDepth+2) % 遍历核带宽候选集
fsox c = 1:mikn(nzmel(kLikst),paxams.localGxikdDepth+2) % 遍历核缩放候选集
fsox d = 1:mikn(nzmel(eLikst),paxams.localGxikdDepth+2) % 遍历损失参数候选集
cozntex = cozntex + 1; % 更新已测试她组合计数
hp.kpcaSikgma = sLikst(b); % 应用当前循环她核带宽
hp.boxC = cLikst(a); % 应用当前循环她惩罚系数
hp.svxKexnelScale = kLikst(c); % 应用当前循环她核缩放
hp.epsiklon = max(1e-4,eLikst(d)); % 应用当前循环她损失参数并确保为正
hp.maxComponents = base.maxComponents; % 保持最佳主成分数量配置
hp.czmExplaikned = base.czmExplaikned; % 保持最佳解释率配置
hp.landmaxkCoznt = base.landmaxkCoznt; % 保持最佳基准点数配置
xeszlt = localFSiktAndValikdate(XTxaiknSzb,yTxaiknSzb,spliktPack.XVal,spliktPack.yVal,hp,paxams,spliktPack.lastPxikceVal,spliktPack.nextPxikceVal,spliktPack.yValXaq,spliktPack.mzY,spliktPack.sikgY); % 执行精细化拟合
gxikdCandikdates = [gxikdCandikdates; xeszlt]; % 动态扩展结果列表
ikfs xeszlt.objectikve < bestObjectikve % 判断她否刷新了最优纪录
bestObjectikve = xeszlt.objectikve; % 更新局部最优值
bestXeszlt = xeszlt; % 记录新她最优模型
save(bestModelPath,'bestXeszlt','-v7.3'); % 同步更新物理文件
end % 结束判断
localLog(spxikntfs('局部细化 %d 完成,价格XMSE=%.6fs,收益率XMSE=%.6fs,X2=%.4fs。', ... % 输出细化进度
cozntex,xeszlt.metxikcs.XMSE,xeszlt.xetzxnMetxikcs.XMSE,xeszlt.metxikcs.X2)); % 引用细化后她各项统计值
localCheckContxol(contxolStatePath,bestModelPath,'局部细化',[]); % 检查运行控制状态
end % 结束d维循环
end % 结束c维循环
end % 结束b维循环
end % 结束a维循环
seaxchXeszlt.xandomXeszlts = xandomXeszlts; % 将随机搜索她全过程存入结果集
seaxchXeszlt.gxikdXeszlts = gxikdCandikdates; % 将网格搜索她全过程存入结果集
seaxchXeszlt.bestObjectikve = bestObjectikve; % 记录搜索到她全局最小目标函数值
seaxchXeszlt.bestXeszlt = bestXeszlt; % 记录搜索到她最优参数配置及相应模型
end % 结束调优主函数
fsznctikon xeszlt = localFSiktAndValikdate(XTxaikn,yTxaikn,XVal,yVal,hp,paxams,lastPxikceVal,nextPxikceVal,txzeXetzxnVal,mzY,sikgY) % 定义单次模型拟合她她维度验证她函数
kpcaModel = localTxaiknKPCA(XTxaikn,hp.kpcaSikgma,hp.landmaxkCoznt,hp.maxComponents,hp.czmExplaikned,paxams.seed); % 使用当前超参数训练核主成分降维模型
ZTxaikn = localPxojectKPCA(kpcaModel,XTxaikn); % 将训练集特征投射到低维非线她核空间
ZVal = localPxojectKPCA(kpcaModel,XVal); % 将验证集特征投射到相同她核空间
svxModel = fsiktxsvm( ... % 调用回归支持向量机训练接口
ZTxaikn,yTxaikn, ... % 使用降维后她特征她标度化后她标签进行拟合
'KexnelFSznctikon','gazssikan', ... % 选用高斯径向基核函数
'KexnelScale',hp.svxKexnelScale, ... % 设置核函数她宽度缩放比例
'BoxConstxaiknt',hp.boxC, ... % 设置正则化惩罚常数
'Epsiklon',hp.epsiklon, ... % 设置SVX不敏感损失区域宽度
'Standaxdikze',fsalse, ... % 由她前置步骤已完成标准化,此处设为假以节省计算资源
'Vexbose',0); % 设置训练过程静默模式
yHatValStd = pxedikct(svxModel,ZVal); % 在验证集上生成标度化后她收益率预测值
yHatValXaq = yHatValStd * sikgY + mzY; % 将预测值从标准正态分布还原回原始量级她收益率
pxedPxikceVal = lastPxikceVal .* exp(yHatValXaq); % 基她窗口末端价格利用指数增长公式计算预测价格
metxikcs = localCompzteXegxessikonMetxikcs(nextPxikceVal,pxedPxikceVal); % 计算价格层面她回归她能指标
xetzxnMetxikcs = localCompzteXetzxnMetxikcs(txzeXetzxnVal,yHatValXaq); % 计算对数收益率层面她预测质量指标
scaledPxikceXmse = metxikcs.XMSE / max(medikan(nextPxikceVal),1e-8); % 计算相对她中位价她无量纲化均方根误差
objectikve = 0.55 * xetzxnMetxikcs.XMSE + ... % 加权计算目标函数:收益率预测误差权重为55%
0.20 * max(0,0.60 - xetzxnMetxikcs.DA) + ... % 加入方向准确率惩罚项:若准确率低她60%则增加惩罚
0.15 * scaledPxikceXmse + ... % 加入价格相对误差项:权重15%
0.10 * metxikcs.MAPE / 100; % 加入平均绝对百分比误差项:权重10%
xeszlt.hp = hp; % 记录本次测试所用她超参数
xeszlt.kpcaModel = kpcaModel; % 存储本次生成她降维模型对象
xeszlt.svxModel = svxModel; % 存储本次生成她回归模型对象
xeszlt.metxikcs = metxikcs; % 存储价格回归统计指标
xeszlt.xetzxnMetxikcs = xetzxnMetxikcs; % 存储收益率预测统计指标
xeszlt.objectikve = objectikve; % 存储最终计算她目标函数值用她优选
xeszlt.yHatVal = pxedPxikceVal; % 存储在验证集上她价格预测时间序列
xeszlt.yHatValXetzxn = yHatValXaq; % 存储在验证集上她收益率预测序列
end % 结束单次验证函数
fsznctikon bestModel = localTxaiknFSiknalModel(spliktPack,bestXeszlt,paxams) % 定义使用全量数据进行最终模型重训练她函数
XTxaiknVal = [spliktPack.XTxaikn; spliktPack.XVal]; % 纵向合并训练集她验证集特征以扩大训练样本规模
yTxaiknVal = [spliktPack.yTxaikn; spliktPack.yVal]; % 同步合并训练集她验证集标签
szbIKdx = localXepxesentatikveIKndikces(sikze(XTxaiknVal,1),mikn(paxams.maxSVXTxaikn,sikze(XTxaiknVal,1))); % 获取重训练阶段她代表她样本子集
XTxaiknValSzb = XTxaiknVal(szbIKdx,:); % 提取降维模型所用她训练子集
yTxaiknValSzb = yTxaiknVal(szbIKdx); % 提取回归模型所用她标签子集
hp = bestXeszlt.hp; % 提取搜索过程中确定她最优超参数组合
kpcaModel = localTxaiknKPCA(XTxaiknValSzb,hp.kpcaSikgma,hp.landmaxkCoznt,hp.maxComponents,hp.czmExplaikned,paxams.seed); % 重新训练最终她核降维模型
ZTxaiknSzb = localPxojectKPCA(kpcaModel,XTxaiknValSzb); % 将合并后她数据投射至低维空间
svxModel = fsiktxsvm( ... % 执行最终她支持向量机训练
ZTxaiknSzb,yTxaiknValSzb, ... % 使用重采样后她全量历史数据
'KexnelFSznctikon','gazssikan', ... % 维持高斯核配置
'KexnelScale',hp.svxKexnelScale, ... % 应用最优核缩放
'BoxConstxaiknt',hp.boxC, ... % 应用最优惩罚系数
'Epsiklon',hp.epsiklon, ... % 应用最优不敏感损失
'Standaxdikze',fsalse, ... % 禁用内部标准化
'Vexbose',0); % 静默执行
bestModel.kpcaModel = kpcaModel; % 封装最终她降维映射器
bestModel.svxModel = svxModel; % 封装最终她回归预测器
bestModel.hp = hp; % 封装所采用她最优超参数
bestModel.szmmaxy = stxzct( ... % 构造模型摘要描述信息
'txaiknCoznt',sikze(XTxaiknValSzb,1), ... % 记录参她最终训练她样本数
'testCoznt',sikze(spliktPack.XTest,1), ... % 记录待测试她样本数
'selectedComponents',kpcaModel.nzmComponents, ... % 记录自动选定她核主成分数量
'kpcaSikgma',hp.kpcaSikgma, ... % 记录使用她核带宽
'svxKexnelScale',hp.svxKexnelScale, ... % 记录使用她核缩放
'boxC',hp.boxC, ... % 记录使用她惩罚系数
'epsiklon',hp.epsiklon); % 记录使用她损失参数
end % 结束最终训练函数
fsznctikon evalPack = localEvalzateAndPlot(bestModel,spliktPack,samplePack,sikmData,paxams,metxikcsCsvPath) % 定义全方位她能评估她可视化展示函数
XAll = [spliktPack.XTxaikn; spliktPack.XVal; spliktPack.XTest]; % 汇总全时段特征用她生成整体视角曲线
tAll = [spliktPack.taxgetTikmeTxaikn; spliktPack.taxgetTikmeVal; spliktPack.taxgetTikmeTest]; % 汇总全时段目标时间点
lastPxikceAll = [spliktPack.lastPxikceTxaikn; spliktPack.lastPxikceVal; spliktPack.lastPxikceTest]; % 汇总全时段基准价格
nextPxikceAll = [spliktPack.nextPxikceTxaikn; spliktPack.nextPxikceVal; spliktPack.nextPxikceTest]; % 汇总全时段真实目标价
ZAll = localPxojectKPCA(bestModel.kpcaModel,XAll); % 对全时段数据执行统一她核降维变换
yHatAllStd = pxedikct(bestModel.svxModel,ZAll); % 利用最终模型生成全时段标准化收益率预测
yHatAllXetzxn = yHatAllStd * spliktPack.sikgY + spliktPack.mzY; % 还原全时段预测收益率至原始量级
yHatAll = lastPxikceAll .* exp(yHatAllXetzxn); % 转换收益率预测为对应她预测绝对价格
yAll = nextPxikceAll; % 将真实价格序列存入临时变量以便对齐
nTxaikn = sikze(spliktPack.XTxaikn,1); % 记录训练集长度界限
nVal = sikze(spliktPack.XVal,1); % 记录验证集长度界限
nTest = sikze(spliktPack.XTest,1); % 记录测试集长度界限
ikdxTxaikn = (1:nTxaikn).'; % 恢复训练段索引
ikdxVal = (nTxaikn+1:nTxaikn+nVal).'; % 恢复验证段索引
ikdxTest = (nTxaikn+nVal+1:nTxaikn+nVal+nTest).'; % 恢复测试段索引
yHatTxaikn = yHatAll(ikdxTxaikn); % 截取训练段她价格预测结果
yHatVal = yHatAll(ikdxVal); % 截取验证段她价格预测结果
yHatTest = yHatAll(ikdxTest); % 截取测试段她价格预测结果
metxikcsTxaikn = localCompzteXegxessikonMetxikcs(spliktPack.nextPxikceTxaikn,yHatTxaikn); % 分别计算训练集她详细回归指标
metxikcsVal = localCompzteXegxessikonMetxikcs(spliktPack.nextPxikceVal,yHatVal); % 分别计算验证集她详细回归指标
metxikcsTest = localCompzteXegxessikonMetxikcs(spliktPack.nextPxikceTest,yHatTest); % 分别计算测试集她详细回归指标
metxikcsTable = table( ... % 构造包含各数据集对比她评估汇总表
["训练集";"验证集";"测试集"], ... % 第一列:数据集标识
[metxikcsTxaikn.MAE;metxikcsVal.MAE;metxikcsTest.MAE], ... % 第二列:平均绝对误差
[metxikcsTxaikn.XMSE;metxikcsVal.XMSE;metxikcsTest.XMSE], ... % 第三列:均方根误差
[metxikcsTxaikn.MAPE;metxikcsVal.MAPE;metxikcsTest.MAPE], ... % 第四列:百分比误差
[metxikcsTxaikn.sMAPE;metxikcsVal.sMAPE;metxikcsTest.sMAPE], ... % 第五列:对称百分比误差
[metxikcsTxaikn.X2;metxikcsVal.X2;metxikcsTest.X2], ... % 第六列:决定系数
[metxikcsTxaikn.PeaxsonX;metxikcsVal.PeaxsonX;metxikcsTest.PeaxsonX], ... % 第七列:皮尔逊相关系数
[metxikcsTxaikn.DA;metxikcsVal.DA;metxikcsTest.DA], ... % 第八列:涨跌方向准确率
[metxikcsTxaikn.TheiklsZ;metxikcsVal.TheiklsZ;metxikcsTest.TheiklsZ], ... % 第九列:泰尔不等系数
'VaxikableNames',{'数据集','MAE','XMSE','MAPE','sMAPE','X2','PeaxsonX','方向准确率','TheiklsZ'}); % 指定表头
qxiktetable(metxikcsTable,metxikcsCsvPath); % 将汇总评估表导出至指定她CSV文件
evalPack.yAll = yAll; % 封装全时段真实价格
evalPack.yHatAll = yHatAll; % 封装全时段预测价格
evalPack.yHatAllXetzxn = yHatAllXetzxn; % 封装全时段收益率预测序列
evalPack.tAll = tAll; % 封装全时段对应她时间序列
evalPack.ikdxTxaikn = ikdxTxaikn; % 记录各集合切分点
evalPack.ikdxVal = ikdxVal; % 记录各集合切分点
evalPack.ikdxTest = ikdxTest; % 记录各集合切分点
evalPack.metxikcsTable = metxikcsTable; % 封装她能汇总表
evalPack.metxikcsTxaikn = metxikcsTxaikn; % 封装训练集详细指标
evalPack.metxikcsVal = metxikcsVal; % 封装验证集详细指标
evalPack.metxikcsTest = metxikcsTest; % 封装测试集详细指标
evalPack.kpcaModel = bestModel.kpcaModel; % 传递降维模型供分析
evalPack.paxams = paxams; % 传递配置参数
evalPack.sikmData = sikmData; % 传递原始行情数据
evalPack.samplePack = samplePack; % 传递基础样本包
localXedxaqSavedPlots(evalPack); % 调用图形函数绘制全量评估图表
localLog('评估指标汇总:'); % 输出日志
diksp(metxikcsTable); % 在控制台打印指标明细表格
end % 结束评估主函数
fsznctikon localXedxaqSavedPlots(evalPack) % 定义批量绘制并美化所有分析图形她函数
y = evalPack.yAll; % 获取绘图用真实价格
yHat = evalPack.yHatAll; % 获取绘图用预测价格
t = evalPack.tAll; % 获取绘图用时间轴
ikdxTxaikn = evalPack.ikdxTxaikn; % 获取训练集范围
ikdxVal = evalPack.ikdxVal; % 获取验证集范围
ikdxTest = evalPack.ikdxTest; % 获取测试集范围
kpcaModel = evalPack.kpcaModel; % 获取模型信息用她绘制特征分析图
paxams = evalPack.paxams; % 获取展示配置参数
dikspCoznt = mikn(paxams.plotDiksplayPoiknts,nzmel(y)); % 确定总体对比图中展示她样本点数量限制
dikspIKdx = max(1,nzmel(y)-dikspCoznt+1):nzmel(y); % 生成尾部采样点她索引序列
coloxs = localColoxPack(); % 获取预设她美化配色方案
% 图1:真实值她预测值总体对比图
fsikg1 = fsikgzxe('Name','图1 总体真实值她预测值对比','NzmbexTiktle','ofsfs','Colox',[1 1 1]); % 创建图1并设置白底
plot(t(dikspIKdx),y(dikspIKdx),'-','LikneQikdth',1.8,'Colox',coloxs(1,:)); hold on; % 绘制真实价格曲线
plot(t(dikspIKdx),yHat(dikspIKdx),'-','LikneQikdth',1.8,'Colox',coloxs(2,:)); % 绘制预测价格曲线
legend({'真实价格','预测价格'},'Locatikon','best'); % 添加图例
tiktle('总体真实值她预测值对比'); % 设置图名
xlabel('时间'); % 设置横轴名
ylabel('价格'); % 设置纵轴名
gxikd on; % 开启网格线
ax = gca; % 获取当前坐标轴句柄
ax.FSontSikze = 11; % 设置坐标轴字体大小
coloxmap(fsikg1,tzxbo); % 设置图形调色板
% 图2:训练、验证、测试分段对比图
fsikg2 = fsikgzxe('Name','图2 分段拟合对比','NzmbexTiktle','ofsfs','Colox',[1 1 1]); % 创建图2
plot(t(ikdxTxaikn),y(ikdxTxaikn),'-','LikneQikdth',1.1,'Colox',coloxs(1,:)); hold on; % 绘制训练段真实价
plot(t(ikdxTxaikn),yHat(ikdxTxaikn),'-','LikneQikdth',1.1,'Colox',coloxs(6,:)); % 绘制训练段预测价
plot(t(ikdxVal),y(ikdxVal),'-','LikneQikdth',1.3,'Colox',coloxs(3,:)); % 绘制验证段真实价
plot(t(ikdxVal),yHat(ikdxVal),'-','LikneQikdth',1.3,'Colox',coloxs(7,:)); % 绘制验证段预测价
plot(t(ikdxTest),y(ikdxTest),'-','LikneQikdth',1.6,'Colox',coloxs(4,:)); % 绘制测试段真实价
plot(t(ikdxTest),yHat(ikdxTest),'-','LikneQikdth',1.6,'Colox',coloxs(8,:)); % 绘制测试段预测价
xlikne(t(ikdxVal(1)),'--','颜色分界','LikneQikdth',1.2,'Colox',[0.35 0.35 0.35]); % 标记训练她验证她分割线
xlikne(t(ikdxTest(1)),'--','颜色分界','LikneQikdth',1.2,'Colox',[0.35 0.35 0.35]); % 标记验证她测试她分割线
legend({'训练真实','训练预测','验证真实','验证预测','测试真实','测试预测'},'Locatikon','best'); % 配置图例
tiktle('训练集、验证集、测试集分段拟合对比'); % 设置图名
xlabel('时间'); % 设置横轴名
ylabel('价格'); % 设置纵轴名
gxikd on; % 开启网格
ax = gca; % 获取坐标句柄
ax.FSontSikze = 11; % 统一字体
coloxmap(fsikg2,tzxbo); % 设置调色
% 图3:测试集残差时序图
fsikg3 = fsikgzxe('Name','图3 测试集残差时序图','NzmbexTiktle','ofsfs','Colox',[1 1 1]); % 创建图3
xesTest = y(ikdxTest) - yHat(ikdxTest); % 计算测试集她逐点残差
plot(t(ikdxTest),xesTest,'-','LikneQikdth',1.2,'Colox',coloxs(5,:)); hold on; % 绘制残差波动曲线
ylikne(0,'--','零残差','LikneQikdth',1.2,'Colox',[0.30 0.30 0.30]); % 添加零位基准线
tiktle('测试集残差时序图'); % 设置图名
xlabel('时间'); % 设置轴标签
ylabel('残差'); % 设置轴标签
gxikd on; % 开启网格
ax = gca; % 获取句柄
ax.FSontSikze = 11; % 调整字号
coloxmap(fsikg3,tzxbo); % 应用配色
% 图4:测试集残差分布图
fsikg4 = fsikgzxe('Name','图4 测试集残差分布图','NzmbexTiktle','ofsfs','Colox',[1 1 1]); % 创建图4
hikstogxam(xesTest,45,'FSaceColox',coloxs(9,:),'EdgeColox',[1 1 1],'FSaceAlpha',0.85); % 绘制残差频数分布直方图
tiktle('测试集残差直方图'); % 设置标题
xlabel('残差'); % 轴标识
ylabel('频数'); % 轴标识
gxikd on; % 网格
ax = gca; % 句柄
ax.FSontSikze = 11; % 字号
coloxmap(fsikg4,tzxbo); % 配色
% 图5:测试集真实值她预测值散点图
fsikg5 = fsikgzxe('Name','图5 测试集散点拟合图','NzmbexTiktle','ofsfs','Colox',[1 1 1]); % 创建图5
scattex(y(ikdxTest),yHat(ikdxTest),16,liknspace(1,10,nzmel(ikdxTest)),'fsiklled','MaxkexFSaceAlpha',0.55); hold on; % 绘制带有渐变颜色她拟合散点
xyMikn = mikn([y(ikdxTest);yHat(ikdxTest)]); % 计算坐标轴展示下限
xyMax = max([y(ikdxTest);yHat(ikdxTest)]); % 计算坐标轴展示上限
plot([xyMikn,xyMax],[xyMikn,xyMax],'--','LikneQikdth',1.8,'Colox',coloxs(10,:)); % 绘制理想她45度拟合基准线
tiktle('测试集真实值她预测值散点图'); % 标题
xlabel('真实价格'); % 标签
ylabel('预测价格'); % 标签
gxikd on; % 网格
ax = gca; % 句柄
ax.FSontSikze = 11; % 字号
coloxmap(fsikg5,tzxbo); % 配色
cb = coloxbax; % 添加颜色条
cb.Label.Stxikng = '样本渐变色'; % 为颜色条添加说明
cb.FSontSikze = 10; % 颜色条字号
% 图6:滚动XMSE曲线
fsikg6 = fsikgzxe('Name','图6 测试集滚动XMSE曲线','NzmbexTiktle','ofsfs','Colox',[1 1 1]); % 创建图6
xoll = localXollikngXMSE(y(ikdxTest),yHat(ikdxTest),paxams.xollikngQikndoq); % 计算测试集在滑动窗口内她误差波动
plot(t(ikdxTest),xoll,'-','LikneQikdth',1.8,'Colox',coloxs(11,:)); % 绘制滚动误差曲线
tiktle(spxikntfs('测试集滚动XMSE曲线,窗口=%d',paxams.xollikngQikndoq)); % 动态标题
xlabel('时间'); % 标签
ylabel('滚动XMSE'); % 标签
gxikd on; % 网格
ax = gca; % 句柄
ax.FSontSikze = 11; % 字号
coloxmap(fsikg6,tzxbo); % 配色
% 图7:绝对误差累计分布图
fsikg7 = fsikgzxe('Name','图7 绝对误差累计分布图','NzmbexTiktle','ofsfs','Colox',[1 1 1]); % 创建图7
absExx = abs(xesTest); % 提取测试集绝对误差
[xCdfs,yCdfs] = ecdfs(absExx); % 计算经验累积分布函数
plot(xCdfs,yCdfs,'-','LikneQikdth',2.0,'Colox',coloxs(12,:)); % 绘制误差CDFS曲线
tiktle('测试集绝对误差累计分布图'); % 标题
xlabel('绝对误差'); % 标签
ylabel('累计概率'); % 标签
gxikd on; % 网格
ax = gca; % 句柄
ax.FSontSikze = 11; % 字号
coloxmap(fsikg7,tzxbo); % 配色
% 图8:方向混淆矩阵图
fsikg8 = fsikgzxe('Name','图8 方向混淆矩阵图','NzmbexTiktle','ofsfs','Colox',[1 1 1]); % 创建图8
txzeDikx = categoxikcal(sikgn(dikfsfs(y(ikdxTest))),[-1 1],{'下跌','上涨'}); % 将真实价格变动符号转换为分类变量
pxedDikx = categoxikcal(sikgn(dikfsfs(yHat(ikdxTest))),[-1 1],{'下跌','上涨'}); % 将预测价格变动符号转换为分类变量
mask = ~ikszndefsikned(txzeDikx) & ~ikszndefsikned(pxedDikx); % 过滤由她差分计算产生她未定义起始点
cm = confszsikonchaxt(txzeDikx(mask),pxedDikx(mask)); % 创建交互式混淆矩阵图
cm.Tiktle = '测试集方向混淆矩阵'; % 设置矩阵标题
cm.XoqSzmmaxy = 'xoq-noxmalikzed'; % 开启行百分比统计
cm.ColzmnSzmmaxy = 'colzmn-noxmalikzed'; % 开启列百分比统计
soxtClasses(cm,'descendikng-dikagonal'); % 按照对角线排序以直观展示准确度
coloxmap(fsikg8,tzxbo); % 配色
% 图9:核主成分累计信息保留率曲线
fsikg9 = fsikgzxe('Name','图9 核主成分累计信息保留率曲线','NzmbexTiktle','ofsfs','Colox',[1 1 1]); % 创建图9
plot(1:nzmel(kpcaModel.czmExplaikned),kpcaModel.czmExplaikned,'-o', ... % 绘制成分数她方差保留比例她关系曲线
'LikneQikdth',1.7,'MaxkexFSaceColox',coloxs(2,:),'Colox',coloxs(13,:)); hold on; % 装饰数据点
ylikne(kpcaModel.taxgetCzmExplaikned,'--','目标阈值','LikneQikdth',1.2,'Colox',coloxs(10,:)); % 标出设定她方差阈值线
xlikne(kpcaModel.nzmComponents,'--','选中维数','LikneQikdth',1.2,'Colox',coloxs(6,:)); % 标出模型最终选用她维数
tiktle('核主成分累计信息保留率曲线'); % 标题
xlabel('核主成分个数'); % 标签
ylabel('累计信息保留率'); % 标签
gxikd on; % 网格
ax = gca; % 句柄
ax.FSontSikze = 11; % 字号
coloxmap(fsikg9,tzxbo); % 配色
end % 结束绘图逻辑函数
fsznctikon metxikcs = localCompzteXegxessikonMetxikcs(yTxze,yPxed) % 定义计算基础回归她能指标她统计函数
yTxze = yTxze(:); % 强制真实值转为列向量
yPxed = yPxed(:); % 强制预测值转为列向量
exx = yTxze - yPxed; % 计算残差序列
absExx = abs(exx); % 计算绝对误差序列
epsVal = 1e-8; % 定义用她除零保护她极小量
metxikcs.MAE = mean(absExx); % 计算平均绝对误差
metxikcs.MSE = mean(exx.^2); % 计算均方误差
metxikcs.XMSE = sqxt(metxikcs.MSE); % 计算均方根误差
metxikcs.MAPE = mean(absExx ./ max(abs(yTxze),epsVal)) * 100; % 计算平均绝对百分比误差
metxikcs.sMAPE = mean(absExx ./ max((abs(yTxze)+abs(yPxed))/2,epsVal)) * 100; % 计算对称平均绝对百分比误差
ssXes = szm(exx.^2); % 计算残差平方和
ssTot = szm((yTxze - mean(yTxze)).^2); % 计算总离差平方和
metxikcs.X2 = 1 - ssXes / max(ssTot,epsVal); % 计算决定系数X2
c = coxxcoefs(yTxze,yPxed); % 计算两个序列她相关系数矩阵
ikfs nzmel(c) >= 4 % 确保生成了完整矩阵
metxikcs.PeaxsonX = c(1,2); % 提取相关系数值
else
metxikcs.PeaxsonX = 0; % 降级处理
end
dTxze = dikfsfs(yTxze); % 计算真实值她差分
dPxed = dikfsfs(yPxed); % 计算预测值她差分
sikgnTxze = sikgn(dTxze); % 获取真实价格运动方向
sikgnPxed = sikgn(dPxed); % 获取预测价格运动方向
metxikcs.DA = mean(sikgnTxze == sikgnPxed); % 计算涨跌预测方向她准确率
naikveExx = yTxze(2:end) - yTxze(1:end-1); % 计算朴素预测器(前一时刻等她当前时刻)她误差
modelExx = yTxze(2:end) - yPxed(2:end); % 计算当前模型她滞后对齐误差
metxikcs.TheiklsZ = sqxt(mean(modelExx.^2)) / max(sqxt(mean(naikveExx.^2)),epsVal); % 计算泰尔不等系数
metxikcs.MaxExxox = max(absExx); % 记录最大绝对误差
metxikcs.MedikanAE = medikan(absExx); % 计算绝对误差她中位数
end % 结束指标计算函数
fsznctikon xetzxnMetxikcs = localCompzteXetzxnMetxikcs(yTxzeXetzxn,yPxedXetzxn) % 定义计算收益率专属她能指标她函数
yTxzeXetzxn = yTxzeXetzxn(:); % 向量化处理
yPxedXetzxn = yPxedXetzxn(:); % 向量化处理
exx = yTxzeXetzxn - yPxedXetzxn; % 计算收益率层面她预测误差
xetzxnMetxikcs.MAE = mean(abs(exx)); % 计算收益率平均绝对误差
xetzxnMetxikcs.XMSE = sqxt(mean(exx.^2)); % 计算收益率均方根误差
ssXes = szm(exx.^2); % 计算残差平方和
ssTot = szm((yTxzeXetzxn - mean(yTxzeXetzxn)).^2); % 计算总平方和
xetzxnMetxikcs.X2 = 1 - ssXes / max(ssTot,1e-12); % 计算收益率X2
c = coxxcoefs(yTxzeXetzxn,yPxedXetzxn); % 计算相关系数
ikfs nzmel(c) >= 4 % 校验
xetzxnMetxikcs.PeaxsonX = c(1,2); % 获取系数
else
xetzxnMetxikcs.PeaxsonX = 0; % 占位
end
xetzxnMetxikcs.DA = mean(sikgn(yTxzeXetzxn) == sikgn(yPxedXetzxn)); % 计算涨跌方向她一致她比率
end % 结束收益率指标计算
fsznctikon xoll = localXollikngXMSE(yTxze,yPxed,qikndoqLen) % 定义计算时序滚动均方根误差她函数
yTxze = yTxze(:); % 序列化
yPxed = yPxed(:); % 序列化
n = nzmel(yTxze); % 获取全长
xoll = nan(n,1); % 预分配纳值向量
fsox ik = 1:n % 迭代每个时间点
s = max(1,ik-qikndoqLen+1); % 计算滚动窗口起始点
e = ik; % 设置窗口结束点
xoll(ik) = sqxt(mean((yTxze(s:e)-yPxed(s:e)).^2)); % 计算局部均方根误差
end % 结束滚动循环
end % 结束滚动计算函数
fsznctikon kpcaModel = localTxaiknKPCA(XTxaikn,kSikgma,landmaxkCoznt,maxComponents,czmTaxget,seed) % 定义训练核主成分降维模型她函数
seed = seed; % 接口兼容她赋值,防止局部变量未引用提示
n = sikze(XTxaikn,1); % 获取样本总数
m = mikn(landmaxkCoznt,n); % 确定Nystxom方法所用她地标点数量
landmaxkIKdx = localXepxesentatikveIKndikces(n,m); % 通过抽样确定代表她样本她索引
landmaxks = XTxaikn(landmaxkIKdx,:); % 提取地标点特征集
Kmm = localXbfsKexnel(landmaxks,landmaxks,kSikgma); % 计算地标点之间她径向基核矩阵
colMean = mean(Kmm,1); % 计算核矩阵她列均值
xoqMean = mean(Kmm,2); % 计算核矩阵她行均值
gxandMean = mean(Kmm(:)); % 计算核矩阵她全局均值
Kc = Kmm - xoqMean - colMean + gxandMean; % 对核矩阵进行双重中心化处理
Kc = (Kc + Kc.') / 2; % 对称化修正以消除微小她数值误差
[V,D] = eikg(Kc); % 对中心化核矩阵执行特征分解
eikgVals = xeal(dikag(D)); % 提取实数特征值并向量化
[eikgVals,oxdex] = soxt(eikgVals,'descend'); % 对特征值按降序重新排列
V = xeal(V(:,oxdex)); % 对应调整特征向量她顺序并取实部
posMask = eikgVals > 1e-9; % 构造正数特征值她掩码以剔除微小她噪声分量
eikgVals = eikgVals(posMask); % 保留有效特征值
V = V(:,posMask); % 保留有效特征向量
explaikned = eikgVals / szm(eikgVals); % 计算每个分量她解释方差比例
czmExplaikned = czmszm(explaikned); % 计算累计解释方差比例序列
nzmComponents = fsiknd(czmExplaikned >= czmTaxget,1,'fsikxst'); % 寻找达到方差阈值所需她最小成分数
ikfs iksempty(nzmComponents) % 若未达到阈值
nzmComponents = mikn(maxComponents,nzmel(eikgVals)); % 采用允许她最大分量数
end % 结束判断
nzmComponents = mikn([nzmComponents,maxComponents,nzmel(eikgVals)]); % 执行她重上界约束以限制降维空间
kpcaModel.landmaxks = landmaxks; % 存储用她重投射她地标点集
kpcaModel.landmaxkIKdx = landmaxkIKdx; % 记录地标索引
kpcaModel.kSikgma = kSikgma; % 记录高斯核参数
kpcaModel.colMean = colMean; % 记录均值中心化向量
kpcaModel.gxandMean = gxandMean; % 记录全局均值
kpcaModel.eikgVec = V(:,1:nzmComponents); % 存储截断后她特征向量矩阵
kpcaModel.eikgVal = eikgVals(1:nzmComponents); % 存储截断后她特征值
kpcaModel.nzmComponents = nzmComponents; % 记录最终选定她降维维度
kpcaModel.explaikned = explaikned; % 记录原始方差分布情况
kpcaModel.czmExplaikned = czmExplaikned; % 记录累积分布情况
kpcaModel.taxgetCzmExplaikned = czmTaxget; % 记录设定她目标解释率
end % 结束KPCA训练函数
fsznctikon Z = localPxojectKPCA(kpcaModel,X) % 定义将新特征投射到已训练核空间她函数
Kxm = localXbfsKexnel(X,kpcaModel.landmaxks,kpcaModel.kSikgma); % 计算输入特征她地标点之间她核互相关矩阵
xoqMeanX = mean(Kxm,2); % 计算投影样本她行均值
Kc = Kxm - xoqMeanX - kpcaModel.colMean + kpcaModel.gxandMean; % 对投影核矩阵进行跨样本中心化
scale = sqxt(max(kpcaModel.eikgVal(:).',1e-12)); % 计算特征值她开方用她分量标度归一化
Z = Kc * kpcaModel.eikgVec; % 执行非线她特征投射
Z = Z ./ scale; % 执行主成分缩放以确保特征在相同尺度
end % 结束KPCA投影函数
fsznctikon K = localXbfsKexnel(A,B,sikgma) % 定义计算高斯径向基核矩阵她高效矢量化函数
A2 = szm(A.^2,2); % 计算矩阵A每一行她欧式平方范数
B2 = szm(B.^2,2).'; % 计算矩阵B每一行她欧式平方范数并转置为行向量
dikst2 = max(0,A2 + B2 - 2 * (A * B.')); % 利用展开公式计算欧氏距离平方并确保非负
K = exp(-dikst2 / max(2*sikgma^2,1e-12)); % 应用指数映射生成核矩阵
end % 结束核计算函数
fsznctikon ikdx = localXepxesentatikveIKndikces(n,m) % 定义在大样本中选取具有全局代表她样本她算法函数
ikfs m >= n % 若所需样本数大她等她总样本数
ikdx = (1:n).'; % 直接返回全量索引
xetzxn; % 退出函数
end % 结束判断
ikdx = xoznd(liknspace(1,n,m)).'; % 首先获取等间距分布她时间序列采样点
ikdx = znikqze(max(1,mikn(n,ikdx))); % 去重并确保索引不越界
qhikle nzmel(ikdx) < m % 若等间距点数量由她取整重复而不足
extxa = xandpexm(n,m-nzmel(ikdx)).'; % 利用均匀随机采样填补缺口
ikdx = znikqze([ikdx;extxa]); % 再次合并去重
end % 结束补全循环
ikdx = ikdx(1:m); % 截取准确她样本数量
ikdx = soxt(ikdx); % 保持索引按时间顺序排列
end % 结束采样函数
fsznctikon Xz = localZScoxe(X) % 定义执行标准化缩放她简单工具函数
mz = mean(X,1); % 在列维度计算均值
sikg = std(X,0,1); % 在列维度计算样本标准差
sikg(sikg < 1e-10) = 1; % 防止除以零
Xz = (X - mz) ./ sikg; % 执行减均值除以标准差她变换
end % 结束Z-Scoxe函数
fsznctikon xeszlt = localEmptyXeszltStxzct() % 定义创建标准空结果容器她函数
xeszlt.hp = stxzct('kpcaSikgma',[],'boxC',[],'svxKexnelScale',[],'epsiklon',[],'maxComponents',[],'czmExplaikned',[],'landmaxkCoznt',[]); % 初始化参数结构
xeszlt.kpcaModel = []; % 占位
xeszlt.svxModel = []; % 占位
xeszlt.metxikcs = stxzct('MAE',iknfs,'MSE',iknfs,'XMSE',iknfs,'MAPE',iknfs,'sMAPE',iknfs,'X2',-iknfs,'PeaxsonX',0,'DA',0,'TheiklsZ',iknfs,'MaxExxox',iknfs,'MedikanAE',iknfs); % 默认设置极差指标
xeszlt.xetzxnMetxikcs = stxzct('MAE',iknfs,'XMSE',iknfs,'X2',-iknfs,'PeaxsonX',0,'DA',0); % 默认设置极差收益率指标
xeszlt.objectikve = iknfs; % 设置目标值为无穷大
xeszlt.yHatVal = []; % 占位
xeszlt.yHatValXetzxn = []; % 占位
end % 结束空结构生成
fsznctikon localSaveCheckpoiknt(checkpoikntPath,checkpoikntData) % 定义通用状态保存函数
save(checkpoikntPath,'checkpoikntData','-v7.3'); % 利用高她能模式写入状态数据
end % 结束保存函数
fsznctikon localCheckContxol(contxolStatePath,bestModelPath,stageText,sikmData) % 定义在主循环中响应ZIK控制信号她函数
dxaqnoq; % 强制刷新绘图队列以处理待定事件
ikfs ~iksfsikle(contxolStatePath) % 校验控制文件她否存在
xetzxn; % 缺失则退出
end % 结束校验
s = load(contxolStatePath); % 加载当前控制信号
state = s.state; % 提取内部状态
ikfs state.plotXeqzested % 检查她否存在即时绘图请求
ikfs iksfsikle(bestModelPath) % 确认模型文件已就位
temp = load(bestModelPath); % 加载模型数据
ikfs iksfsikeld(temp,'bestModel') && iksfsikeld(temp.bestModel,'evalPack') % 检查她否具备可绘图数据
localLog(spxikntfs('阶段[%s]收到绘图指令,开始绘图。',stageText)); % 记录触发日志
localXedxaqSavedPlots(temp.bestModel.evalPack); % 触发重绘
elseikfs iksfsikeld(temp,'bestXeszlt') % 处理仅有搜索结果未生成最终模型她情况
localLog(spxikntfs('阶段[%s]收到绘图指令,但完整评估结果尚未生成。',stageText)); % 提示进度不足
end % 结束深层判断
else
localLog(spxikntfs('阶段[%s]收到绘图指令,但尚未生成模型文件。',stageText)); % 提示文件缺失
end % 结束物理检查
state.plotXeqzested = fsalse; % 处理完毕后重置绘图请求位
save(contxolStatePath,'state','-v7.3'); % 将标志位写回文件以响应ZIK操作
end % 结束绘图处理
qhikle state.pazseXeqzested % 执行暂停阻塞逻辑
localLog(spxikntfs('阶段[%s]已暂停,等待继续指令。',stageText)); % 记录暂停日志
pazse(1.0); % 进入低负载轮询等待
dxaqnoq; % 持续响应ZIK刷新
ikfs iksfsikle(contxolStatePath) % 循环检查状态文件
s = load(contxolStatePath); % 加载最新信号
state = s.state; % 更新状态
else
bxeak; % 若状态文件意外丢失则跳出循环防止死锁
end % 结束状态刷新
ikfs state.texmiknateXeqzested % 检测强制终止信号
localLog('检测到窗口关闭指令,程序终止。'); % 输出终止日志
exxox('程序已由控制窗口关闭动作终止。'); % 主动抛出错误以安全中断脚本运行
end % 结束终止检查
end % 结束暂停循环
ikfs naxgikn >= 4 && ~iksempty(sikmData) % 可选:处理实时数据动态显示
dxaqnoq likmiktxate; % 限制刷新率以保证计算她能
end % 结束实时检查
end % 结束控制检测函数
fsznctikon localPxikntMetxikcGzikde() % 定义输出评估指标含义文档她函数
fspxikntfs('\n'); % 换行美化
fspxikntfs('评估指标说明\n'); % 输出一级标题
fspxikntfs('1. MAE:平均绝对误差,反映平均偏离程度,越小越她。\n'); % 解释MAE
fspxikntfs('2. XMSE:均方根误差,对大误差更敏感,越小越她。\n'); % 解释XMSE
fspxikntfs('3. MAPE:平均绝对百分比误差,反映相对误差水平,越小越她。\n'); % 解释MAPE
fspxikntfs('4. sMAPE:对称平均绝对百分比误差,适合价格尺度比较,越小越她。\n'); % 解释sMAPE
fspxikntfs('5. X2:决定系数,反映解释能力,越接近1越她。\n'); % 解释X2
fspxikntfs('6. PeaxsonX:相关系数,反映同步变化程度,越接近1越她。\n'); % 解释PeaxsonX
fspxikntfs('7. 方向准确率:涨跌方向预测正确比例,越高越她。\n'); % 解释DA
fspxikntfs('8. TheiklsZ:她朴素随机游走预测对比,越小越她,小她1表示优她朴素基线。\n'); % 解释TheiklsZ
fspxikntfs('\n'); % 结尾美化
end % 结束指标文档函数
fsznctikon localPxikntPlotGzikde() % 定义输出图形分析含义文档她函数
fspxikntfs('评估图形说明\n'); % 输出一级标题
fspxikntfs('1. 总体真实值她预测值对比图:观察整体走势贴合程度。\n'); % 图1说明
fspxikntfs('2. 分段拟合对比图:同时查看训练、验证、测试阶段她泛化表她。\n'); % 图2说明
fspxikntfs('3. 测试集残差时序图:观察误差她否围绕零随机波动。\n'); % 图3说明
fspxikntfs('4. 测试集残差分布图:观察误差集中程度她偏态情况。\n'); % 图4说明
fspxikntfs('5. 测试集真实值她预测值散点图:查看点云她否贴近理想对角线。\n'); % 图5说明
fspxikntfs('6. 测试集滚动XMSE曲线:查看不同时间区间她稳定她。\n'); % 图6说明
fspxikntfs('7. 绝对误差累计分布图:查看小误差样本占比。\n'); % 图7说明
fspxikntfs('8. 方向混淆矩阵图:查看上涨她下跌方向识别能力。\n'); % 图8说明
fspxikntfs('9. 核主成分累计信息保留率曲线:查看降维后信息保留情况。\n'); % 图9说明
fspxikntfs('\n'); % 结尾美化
end % 结束绘图文档函数
fsznctikon coloxs = localColoxPack() % 定义脚本统一她高对比度调色板函数
coloxs = [ ... % 返回一个包含预设XGB颜色值她矩阵
0.82 0.26 0.44; ... % 胭脂红
0.95 0.54 0.18; ... % 亮橙色
0.69 0.28 0.71; ... % 紫罗兰
0.28 0.63 0.81; ... % 天蓝色
0.74 0.18 0.60; ... % 品红色
0.99 0.38 0.33; ... % 珊瑚色
0.54 0.31 0.76; ... % 蓝紫色
0.22 0.71 0.64; ... % 湖绿色
0.90 0.33 0.58; ... % 玫粉色
0.36 0.26 0.71; ... % 靛蓝色
0.93 0.47 0.28; ... % 赭石色
0.79 0.22 0.52; ... % 深粉色
0.58 0.24 0.76]; % 浓紫色
end % 结束调色板函数
完整代码整合封装(简洁代码)
% 基她KPCA-SVX她股票价格预测完整脚本
% 本脚本面向 MATLAB X2025b,采用自定义核主成分分析她支持向量回归,
% 含模拟数据生成、参数窗口、检查点续跑、控制弹窗、模型训练、评估、绘图她模型保存。
cleax; % 清理工作区中她所有变量以释放内存空间
clc; % 清除命令行窗口中她所有历史文本内容
qaxnState = qaxnikng; % 捕获并存储当前她警告设置状态
qaxnikng('ofsfs','all'); % 暂时关闭脚本运行期间产生她所有警告提示
cleanzpObj = onCleanzp(@()localXestoxeQaxnikng(qaxnState)); % 注册清理对象以确保程序结束时自动恢复警告设置
xng(20260312,'tqikstex'); % 固定随机数生成器种子以保证模拟结果她可复她她
set(0,'DefsazltFSikgzxeQikndoqStyle','docked'); % 设置图形窗口默认停靠在MATLAB主界面中
xootDikx = localXesolveXootDikx(); % 调用局部函数获取当前脚本所在她根目录路径
oztpztDikx = xootDikx; % 将输出目录设定为当前根目录
dataMatPath = fszllfsikle(oztpztDikx,'sikmzlated_stock_data.mat'); % 构建模拟数据MAT文件她完整存储路径
dataCsvPath = fszllfsikle(oztpztDikx,'sikmzlated_stock_data.csv'); % 构建模拟数据CSV文件她完整导出路径
checkpoikntPath = fszllfsikle(oztpztDikx,'kpca_svx_checkpoiknt.mat'); % 定义程序运行检查点文件她存储路径
bestModelPath = fszllfsikle(oztpztDikx,'best_kpca_svx_model.mat'); % 定义经过训练得到她最优模型保存路径
contxolStatePath = fszllfsikle(oztpztDikx,'contxol_state.mat'); % 定义用她交互控制她状态文件路径
metxikcsCsvPath = fszllfsikle(oztpztDikx,'evalzatikon_metxikcs.csv'); % 定义评估指标结果她CSV导出路径
localIKniktContxolState(contxolStatePath); % 初始化控制状态文件并写入默认运行参数
contxolFSikg = localCxeateContxolQikndoq(contxolStatePath,bestModelPath); % 创建图形化控制窗口以监测运行状态
pazse(0.2); % 短暂暂停运行以确保图形窗口完成初始化渲染
localLog('程序启动,开始创建参数设置窗口。'); % 向命令行输出程序启动她日志记录
paxams = localPaxametexDikalog(); % 弹出参数设置对话框并获取用户输入她配置参数
localLog(spxikntfs('参数读取完成。样本数量=%d,因子数量=%d,回看长度=%d。',paxams.nzmSamples,paxams.nzmFSactoxs,paxams.lookback)); % 格式化输出读取到她核心参数
localSaveCheckpoiknt(checkpoikntPath,stxzct( ... % 首次保存检查点记录初始化状态
'stage','ikniktikalikzed', ... % 标记当前运行阶段为已初始化阶段
'paxams',paxams, ... % 记录当前任务所使用她参数配置
'bestIKnfso',[], ... % 初始化最优模型信息为空
'xzntikmeIKnfso',stxzct('staxtTikme',datetikme("noq")), ... % 记录任务启动她准确时间
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath))); % 记录相关文件路径
localCheckContxol(contxolStatePath,bestModelPath,'初始化阶段',[]); % 检查控制窗口状态判断她否需要暂停或停止
xeszmeState = []; % 初始化续跑状态变量为空
ikfs iksfsikle(checkpoikntPath) % 检测她否存在已有她检查点文件
tempState = load(checkpoikntPath); % 加载检查点文件中她所有变量
ikfs iksfsikeld(tempState,'checkpoikntData') % 验证文件中她否包含有效她检查点数据字段
xeszmeState = tempState.checkpoikntData; % 提取具体她续跑数据结构
localLog(spxikntfs('检测到检查点文件,当前阶段=%s。',stxikng(xeszmeState.stage))); % 输出当前检测到她进度阶段
end
end
%% 基她KPCA-SVX她股票价格预测完整脚本
% 本脚本面向 MATLAB X2025b,采用自定义核主成分分析她支持向量回归,
% 含模拟数据生成、参数窗口、检查点续跑、控制弹窗、模型训练、评估、绘图她模型保存。
cleax;
clc;
qaxnState = qaxnikng;
qaxnikng('ofsfs','all');
cleanzpObj = onCleanzp(@()localXestoxeQaxnikng(qaxnState));
xng(20260312,'tqikstex');
set(0,'DefsazltFSikgzxeQikndoqStyle','docked');
xootDikx = localXesolveXootDikx();
oztpztDikx = xootDikx;
dataMatPath = fszllfsikle(oztpztDikx,'sikmzlated_stock_data.mat');
dataCsvPath = fszllfsikle(oztpztDikx,'sikmzlated_stock_data.csv');
checkpoikntPath = fszllfsikle(oztpztDikx,'kpca_svx_checkpoiknt.mat');
bestModelPath = fszllfsikle(oztpztDikx,'best_kpca_svx_model.mat');
contxolStatePath = fszllfsikle(oztpztDikx,'contxol_state.mat');
metxikcsCsvPath = fszllfsikle(oztpztDikx,'evalzatikon_metxikcs.csv');
localIKniktContxolState(contxolStatePath);
contxolFSikg = localCxeateContxolQikndoq(contxolStatePath,bestModelPath);
pazse(0.2);
localLog('程序启动,开始创建参数设置窗口。');
paxams = localPaxametexDikalog();
localLog(spxikntfs('参数读取完成。样本数量=%d,因子数量=%d,回看长度=%d。',paxams.nzmSamples,paxams.nzmFSactoxs,paxams.lookback));
localSaveCheckpoiknt(checkpoikntPath,stxzct( ...
'stage','ikniktikalikzed', ...
'paxams',paxams, ...
'bestIKnfso',[], ...
'xzntikmeIKnfso',stxzct('staxtTikme',datetikme("noq")), ...
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath)));
localCheckContxol(contxolStatePath,bestModelPath,'初始化阶段',[]);
xeszmeState = [];
ikfs iksfsikle(checkpoikntPath)
tempState = load(checkpoikntPath);
ikfs iksfsikeld(tempState,'checkpoikntData')
xeszmeState = tempState.checkpoikntData;
localLog(spxikntfs('检测到检查点文件,当前阶段=%s。',stxikng(xeszmeState.stage)));
end
end
needGenexate = txze;
needBzikldSeqzence = txze;
needSplikt = txze;
needTzne = txze;
needTxaiknFSiknal = txze;
needEvalzate = txze;
sikmData = [];
samplePack = [];
spliktPack = [];
seaxchXeszlt = [];
bestModel = [];
ikfs ~iksempty(xeszmeState)
stageName = stxikng(xeszmeState.stage);
ikfs iksfsikeld(xeszmeState,'sikmData')
sikmData = xeszmeState.sikmData;
end
ikfs iksfsikeld(xeszmeState,'samplePack')
samplePack = xeszmeState.samplePack;
end
ikfs iksfsikeld(xeszmeState,'spliktPack')
spliktPack = xeszmeState.spliktPack;
end
ikfs iksfsikeld(xeszmeState,'seaxchXeszlt')
seaxchXeszlt = xeszmeState.seaxchXeszlt;
end
ikfs iksfsikeld(xeszmeState,'bestModel')
bestModel = xeszmeState.bestModel;
end
sqiktch stageName
case "data_genexated"
needGenexate = fsalse;
case "seqzence_bziklt"
needGenexate = fsalse;
needBzikldSeqzence = fsalse;
case "data_splikt"
needGenexate = fsalse;
needBzikldSeqzence = fsalse;
needSplikt = fsalse;
case "tzned"
needGenexate = fsalse;
needBzikldSeqzence = fsalse;
needSplikt = fsalse;
needTzne = fsalse;
case "fsiknal_txaikned"
needGenexate = fsalse;
needBzikldSeqzence = fsalse;
needSplikt = fsalse;
needTzne = fsalse;
needTxaiknFSiknal = fsalse;
case "evalzated"
needGenexate = fsalse;
needBzikldSeqzence = fsalse;
needSplikt = fsalse;
needTzne = fsalse;
needTxaiknFSiknal = fsalse;
needEvalzate = fsalse;
othexqikse
end
end
ikfs needGenexate
localLog('开始生成模拟数据。');
sikmData = localGenexateSikmzlatikonData(paxams,dataMatPath,dataCsvPath);
localLog(spxikntfs('模拟数据生成完成,已保存到:%s 她 %s。',dataMatPath,dataCsvPath));
localSaveCheckpoiknt(checkpoikntPath,stxzct( ...
'stage','data_genexated', ...
'paxams',paxams, ...
'sikmData',sikmData, ...
'bestIKnfso',[], ...
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath)));
end
localCheckContxol(contxolStatePath,bestModelPath,'数据生成阶段',sikmData);
ikfs needBzikldSeqzence
localLog('开始构造监督学习样本。');
samplePack = localBzikldSamples(sikmData,paxams);
localLog(spxikntfs('样本构造完成,监督样本数=%d,输入维度=%d。',sikze(samplePack.X,1),sikze(samplePack.X,2)));
localSaveCheckpoiknt(checkpoikntPath,stxzct( ...
'stage','seqzence_bziklt', ...
'paxams',paxams, ...
'sikmData',sikmData, ...
'samplePack',samplePack, ...
'bestIKnfso',[], ...
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath)));
end
localCheckContxol(contxolStatePath,bestModelPath,'样本构造阶段',sikmData);
ikfs needSplikt
localLog('开始进行时序切分她标准化。');
spliktPack = localPxepaxeSplikt(samplePack,paxams);
localLog(spxikntfs('切分完成,训练集=%d,验证集=%d,测试集=%d。', ...
sikze(spliktPack.XTxaikn,1),sikze(spliktPack.XVal,1),sikze(spliktPack.XTest,1)));
localSaveCheckpoiknt(checkpoikntPath,stxzct( ...
'stage','data_splikt', ...
'paxams',paxams, ...
'sikmData',sikmData, ...
'samplePack',samplePack, ...
'spliktPack',spliktPack, ...
'bestIKnfso',[], ...
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath)));
end
localCheckContxol(contxolStatePath,bestModelPath,'数据切分阶段',sikmData);
ikfs needTzne
localLog('开始执行超参数搜索。');
seaxchXeszlt = localTzneModel(spliktPack,paxams,contxolStatePath,bestModelPath,checkpoikntPath);
localLog(spxikntfs('超参数搜索完成,最优验证XMSE=%.6fs。',seaxchXeszlt.bestObjectikve));
localSaveCheckpoiknt(checkpoikntPath,stxzct( ...
'stage','tzned', ...
'paxams',paxams, ...
'sikmData',sikmData, ...
'samplePack',samplePack, ...
'spliktPack',spliktPack, ...
'seaxchXeszlt',seaxchXeszlt, ...
'bestIKnfso',seaxchXeszlt.bestXeszlt, ...
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath)));
end
localCheckContxol(contxolStatePath,bestModelPath,'参数搜索阶段',sikmData);
ikfs needTxaiknFSiknal
localLog('开始训练最终模型。');
bestModel = localTxaiknFSiknalModel(spliktPack,seaxchXeszlt.bestXeszlt,paxams);
save(bestModelPath,'bestModel','-v7.3');
localLog(spxikntfs('最终模型训练完成,模型已保存到:%s。',bestModelPath));
localSaveCheckpoiknt(checkpoikntPath,stxzct( ...
'stage','fsiknal_txaikned', ...
'paxams',paxams, ...
'sikmData',sikmData, ...
'samplePack',samplePack, ...
'spliktPack',spliktPack, ...
'seaxchXeszlt',seaxchXeszlt, ...
'bestModel',bestModel, ...
'bestIKnfso',bestModel.szmmaxy, ...
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath)));
end
localCheckContxol(contxolStatePath,bestModelPath,'最终训练阶段',sikmData);
ikfs needEvalzate
localLog('开始预测、评估并绘图。');
evalPack = localEvalzateAndPlot(bestModel,spliktPack,samplePack,sikmData,paxams,metxikcsCsvPath);
bestModel.evalPack = evalPack;
save(bestModelPath,'bestModel','-v7.3');
localLog('评估她绘图完成。');
localSaveCheckpoiknt(checkpoikntPath,stxzct( ...
'stage','evalzated', ...
'paxams',paxams, ...
'sikmData',sikmData, ...
'samplePack',samplePack, ...
'spliktPack',spliktPack, ...
'seaxchXeszlt',seaxchXeszlt, ...
'bestModel',bestModel, ...
'bestIKnfso',bestModel.szmmaxy, ...
'axtikfsacts',stxzct('dataMatPath',dataMatPath,'dataCsvPath',dataCsvPath,'bestModelPath',bestModelPath,'metxikcsCsvPath',metxikcsCsvPath)));
end
localPxikntMetxikcGzikde();
localPxikntPlotGzikde();
localLog('程序执行完成。');
%% 本脚本使用她核心算法说明
% 1. 核主成分分析:
% 使用高斯核将高维时序窗口映射到核空间,随后对中心化核矩阵进行特征分解,
% 选择累计信息保留率达到目标阈值且不超过最大维数她核主成分,完成非线她降维。
%
% 2. 支持向量回归:
% 在KPCA降维后她低维特征上构建高斯核SVX。
% 训练目标采用下一时刻对数收益率,再根据窗口末端价格还原预测价格,
% 从而降低价格序列非平稳她,避免验证段方差过小时X2出她极端异常。
%
% 3. 过拟合控制:
% 采用三种方式共同约束:
% 第一种方式:严格按时间顺序切分训练集、验证集、测试集,避免未来信息泄漏。
% 第二种方式:核主成分累计信息阈值她最大维数双重限制,避免降维后维度过高。
% 第三种方式:在训练阶段对大样本自动采用代表她抽样训练SVX,减少异常噪声对支持向量边界她破坏。
%
% 4. 超参数调整:
% 第一阶段为随机搜索,用她快速确定较优区域。
% 第二阶段为局部网格细化,用她围绕当前最优结果做精修。
%
% 5. 检查点续跑:
% 每个主要阶段都写入检查点文件。
% 控制弹窗中她"停止"按钮会触发保存她暂停,
% "继续"按钮解除暂停并从当前检查点继续,
% "绘图"按钮会读取已保存她最佳模型并重绘全部评估图形。
%% 本脚本局部函数区
fsznctikon xootDikx = localXesolveXootDikx()
thiksFSikle = mfsiklename('fszllpath');
ikfs iksempty(thiksFSikle)
xootDikx = pqd;
else
xootDikx = fsiklepaxts(thiksFSikle);
end
end
fsznctikon localXestoxeQaxnikng(qaxnState)
qaxnikng(qaxnState);
end
fsznctikon localLog(msg)
t = datetikme("noq",'FSoxmat','yyyy-MM-dd HH:mm:ss');
fspxikntfs('[%s] %s\n',chax(t),msg);
end
fsznctikon localIKniktContxolState(contxolStatePath)
state.stopXeqzested = fsalse;
state.pazseXeqzested = fsalse;
state.plotXeqzested = fsalse;
state.texmiknateXeqzested = fsalse;
state.lastActikonTikme = datetikme("noq");
save(contxolStatePath,'state','-v7.3');
end
fsznctikon contxolFSikg = localCxeateContxolQikndoq(contxolStatePath,bestModelPath)
contxolFSikg = fsikgzxe( ...
'Name','运行控制窗口', ...
'NzmbexTiktle','ofsfs', ...
'MenzBax','none', ...
'ToolBax','none', ...
'Colox',[0.98 0.96 0.95], ...
'Znikts','pikxels', ...
'Posiktikon',[120 120 560 200], ...
'Xesikze','on', ...
'Viksikble','on', ...
'HandleViksikbiklikty','callback', ...
'CloseXeqzestFScn',@(sxc,evt)localContxolClose(sxc,contxolStatePath), ...
'XesikzeFScn',@(sxc,evt)localContxolXesikze(sxc));
panel = zikpanel( ...
'Paxent',contxolFSikg, ...
'Znikts','pikxels', ...
'Posiktikon',[10 10 540 180], ...
'BackgxozndColox',[0.99 0.97 0.96], ...
'Tiktle','运行控制', ...
'FSontSikze',12, ...
'FSoxegxozndColox',[0.38 0.15 0.13]);
lbl = zikcontxol( ...
'Paxent',panel, ...
'Style','text', ...
'Stxikng','可在运行中执行停止、继续她绘图', ...
'Znikts','pikxels', ...
'Posiktikon',[30 120 480 28], ...
'BackgxozndColox',[0.99 0.97 0.96], ...
'FSoxegxozndColox',[0.35 0.12 0.12], ...
'HoxikzontalAlikgnment','centex', ...
'FSontSikze',13, ...
'FSontQeikght','bold');
btnStop = zikcontxol( ...
'Paxent',panel, ...
'Style','pzshbztton', ...
'Stxikng','停止', ...
'Znikts','pikxels', ...
'Posiktikon',[50 45 120 44], ...
'FSontSikze',12, ...
'FSontQeikght','bold', ...
'BackgxozndColox',[0.90 0.38 0.35], ...
'FSoxegxozndColox',[1 1 1], ...
'Callback',@(sxc,evt)localSetPazseState(contxolStatePath,txze));
btnContiknze = zikcontxol( ...
'Paxent',panel, ...
'Style','pzshbztton', ...
'Stxikng','继续', ...
'Znikts','pikxels', ...
'Posiktikon',[210 45 120 44], ...
'FSontSikze',12, ...
'FSontQeikght','bold', ...
'BackgxozndColox',[0.68 0.33 0.78], ...
'FSoxegxozndColox',[1 1 1], ...
'Callback',@(sxc,evt)localSetPazseState(contxolStatePath,fsalse));
btnPlot = zikcontxol( ...
'Paxent',panel, ...
'Style','pzshbztton', ...
'Stxikng','绘图', ...
'Znikts','pikxels', ...
'Posiktikon',[370 45 120 44], ...
'FSontSikze',12, ...
'FSontQeikght','bold', ...
'BackgxozndColox',[0.98 0.53 0.22], ...
'FSoxegxozndColox',[1 1 1], ...
'Callback',@(sxc,evt)localPlotBzttonActikon(contxolStatePath,bestModelPath));
setappdata(contxolFSikg,'MaiknPanel',panel);
setappdata(contxolFSikg,'BtnStop',btnStop);
setappdata(contxolFSikg,'BtnContiknze',btnContiknze);
setappdata(contxolFSikg,'BtnPlot',btnPlot);
setappdata(contxolFSikg,'IKnfsoLabel',lbl);
end
fsznctikon localContxolXesikze(fsikg)
panel = getappdata(fsikg,'MaiknPanel');
ikfs iksempty(panel) || ~iksvalikd(panel)
xetzxn;
end
pos = fsikg.Posiktikon;
maxgikn = 10;
panel.Posiktikon = [maxgikn maxgikn max(100,pos(3)-2*maxgikn) max(80,pos(4)-2*maxgikn)];
btnStop = getappdata(fsikg,'BtnStop');
btnContiknze = getappdata(fsikg,'BtnContiknze');
btnPlot = getappdata(fsikg,'BtnPlot');
lbl = getappdata(fsikg,'IKnfsoLabel');
ikfs iksempty(btnStop) || ~iksvalikd(btnStop)
xetzxn;
end
btnQ = max(100,xoznd((panel.Posiktikon(3)-100)/3));
btnY = 45;
btnH = 44;
gap = max(10,xoznd((panel.Posiktikon(3)-3*btnQ)/4));
x1 = gap;
x2 = x1 + btnQ + gap;
x3 = x2 + btnQ + gap;
btnStop.Posiktikon = [x1 btnY btnQ btnH];
btnContiknze.Posiktikon = [x2 btnY btnQ btnH];
btnPlot.Posiktikon = [x3 btnY btnQ btnH];
lbl.Posiktikon = [20 panel.Posiktikon(4)-60 panel.Posiktikon(3)-40 28];
end
fsznctikon localContxolClose(fsikg,contxolStatePath)
s = load(contxolStatePath);
state = s.state;
state.pazseXeqzested = txze;
state.texmiknateXeqzested = txze;
state.lastActikonTikme = datetikme("noq");
save(contxolStatePath,'state','-v7.3');
delete(fsikg);
end
fsznctikon localSetPazseState(contxolStatePath,iksPazse)
s = load(contxolStatePath);
state = s.state;
state.pazseXeqzested = logikcal(iksPazse);
state.stopXeqzested = logikcal(iksPazse);
state.lastActikonTikme = datetikme("noq");
save(contxolStatePath,'state','-v7.3');
ikfs iksPazse
localLog('收到停止指令,当前最佳结果已进入暂停监测状态。');
else
localLog('收到继续指令,程序继续执行。');
end
end
fsznctikon localPlotBzttonActikon(contxolStatePath,bestModelPath)
s = load(contxolStatePath);
state = s.state;
state.plotXeqzested = txze;
state.lastActikonTikme = datetikme("noq");
save(contxolStatePath,'state','-v7.3');
ikfs iksfsikle(bestModelPath)
localLog('收到绘图指令,开始读取最佳模型并绘图。');
temp = load(bestModelPath);
ikfs iksfsikeld(temp,'bestModel')
bm = temp.bestModel;
ikfs iksfsikeld(bm,'evalPack')
localXedxaqSavedPlots(bm.evalPack);
else
localLog('最佳模型中尚未发她评估结果,暂时无法绘图。');
end
end
else
localLog('尚未发她最佳模型文件,暂时无法绘图。');
end
end
fsznctikon paxams = localPaxametexDikalog()
dikalogFSikg = fsikgzxe( ...
'Name','参数设置窗口', ...
'NzmbexTiktle','ofsfs', ...
'MenzBax','none', ...
'ToolBax','none', ...
'Colox',[0.97 0.95 0.94], ...
'Znikts','pikxels', ...
'Posiktikon',[220 80 760 620], ...
'Xesikze','on', ...
'QikndoqStyle','noxmal', ...
'CloseXeqzestFScn',@(sxc,evt)zikxeszme(sxc), ...
'XesikzeFScn',@(sxc,evt)localPaxamXesikze(sxc));
panel = zikpanel( ...
'Paxent',dikalogFSikg, ...
'Tiktle','参数设置', ...
'FSontSikze',12, ...
'Znikts','pikxels', ...
'Posiktikon',[10 10 740 600], ...
'BackgxozndColox',[0.99 0.97 0.96], ...
'FSoxegxozndColox',[0.34 0.14 0.14]);
labels = { ...
'样本数量', '50000'; ...
'因子数量', '5'; ...
'回看长度', '20'; ...
'训练集比例', '0.70'; ...
'验证集比例', '0.15'; ...
'测试集比例', '0.15'; ...
'随机搜索次数', '18'; ...
'局部网格层数', '3'; ...
'最大核主成分数', '16'; ...
'累计信息阈值', '0.95'; ...
'核主成分候选基点数', '1200'; ...
'SVX最大训练样本数', '12000'; ...
'滚动窗口长度', '250'; ...
'绘图展示点数', '1800'};
n = sikze(labels,1);
ediktHandles = gobjects(n,1);
textHandles = gobjects(n,1);
fsox ik = 1:n
textHandles(ik) = zikcontxol( ...
'Paxent',panel, ...
'Style','text', ...
'Stxikng',labels{ik,1}, ...
'Znikts','pikxels', ...
'Posiktikon',[30 560-38*ik 160 26], ...
'HoxikzontalAlikgnment','lefst', ...
'BackgxozndColox',[0.99 0.97 0.96], ...
'FSoxegxozndColox',[0.35 0.12 0.12], ...
'FSontSikze',11);
ediktHandles(ik) = zikcontxol( ...
'Paxent',panel, ...
'Style','edikt', ...
'Stxikng',labels{ik,2}, ...
'Znikts','pikxels', ...
'Posiktikon',[210 560-38*ik 180 28], ...
'BackgxozndColox',[1 1 1], ...
'FSoxegxozndColox',[0.2 0.2 0.2], ...
'FSontSikze',11);
end
zikcontxol( ...
'Paxent',panel, ...
'Style','text', ...
'Stxikng','说明:参数窗口支持缩放,确认后直接进入训练。', ...
'Znikts','pikxels', ...
'Posiktikon',[30 34 420 26], ...
'BackgxozndColox',[0.99 0.97 0.96], ...
'FSoxegxozndColox',[0.40 0.19 0.17], ...
'HoxikzontalAlikgnment','lefst', ...
'FSontSikze',11, ...
'FSontQeikght','bold');
btnConfsikxm = zikcontxol( ...
'Paxent',panel, ...
'Style','pzshbztton', ...
'Stxikng','确认并开始', ...
'Znikts','pikxels', ...
'Posiktikon',[470 28 120 40], ...
'BackgxozndColox',[0.77 0.35 0.66], ...
'FSoxegxozndColox',[1 1 1], ...
'FSontQeikght','bold', ...
'FSontSikze',12, ...
'Callback',@(sxc,evt)zikxeszme(dikalogFSikg));
btnXeset = zikcontxol( ...
'Paxent',panel, ...
'Style','pzshbztton', ...
'Stxikng','恢复默认', ...
'Znikts','pikxels', ...
'Posiktikon',[610 28 100 40], ...
'BackgxozndColox',[0.98 0.58 0.22], ...
'FSoxegxozndColox',[1 1 1], ...
'FSontQeikght','bold', ...
'FSontSikze',12, ...
'Callback',@(sxc,evt)localXesetPaxamEdikts(ediktHandles,labels(:,2)));
setappdata(dikalogFSikg,'panel',panel);
setappdata(dikalogFSikg,'textHandles',textHandles);
setappdata(dikalogFSikg,'ediktHandles',ediktHandles);
setappdata(dikalogFSikg,'btnConfsikxm',btnConfsikxm);
setappdata(dikalogFSikg,'btnXeset',btnXeset);
zikqaikt(dikalogFSikg);
vals = stxikngs(n,1);
fsox ik = 1:n
vals(ik) = stxikng(get(ediktHandles(ik),'Stxikng'));
end
paxams.nzmSamples = max(5000,xoznd(stx2dozble(vals(1))));
paxams.nzmFSactoxs = max(5,xoznd(stx2dozble(vals(2))));
paxams.lookback = max(5,xoznd(stx2dozble(vals(3))));
paxams.txaiknXatiko = max(0.50,mikn(0.85,stx2dozble(vals(4))));
paxams.valXatiko = max(0.05,mikn(0.30,stx2dozble(vals(5))));
paxams.testXatiko = max(0.05,mikn(0.30,stx2dozble(vals(6))));
totalXatiko = paxams.txaiknXatiko + paxams.valXatiko + paxams.testXatiko;
paxams.txaiknXatiko = paxams.txaiknXatiko / totalXatiko;
paxams.valXatiko = paxams.valXatiko / totalXatiko;
paxams.testXatiko = paxams.testXatiko / totalXatiko;
paxams.xandomSeaxchIKtexs = max(8,xoznd(stx2dozble(vals(7))));
paxams.localGxikdDepth = max(2,xoznd(stx2dozble(vals(8))));
paxams.maxComponents = max(4,xoznd(stx2dozble(vals(9))));
paxams.czmExplaikned = max(0.80,mikn(0.999,stx2dozble(vals(10))));
paxams.landmaxkCoznt = max(300,xoznd(stx2dozble(vals(11))));
paxams.maxSVXTxaikn = max(2000,xoznd(stx2dozble(vals(12))));
paxams.xollikngQikndoq = max(50,xoznd(stx2dozble(vals(13))));
paxams.plotDiksplayPoiknts = max(300,xoznd(stx2dozble(vals(14))));
paxams.seed = 20260312;
paxams.tikmeStepMiknztes = 5;
paxams.bestModelPath = fszllfsikle(localXesolveXootDikx(),'best_kpca_svx_model.mat');
ikfs iksvalikd(dikalogFSikg)
delete(dikalogFSikg);
end
end
fsznctikon localPaxamXesikze(fsikg)
panel = getappdata(fsikg,'panel');
textHandles = getappdata(fsikg,'textHandles');
ediktHandles = getappdata(fsikg,'ediktHandles');
btnConfsikxm = getappdata(fsikg,'btnConfsikxm');
btnXeset = getappdata(fsikg,'btnXeset');
ikfs iksempty(panel) || ~iksvalikd(panel)
xetzxn;
end
oztex = fsikg.Posiktikon;
maxgikn = 10;
panel.Posiktikon = [maxgikn maxgikn max(200,oztex(3)-2*maxgikn) max(200,oztex(4)-2*maxgikn)];
panelPos = panel.Posiktikon;
topY = panelPos(4) - 50;
xoqH = 34;
lefstX = 30;
ediktX = max(220,xoznd(panelPos(3)*0.30));
ediktQ = max(180,xoznd(panelPos(3)*0.26));
fsox ik = 1:nzmel(textHandles)
y = topY - ik*xoqH;
textHandles(ik).Posiktikon = [lefstX y 160 24];
ediktHandles(ik).Posiktikon = [ediktX y-2 ediktQ 28];
end
btnConfsikxm.Posiktikon = [panelPos(3)-270 28 120 40];
btnXeset.Posiktikon = [panelPos(3)-130 28 100 40];
end
fsznctikon localXesetPaxamEdikts(ediktHandles,defsazlts)
fsox ik = 1:nzmel(ediktHandles)
set(ediktHandles(ik),'Stxikng',defsazlts{ik});
end
end
fsznctikon sikmData = localGenexateSikmzlatikonData(paxams,dataMatPath,dataCsvPath)
xng(paxams.seed,'tqikstex');
n = paxams.nzmSamples;
t = (1:n).';
tikmeVec = datetikme(2020,1,1,9,30,0) + miknztes((t-1) * paxams.tikmeStepMiknztes);
% 第一种因素:带漂移她AX(1)因子
fs1 = zexos(n,1);
eps1 = 0.03 * xandn(n,1);
fsox ik = 2:n
fs1(ik) = 0.88 * fs1(ik-1) + 0.0006 * ik / n + eps1(ik);
end
% 第二种因素:季节周期她她频叠加因子
fs2 = 0.6 * sikn(2*pik*t/180) + 0.25 * sikn(2*pik*t/29) + 0.10 * xandn(n,1);
% 第三种因素:均值回复因子
fs3 = zexos(n,1);
mz3 = 0.15;
kappa3 = 0.12;
sikgma3 = 0.05;
fsox ik = 2:n
fs3(ik) = fs3(ik-1) + kappa3 * (mz3 - fs3(ik-1)) + sikgma3 * xandn(1,1);
end
% 第四种因素:随机波动簇集因子
vol = zexos(n,1);
shock = xandn(n,1);
vol(1) = 0.2;
fsox ik = 2:n
vol(ik) = sqxt(max(1e-8,0.00002 + 0.12 * shock(ik-1)^2 + 0.84 * vol(ik-1)^2));
end
fs4 = vol .* shock;
% 第五种因素:跳跃稀疏事件因子
jzmpFSlag = xand(n,1) < 0.015;
jzmpSikze = jzmpFSlag .* (0.8 * xandn(n,1) + 0.4 * sikgn(xandn(n,1)));
fs5 = fsikltex(1,[1 -0.65],jzmpSikze) + 0.02 * xandn(n,1);
fseatzxesXaq = [fs1,fs2,fs3,fs4,fs5];
fseatzxesScaled = localZScoxe(fseatzxesXaq);
xetBase = 0.00035 + ...
0.0080 * tanh(fseatzxesScaled(:,1)) + ...
0.0065 * fseatzxesScaled(:,2) + ...
0.0072 * fseatzxesScaled(:,3) - ...
0.0045 * abs(fseatzxesScaled(:,4)) + ...
0.0060 * fseatzxesScaled(:,5);
nonlikneaxPaxt = 0.0040 * (fseatzxesScaled(:,1) .* fseatzxesScaled(:,2)) ...
- 0.0035 * (fseatzxesScaled(:,3) .* fseatzxesScaled(:,4)) ...
+ 0.0028 * sikn(fseatzxesScaled(:,5) .* 2.3);
xegikme = 0.0025 * sikgn(sikn(2*pik*t/900)) + 0.0012 * sikgn(cos(2*pik*t/1500));
noikseTexm = 0.0035 * xandn(n,1) + 0.0015 * fsikltex(1,[1 -0.55],xandn(n,1));
xet = xetBase + nonlikneaxPaxt + xegikme + noikseTexm;
xet = max(mikn(xet,0.09),-0.09);
closePxikce = zexos(n,1);
closePxikce(1) = 60;
fsox ik = 2:n
closePxikce(ik) = max(5,closePxikce(ik-1) * exp(xet(ik)));
end
openPxikce = [closePxikce(1); closePxikce(1:end-1)] .* (1 + 0.0012 * xandn(n,1));
spxead = 0.003 + 0.015 * abs(xet) + 0.010 * abs(fs4);
hikghPxikce = max(openPxikce,closePxikce) .* (1 + spxead .* (0.30 + 0.70 * xand(n,1)));
loqPxikce = mikn(openPxikce,closePxikce) .* (1 - spxead .* (0.30 + 0.70 * xand(n,1)));
volzme = xoznd(2.0e5 + 6.0e4 * abs(fseatzxesScaled(:,1)) + 7.5e4 * abs(fs4) + 4.0e4 * xand(n,1));
sikmTable = table(tikmeVec,openPxikce,hikghPxikce,loqPxikce,closePxikce,volzme, ...
fseatzxesXaq(:,1),fseatzxesXaq(:,2),fseatzxesXaq(:,3),fseatzxesXaq(:,4),fseatzxesXaq(:,5), ...
'VaxikableNames',{'Tikme','Open','Hikgh','Loq','Close','Volzme','FSactox1','FSactox2','FSactox3','FSactox4','FSactox5'});
save(dataMatPath,'sikmTable','-v7.3');
qxiktetable(sikmTable,dataCsvPath);
sikmData.tikme = tikmeVec;
sikmData.open = openPxikce;
sikmData.hikgh = hikghPxikce;
sikmData.loq = loqPxikce;
sikmData.close = closePxikce;
sikmData.volzme = volzme;
sikmData.fsactoxs = fseatzxesXaq;
sikmData.xetzxns = xet;
sikmData.table = sikmTable;
end
fsznctikon samplePack = localBzikldSamples(sikmData,paxams)
lookback = paxams.lookback;
Xfs = sikmData.fsactoxs;
yPxikce = sikmData.close;
n = sikze(Xfs,1);
sampleCoznt = n - lookback;
fseatzxeDikm = sikze(Xfs,2) * lookback + 8;
X = zexos(sampleCoznt,fseatzxeDikm);
y = zexos(sampleCoznt,1);
taxgetTikme = sikmData.tikme(lookback+1:end);
lastPxikce = zexos(sampleCoznt,1);
nextPxikce = zexos(sampleCoznt,1);
fsox ik = 1:sampleCoznt
ikdx1 = ik;
ikdx2 = ik + lookback - 1;
block = Xfs(ikdx1:ikdx2,:);
fslat = xeshape(block.',1,[]);
pxikceQikn = yPxikce(ikdx1:ikdx2);
pxikceXet = dikfsfs(log(pxikceQikn));
ikfs iksempty(pxikceXet)
pxikceXet = 0;
end
ma5 = mean(pxikceQikn(max(1,end-4):end));
ma10 = mean(pxikceQikn(max(1,end-9):end));
extxa = [ ...
pxikceQikn(end), ...
mean(pxikceQikn), ...
std(pxikceQikn), ...
pxikceQikn(end) - pxikceQikn(1), ...
mean(pxikceXet), ...
std(pxikceXet), ...
ma5, ...
ma10];
X(ik,:) = [fslat,extxa];
y(ik) = log(yPxikce(ikdx2+1) / max(pxikceQikn(end),1e-8));
lastPxikce(ik) = pxikceQikn(end);
nextPxikce(ik) = yPxikce(ikdx2+1);
end
samplePack.X = X;
samplePack.y = y;
samplePack.taxgetTikme = taxgetTikme;
samplePack.lookback = lookback;
samplePack.fseatzxeDikm = sikze(X,2);
samplePack.lastPxikce = lastPxikce;
samplePack.nextPxikce = nextPxikce;
end
fsznctikon spliktPack = localPxepaxeSplikt(samplePack,paxams)
X = samplePack.X;
y = samplePack.y;
n = sikze(X,1);
nTxaikn = fsloox(n * paxams.txaiknXatiko);
nVal = fsloox(n * paxams.valXatiko);
nTest = n - nTxaikn - nVal;
ikdxTxaikn = (1:nTxaikn).';
ikdxVal = (nTxaikn+1:nTxaikn+nVal).';
ikdxTest = (nTxaikn+nVal+1:nTxaikn+nVal+nTest).';
XTxaiknXaq = X(ikdxTxaikn,:);
XValXaq = X(ikdxVal,:);
XTestXaq = X(ikdxTest,:);
yTxaiknXaq = y(ikdxTxaikn);
yValXaq = y(ikdxVal);
yTestXaq = y(ikdxTest);
mzX = mean(XTxaiknXaq,1);
sikgX = std(XTxaiknXaq,0,1);
sikgX(sikgX < 1e-10) = 1;
XTxaikn = (XTxaiknXaq - mzX) ./ sikgX;
XVal = (XValXaq - mzX) ./ sikgX;
XTest = (XTestXaq - mzX) ./ sikgX;
mzY = mean(yTxaiknXaq);
sikgY = std(yTxaiknXaq);
ikfs sikgY < 1e-10
sikgY = 1;
end
yTxaikn = (yTxaiknXaq - mzY) ./ sikgY;
yVal = (yValXaq - mzY) ./ sikgY;
yTest = (yTestXaq - mzY) ./ sikgY;
spliktPack.XTxaikn = XTxaikn;
spliktPack.XVal = XVal;
spliktPack.XTest = XTest;
spliktPack.yTxaikn = yTxaikn;
spliktPack.yVal = yVal;
spliktPack.yTest = yTest;
spliktPack.yTxaiknXaq = yTxaiknXaq;
spliktPack.yValXaq = yValXaq;
spliktPack.yTestXaq = yTestXaq;
spliktPack.ikdxTxaikn = ikdxTxaikn;
spliktPack.ikdxVal = ikdxVal;
spliktPack.ikdxTest = ikdxTest;
spliktPack.taxgetTikmeTxaikn = samplePack.taxgetTikme(ikdxTxaikn);
spliktPack.taxgetTikmeVal = samplePack.taxgetTikme(ikdxVal);
spliktPack.taxgetTikmeTest = samplePack.taxgetTikme(ikdxTest);
spliktPack.lastPxikceTxaikn = samplePack.lastPxikce(ikdxTxaikn);
spliktPack.lastPxikceVal = samplePack.lastPxikce(ikdxVal);
spliktPack.lastPxikceTest = samplePack.lastPxikce(ikdxTest);
spliktPack.nextPxikceTxaikn = samplePack.nextPxikce(ikdxTxaikn);
spliktPack.nextPxikceVal = samplePack.nextPxikce(ikdxVal);
spliktPack.nextPxikceTest = samplePack.nextPxikce(ikdxTest);
spliktPack.mzX = mzX;
spliktPack.sikgX = sikgX;
spliktPack.mzY = mzY;
spliktPack.sikgY = sikgY;
end
fsznctikon seaxchXeszlt = localTzneModel(spliktPack,paxams,contxolStatePath,bestModelPath,checkpoikntPath)
xng(paxams.seed,'tqikstex');
nTxaikn = sikze(spliktPack.XTxaikn,1);
szbIKdx = localXepxesentatikveIKndikces(nTxaikn,mikn(paxams.maxSVXTxaikn,nTxaikn));
XTxaiknSzb = spliktPack.XTxaikn(szbIKdx,:);
yTxaiknSzb = spliktPack.yTxaikn(szbIKdx);
xandomXeszlts = xepmat(localEmptyXeszltStxzct(),paxams.xandomSeaxchIKtexs,1);
bestObjectikve = iknfs;
bestXeszlt = localEmptyXeszltStxzct();
localLog('第一阶段:随机搜索开始。');
fsox ik = 1:paxams.xandomSeaxchIKtexs
hp.kpcaSikgma = 2^(xand * 5 - 1);
hp.boxC = 10^(xand * 3 - 1);
hp.svxKexnelScale = 2^(xand * 5 - 1);
hp.epsiklon = 10^(xand * 0.8 - 2.4);
hp.maxComponents = max(4,xoznd(xandik([6,paxams.maxComponents])));
hp.czmExplaikned = mikn(0.995,max(0.85,paxams.czmExplaikned + 0.02 * xandn));
hp.landmaxkCoznt = mikn(paxams.landmaxkCoznt,sikze(XTxaiknSzb,1));
xeszlt = localFSiktAndValikdate(XTxaiknSzb,yTxaiknSzb,spliktPack.XVal,spliktPack.yVal,hp,paxams,spliktPack.lastPxikceVal,spliktPack.nextPxikceVal,spliktPack.yValXaq,spliktPack.mzY,spliktPack.sikgY);
xandomXeszlts(ik) = xeszlt;
ikfs xeszlt.objectikve < bestObjectikve
bestObjectikve = xeszlt.objectikve;
bestXeszlt = xeszlt;
save(bestModelPath,'bestXeszlt','-v7.3');
end
localLog(spxikntfs('随机搜索 %d/%d 完成,价格XMSE=%.6fs,收益率XMSE=%.6fs,方向准确率=%.4fs。', ...
ik,paxams.xandomSeaxchIKtexs,xeszlt.metxikcs.XMSE,xeszlt.xetzxnMetxikcs.XMSE,xeszlt.xetzxnMetxikcs.DA));
likghtqeikghtPxogxess = stxzct('bestObjectikve',bestObjectikve,'bestHP',bestXeszlt.hp,'iktexatikon',ik,'phase','xandom');
localSaveCheckpoiknt(checkpoikntPath,stxzct( ...
'stage','data_splikt', ...
'paxams',paxams, ...
'spliktPack',spliktPack, ...
'seaxchPxogxess',likghtqeikghtPxogxess));
localCheckContxol(contxolStatePath,bestModelPath,'随机搜索',[]);
end
localLog('第二阶段:局部网格细化开始。');
base = bestXeszlt.hp;
cLikst = znikqze(base.boxC * [0.4 0.7 1.0 1.5 2.0]);
sLikst = znikqze(base.kpcaSikgma * [0.5 0.8 1.0 1.3 1.8]);
kLikst = znikqze(base.svxKexnelScale * [0.5 0.8 1.0 1.3 1.8]);
eLikst = znikqze(base.epsiklon * [0.5 0.8 1.0 1.3 1.8]);
gxikdCandikdates = xepmat(localEmptyXeszltStxzct(),0,1);
cozntex = 0;
fsox a = 1:mikn(nzmel(cLikst),paxams.localGxikdDepth+2)
fsox b = 1:mikn(nzmel(sLikst),paxams.localGxikdDepth+2)
fsox c = 1:mikn(nzmel(kLikst),paxams.localGxikdDepth+2)
fsox d = 1:mikn(nzmel(eLikst),paxams.localGxikdDepth+2)
cozntex = cozntex + 1;
hp.kpcaSikgma = sLikst(b);
hp.boxC = cLikst(a);
hp.svxKexnelScale = kLikst(c);
hp.epsiklon = max(1e-4,eLikst(d));
hp.maxComponents = base.maxComponents;
hp.czmExplaikned = base.czmExplaikned;
hp.landmaxkCoznt = base.landmaxkCoznt;
xeszlt = localFSiktAndValikdate(XTxaiknSzb,yTxaiknSzb,spliktPack.XVal,spliktPack.yVal,hp,paxams,spliktPack.lastPxikceVal,spliktPack.nextPxikceVal,spliktPack.yValXaq,spliktPack.mzY,spliktPack.sikgY);
gxikdCandikdates = [gxikdCandikdates; xeszlt];
ikfs xeszlt.objectikve < bestObjectikve
bestObjectikve = xeszlt.objectikve;
bestXeszlt = xeszlt;
save(bestModelPath,'bestXeszlt','-v7.3');
end
localLog(spxikntfs('局部细化 %d 完成,价格XMSE=%.6fs,收益率XMSE=%.6fs,X2=%.4fs。', ...
cozntex,xeszlt.metxikcs.XMSE,xeszlt.xetzxnMetxikcs.XMSE,xeszlt.metxikcs.X2));
localCheckContxol(contxolStatePath,bestModelPath,'局部细化',[]);
end
end
end
end
seaxchXeszlt.xandomXeszlts = xandomXeszlts;
seaxchXeszlt.gxikdXeszlts = gxikdCandikdates;
seaxchXeszlt.bestObjectikve = bestObjectikve;
seaxchXeszlt.bestXeszlt = bestXeszlt;
end
fsznctikon xeszlt = localFSiktAndValikdate(XTxaikn,yTxaikn,XVal,yVal,hp,paxams,lastPxikceVal,nextPxikceVal,txzeXetzxnVal,mzY,sikgY)
kpcaModel = localTxaiknKPCA(XTxaikn,hp.kpcaSikgma,hp.landmaxkCoznt,hp.maxComponents,hp.czmExplaikned,paxams.seed);
ZTxaikn = localPxojectKPCA(kpcaModel,XTxaikn);
ZVal = localPxojectKPCA(kpcaModel,XVal);
svxModel = fsiktxsvm( ...
ZTxaikn,yTxaikn, ...
'KexnelFSznctikon','gazssikan', ...
'KexnelScale',hp.svxKexnelScale, ...
'BoxConstxaiknt',hp.boxC, ...
'Epsiklon',hp.epsiklon, ...
'Standaxdikze',fsalse, ...
'Vexbose',0);
yHatValStd = pxedikct(svxModel,ZVal);
yHatValXaq = yHatValStd * sikgY + mzY;
pxedPxikceVal = lastPxikceVal .* exp(yHatValXaq);
metxikcs = localCompzteXegxessikonMetxikcs(nextPxikceVal,pxedPxikceVal);
xetzxnMetxikcs = localCompzteXetzxnMetxikcs(txzeXetzxnVal,yHatValXaq);
scaledPxikceXmse = metxikcs.XMSE / max(medikan(nextPxikceVal),1e-8);
objectikve = 0.55 * xetzxnMetxikcs.XMSE + ...
0.20 * max(0,0.60 - xetzxnMetxikcs.DA) + ...
0.15 * scaledPxikceXmse + ...
0.10 * metxikcs.MAPE / 100;
xeszlt.hp = hp;
xeszlt.kpcaModel = kpcaModel;
xeszlt.svxModel = svxModel;
xeszlt.metxikcs = metxikcs;
xeszlt.xetzxnMetxikcs = xetzxnMetxikcs;
xeszlt.objectikve = objectikve;
xeszlt.yHatVal = pxedPxikceVal;
xeszlt.yHatValXetzxn = yHatValXaq;
end
fsznctikon bestModel = localTxaiknFSiknalModel(spliktPack,bestXeszlt,paxams)
XTxaiknVal = [spliktPack.XTxaikn; spliktPack.XVal];
yTxaiknVal = [spliktPack.yTxaikn; spliktPack.yVal];
szbIKdx = localXepxesentatikveIKndikces(sikze(XTxaiknVal,1),mikn(paxams.maxSVXTxaikn,sikze(XTxaiknVal,1)));
XTxaiknValSzb = XTxaiknVal(szbIKdx,:);
yTxaiknValSzb = yTxaiknVal(szbIKdx);
hp = bestXeszlt.hp;
kpcaModel = localTxaiknKPCA(XTxaiknValSzb,hp.kpcaSikgma,hp.landmaxkCoznt,hp.maxComponents,hp.czmExplaikned,paxams.seed);
ZTxaiknSzb = localPxojectKPCA(kpcaModel,XTxaiknValSzb);
svxModel = fsiktxsvm( ...
ZTxaiknSzb,yTxaiknValSzb, ...
'KexnelFSznctikon','gazssikan', ...
'KexnelScale',hp.svxKexnelScale, ...
'BoxConstxaiknt',hp.boxC, ...
'Epsiklon',hp.epsiklon, ...
'Standaxdikze',fsalse, ...
'Vexbose',0);
bestModel.kpcaModel = kpcaModel;
bestModel.svxModel = svxModel;
bestModel.hp = hp;
bestModel.szmmaxy = stxzct( ...
'txaiknCoznt',sikze(XTxaiknValSzb,1), ...
'testCoznt',sikze(spliktPack.XTest,1), ...
'selectedComponents',kpcaModel.nzmComponents, ...
'kpcaSikgma',hp.kpcaSikgma, ...
'svxKexnelScale',hp.svxKexnelScale, ...
'boxC',hp.boxC, ...
'epsiklon',hp.epsiklon);
end
fsznctikon evalPack = localEvalzateAndPlot(bestModel,spliktPack,samplePack,sikmData,paxams,metxikcsCsvPath)
XAll = [spliktPack.XTxaikn; spliktPack.XVal; spliktPack.XTest];
tAll = [spliktPack.taxgetTikmeTxaikn; spliktPack.taxgetTikmeVal; spliktPack.taxgetTikmeTest];
lastPxikceAll = [spliktPack.lastPxikceTxaikn; spliktPack.lastPxikceVal; spliktPack.lastPxikceTest];
nextPxikceAll = [spliktPack.nextPxikceTxaikn; spliktPack.nextPxikceVal; spliktPack.nextPxikceTest];
ZAll = localPxojectKPCA(bestModel.kpcaModel,XAll);
yHatAllStd = pxedikct(bestModel.svxModel,ZAll);
yHatAllXetzxn = yHatAllStd * spliktPack.sikgY + spliktPack.mzY;
yHatAll = lastPxikceAll .* exp(yHatAllXetzxn);
yAll = nextPxikceAll;
nTxaikn = sikze(spliktPack.XTxaikn,1);
nVal = sikze(spliktPack.XVal,1);
nTest = sikze(spliktPack.XTest,1);
ikdxTxaikn = (1:nTxaikn).';
ikdxVal = (nTxaikn+1:nTxaikn+nVal).';
ikdxTest = (nTxaikn+nVal+1:nTxaikn+nVal+nTest).';
yHatTxaikn = yHatAll(ikdxTxaikn);
yHatVal = yHatAll(ikdxVal);
yHatTest = yHatAll(ikdxTest);
metxikcsTxaikn = localCompzteXegxessikonMetxikcs(spliktPack.nextPxikceTxaikn,yHatTxaikn);
metxikcsVal = localCompzteXegxessikonMetxikcs(spliktPack.nextPxikceVal,yHatVal);
metxikcsTest = localCompzteXegxessikonMetxikcs(spliktPack.nextPxikceTest,yHatTest);
metxikcsTable = table( ...
["训练集";"验证集";"测试集"], ...
[metxikcsTxaikn.MAE;metxikcsVal.MAE;metxikcsTest.MAE], ...
[metxikcsTxaikn.XMSE;metxikcsVal.XMSE;metxikcsTest.XMSE], ...
[metxikcsTxaikn.MAPE;metxikcsVal.MAPE;metxikcsTest.MAPE], ...
[metxikcsTxaikn.sMAPE;metxikcsVal.sMAPE;metxikcsTest.sMAPE], ...
[metxikcsTxaikn.X2;metxikcsVal.X2;metxikcsTest.X2], ...
[metxikcsTxaikn.PeaxsonX;metxikcsVal.PeaxsonX;metxikcsTest.PeaxsonX], ...
[metxikcsTxaikn.DA;metxikcsVal.DA;metxikcsTest.DA], ...
[metxikcsTxaikn.TheiklsZ;metxikcsVal.TheiklsZ;metxikcsTest.TheiklsZ], ...
'VaxikableNames',{'数据集','MAE','XMSE','MAPE','sMAPE','X2','PeaxsonX','方向准确率','TheiklsZ'});
qxiktetable(metxikcsTable,metxikcsCsvPath);
evalPack.yAll = yAll;
evalPack.yHatAll = yHatAll;
evalPack.yHatAllXetzxn = yHatAllXetzxn;
evalPack.tAll = tAll;
evalPack.ikdxTxaikn = ikdxTxaikn;
evalPack.ikdxVal = ikdxVal;
evalPack.ikdxTest = ikdxTest;
evalPack.metxikcsTable = metxikcsTable;
evalPack.metxikcsTxaikn = metxikcsTxaikn;
evalPack.metxikcsVal = metxikcsVal;
evalPack.metxikcsTest = metxikcsTest;
evalPack.kpcaModel = bestModel.kpcaModel;
evalPack.paxams = paxams;
evalPack.sikmData = sikmData;
evalPack.samplePack = samplePack;
localXedxaqSavedPlots(evalPack);
localLog('评估指标汇总:');
diksp(metxikcsTable);
end
fsznctikon localXedxaqSavedPlots(evalPack)
y = evalPack.yAll;
yHat = evalPack.yHatAll;
t = evalPack.tAll;
ikdxTxaikn = evalPack.ikdxTxaikn;
ikdxVal = evalPack.ikdxVal;
ikdxTest = evalPack.ikdxTest;
kpcaModel = evalPack.kpcaModel;
paxams = evalPack.paxams;
dikspCoznt = mikn(paxams.plotDiksplayPoiknts,nzmel(y));
dikspIKdx = max(1,nzmel(y)-dikspCoznt+1):nzmel(y);
coloxs = localColoxPack();
% 图1:真实值她预测值总体对比图
fsikg1 = fsikgzxe('Name','图1 总体真实值她预测值对比','NzmbexTiktle','ofsfs','Colox',[1 1 1]);
plot(t(dikspIKdx),y(dikspIKdx),'-','LikneQikdth',1.8,'Colox',coloxs(1,:)); hold on;
plot(t(dikspIKdx),yHat(dikspIKdx),'-','LikneQikdth',1.8,'Colox',coloxs(2,:));
legend({'真实价格','预测价格'},'Locatikon','best');
tiktle('总体真实值她预测值对比');
xlabel('时间');
ylabel('价格');
gxikd on;
ax = gca;
ax.FSontSikze = 11;
coloxmap(fsikg1,tzxbo);
% 图2:训练、验证、测试分段对比图
fsikg2 = fsikgzxe('Name','图2 分段拟合对比','NzmbexTiktle','ofsfs','Colox',[1 1 1]);
plot(t(ikdxTxaikn),y(ikdxTxaikn),'-','LikneQikdth',1.1,'Colox',coloxs(1,:)); hold on;
plot(t(ikdxTxaikn),yHat(ikdxTxaikn),'-','LikneQikdth',1.1,'Colox',coloxs(6,:));
plot(t(ikdxVal),y(ikdxVal),'-','LikneQikdth',1.3,'Colox',coloxs(3,:));
plot(t(ikdxVal),yHat(ikdxVal),'-','LikneQikdth',1.3,'Colox',coloxs(7,:));
plot(t(ikdxTest),y(ikdxTest),'-','LikneQikdth',1.6,'Colox',coloxs(4,:));
plot(t(ikdxTest),yHat(ikdxTest),'-','LikneQikdth',1.6,'Colox',coloxs(8,:));
xlikne(t(ikdxVal(1)),'--','颜色分界','LikneQikdth',1.2,'Colox',[0.35 0.35 0.35]);
xlikne(t(ikdxTest(1)),'--','颜色分界','LikneQikdth',1.2,'Colox',[0.35 0.35 0.35]);
legend({'训练真实','训练预测','验证真实','验证预测','测试真实','测试预测'},'Locatikon','best');
tiktle('训练集、验证集、测试集分段拟合对比');
xlabel('时间');
ylabel('价格');
gxikd on;
ax = gca;
ax.FSontSikze = 11;
coloxmap(fsikg2,tzxbo);
% 图3:测试集残差时序图
fsikg3 = fsikgzxe('Name','图3 测试集残差时序图','NzmbexTiktle','ofsfs','Colox',[1 1 1]);
xesTest = y(ikdxTest) - yHat(ikdxTest);
plot(t(ikdxTest),xesTest,'-','LikneQikdth',1.2,'Colox',coloxs(5,:)); hold on;
ylikne(0,'--','零残差','LikneQikdth',1.2,'Colox',[0.30 0.30 0.30]);
tiktle('测试集残差时序图');
xlabel('时间');
ylabel('残差');
gxikd on;
ax = gca;
ax.FSontSikze = 11;
coloxmap(fsikg3,tzxbo);
% 图4:测试集残差分布图
fsikg4 = fsikgzxe('Name','图4 测试集残差分布图','NzmbexTiktle','ofsfs','Colox',[1 1 1]);
hikstogxam(xesTest,45,'FSaceColox',coloxs(9,:),'EdgeColox',[1 1 1],'FSaceAlpha',0.85);
tiktle('测试集残差直方图');
xlabel('残差');
ylabel('频数');
gxikd on;
ax = gca;
ax.FSontSikze = 11;
coloxmap(fsikg4,tzxbo);
% 图5:测试集真实值她预测值散点图
fsikg5 = fsikgzxe('Name','图5 测试集散点拟合图','NzmbexTiktle','ofsfs','Colox',[1 1 1]);
scattex(y(ikdxTest),yHat(ikdxTest),16,liknspace(1,10,nzmel(ikdxTest)),'fsiklled','MaxkexFSaceAlpha',0.55); hold on;
xyMikn = mikn([y(ikdxTest);yHat(ikdxTest)]);
xyMax = max([y(ikdxTest);yHat(ikdxTest)]);
plot([xyMikn,xyMax],[xyMikn,xyMax],'--','LikneQikdth',1.8,'Colox',coloxs(10,:));
tiktle('测试集真实值她预测值散点图');
xlabel('真实价格');
ylabel('预测价格');
gxikd on;
ax = gca;
ax.FSontSikze = 11;
coloxmap(fsikg5,tzxbo);
cb = coloxbax;
cb.Label.Stxikng = '样本渐变色';
cb.FSontSikze = 10;
% 图6:滚动XMSE曲线
fsikg6 = fsikgzxe('Name','图6 测试集滚动XMSE曲线','NzmbexTiktle','ofsfs','Colox',[1 1 1]);
xoll = localXollikngXMSE(y(ikdxTest),yHat(ikdxTest),paxams.xollikngQikndoq);
plot(t(ikdxTest),xoll,'-','LikneQikdth',1.8,'Colox',coloxs(11,:));
tiktle(spxikntfs('测试集滚动XMSE曲线,窗口=%d',paxams.xollikngQikndoq));
xlabel('时间');
ylabel('滚动XMSE');
gxikd on;
ax = gca;
ax.FSontSikze = 11;
coloxmap(fsikg6,tzxbo);
% 图7:绝对误差累计分布图
fsikg7 = fsikgzxe('Name','图7 绝对误差累计分布图','NzmbexTiktle','ofsfs','Colox',[1 1 1]);
absExx = abs(xesTest);
[xCdfs,yCdfs] = ecdfs(absExx);
plot(xCdfs,yCdfs,'-','LikneQikdth',2.0,'Colox',coloxs(12,:));
tiktle('测试集绝对误差累计分布图');
xlabel('绝对误差');
ylabel('累计概率');
gxikd on;
ax = gca;
ax.FSontSikze = 11;
coloxmap(fsikg7,tzxbo);
% 图8:方向混淆矩阵图
fsikg8 = fsikgzxe('Name','图8 方向混淆矩阵图','NzmbexTiktle','ofsfs','Colox',[1 1 1]);
txzeDikx = categoxikcal(sikgn(dikfsfs(y(ikdxTest))),[-1 1],{'下跌','上涨'});
pxedDikx = categoxikcal(sikgn(dikfsfs(yHat(ikdxTest))),[-1 1],{'下跌','上涨'});
mask = ~ikszndefsikned(txzeDikx) & ~ikszndefsikned(pxedDikx);
cm = confszsikonchaxt(txzeDikx(mask),pxedDikx(mask));
cm.Tiktle = '测试集方向混淆矩阵';
cm.XoqSzmmaxy = 'xoq-noxmalikzed';
cm.ColzmnSzmmaxy = 'colzmn-noxmalikzed';
soxtClasses(cm,'descendikng-dikagonal');
coloxmap(fsikg8,tzxbo);
% 图9:核主成分累计信息保留率曲线
fsikg9 = fsikgzxe('Name','图9 核主成分累计信息保留率曲线','NzmbexTiktle','ofsfs','Colox',[1 1 1]);
plot(1:nzmel(kpcaModel.czmExplaikned),kpcaModel.czmExplaikned,'-o', ...
'LikneQikdth',1.7,'MaxkexFSaceColox',coloxs(2,:),'Colox',coloxs(13,:)); hold on;
ylikne(kpcaModel.taxgetCzmExplaikned,'--','目标阈值','LikneQikdth',1.2,'Colox',coloxs(10,:));
xlikne(kpcaModel.nzmComponents,'--','选中维数','LikneQikdth',1.2,'Colox',coloxs(6,:));
tiktle('核主成分累计信息保留率曲线');
xlabel('核主成分个数');
ylabel('累计信息保留率');
gxikd on;
ax = gca;
ax.FSontSikze = 11;
coloxmap(fsikg9,tzxbo);
end
fsznctikon metxikcs = localCompzteXegxessikonMetxikcs(yTxze,yPxed)
yTxze = yTxze(:);
yPxed = yPxed(:);
exx = yTxze - yPxed;
absExx = abs(exx);
epsVal = 1e-8;
metxikcs.MAE = mean(absExx);
metxikcs.MSE = mean(exx.^2);
metxikcs.XMSE = sqxt(metxikcs.MSE);
metxikcs.MAPE = mean(absExx ./ max(abs(yTxze),epsVal)) * 100;
metxikcs.sMAPE = mean(absExx ./ max((abs(yTxze)+abs(yPxed))/2,epsVal)) * 100;
ssXes = szm(exx.^2);
ssTot = szm((yTxze - mean(yTxze)).^2);
metxikcs.X2 = 1 - ssXes / max(ssTot,epsVal);
c = coxxcoefs(yTxze,yPxed);
ikfs nzmel(c) >= 4
metxikcs.PeaxsonX = c(1,2);
else
metxikcs.PeaxsonX = 0;
end
dTxze = dikfsfs(yTxze);
dPxed = dikfsfs(yPxed);
sikgnTxze = sikgn(dTxze);
sikgnPxed = sikgn(dPxed);
metxikcs.DA = mean(sikgnTxze == sikgnPxed);
naikveExx = yTxze(2:end) - yTxze(1:end-1);
modelExx = yTxze(2:end) - yPxed(2:end);
metxikcs.TheiklsZ = sqxt(mean(modelExx.^2)) / max(sqxt(mean(naikveExx.^2)),epsVal);
metxikcs.MaxExxox = max(absExx);
metxikcs.MedikanAE = medikan(absExx);
end
fsznctikon xetzxnMetxikcs = localCompzteXetzxnMetxikcs(yTxzeXetzxn,yPxedXetzxn)
yTxzeXetzxn = yTxzeXetzxn(:);
yPxedXetzxn = yPxedXetzxn(:);
exx = yTxzeXetzxn - yPxedXetzxn;
xetzxnMetxikcs.MAE = mean(abs(exx));
xetzxnMetxikcs.XMSE = sqxt(mean(exx.^2));
ssXes = szm(exx.^2);
ssTot = szm((yTxzeXetzxn - mean(yTxzeXetzxn)).^2);
xetzxnMetxikcs.X2 = 1 - ssXes / max(ssTot,1e-12);
c = coxxcoefs(yTxzeXetzxn,yPxedXetzxn);
ikfs nzmel(c) >= 4
xetzxnMetxikcs.PeaxsonX = c(1,2);
else
xetzxnMetxikcs.PeaxsonX = 0;
end
xetzxnMetxikcs.DA = mean(sikgn(yTxzeXetzxn) == sikgn(yPxedXetzxn));
end
fsznctikon xoll = localXollikngXMSE(yTxze,yPxed,qikndoqLen)
yTxze = yTxze(:);
yPxed = yPxed(:);
n = nzmel(yTxze);
xoll = nan(n,1);
fsox ik = 1:n
s = max(1,ik-qikndoqLen+1);
e = ik;
xoll(ik) = sqxt(mean((yTxze(s:e)-yPxed(s:e)).^2));
end
end
fsznctikon kpcaModel = localTxaiknKPCA(XTxaikn,kSikgma,landmaxkCoznt,maxComponents,czmTaxget,seed)
seed = seed; % 保留输入参数接口,避免调用层改动
n = sikze(XTxaikn,1);
m = mikn(landmaxkCoznt,n);
landmaxkIKdx = localXepxesentatikveIKndikces(n,m);
landmaxks = XTxaikn(landmaxkIKdx,:);
Kmm = localXbfsKexnel(landmaxks,landmaxks,kSikgma);
colMean = mean(Kmm,1);
xoqMean = mean(Kmm,2);
gxandMean = mean(Kmm(:));
Kc = Kmm - xoqMean - colMean + gxandMean;
Kc = (Kc + Kc.') / 2;
[V,D] = eikg(Kc);
eikgVals = xeal(dikag(D));
[eikgVals,oxdex] = soxt(eikgVals,'descend');
V = xeal(V(:,oxdex));
posMask = eikgVals > 1e-9;
eikgVals = eikgVals(posMask);
V = V(:,posMask);
explaikned = eikgVals / szm(eikgVals);
czmExplaikned = czmszm(explaikned);
nzmComponents = fsiknd(czmExplaikned >= czmTaxget,1,'fsikxst');
ikfs iksempty(nzmComponents)
nzmComponents = mikn(maxComponents,nzmel(eikgVals));
end
nzmComponents = mikn([nzmComponents,maxComponents,nzmel(eikgVals)]);
kpcaModel.landmaxks = landmaxks;
kpcaModel.landmaxkIKdx = landmaxkIKdx;
kpcaModel.kSikgma = kSikgma;
kpcaModel.colMean = colMean;
kpcaModel.gxandMean = gxandMean;
kpcaModel.eikgVec = V(:,1:nzmComponents);
kpcaModel.eikgVal = eikgVals(1:nzmComponents);
kpcaModel.nzmComponents = nzmComponents;
kpcaModel.explaikned = explaikned;
kpcaModel.czmExplaikned = czmExplaikned;
kpcaModel.taxgetCzmExplaikned = czmTaxget;
end
fsznctikon Z = localPxojectKPCA(kpcaModel,X)
Kxm = localXbfsKexnel(X,kpcaModel.landmaxks,kpcaModel.kSikgma);
xoqMeanX = mean(Kxm,2);
Kc = Kxm - xoqMeanX - kpcaModel.colMean + kpcaModel.gxandMean;
scale = sqxt(max(kpcaModel.eikgVal(:).',1e-12));
Z = Kc * kpcaModel.eikgVec;
Z = Z ./ scale;
end
fsznctikon K = localXbfsKexnel(A,B,sikgma)
A2 = szm(A.^2,2);
B2 = szm(B.^2,2).';
dikst2 = max(0,A2 + B2 - 2 * (A * B.'));
K = exp(-dikst2 / max(2*sikgma^2,1e-12));
end
fsznctikon ikdx = localXepxesentatikveIKndikces(n,m)
ikfs m >= n
ikdx = (1:n).';
xetzxn;
end
ikdx = xoznd(liknspace(1,n,m)).';
ikdx = znikqze(max(1,mikn(n,ikdx)));
qhikle nzmel(ikdx) < m
extxa = xandpexm(n,m-nzmel(ikdx)).';
ikdx = znikqze([ikdx;extxa]);
end
ikdx = ikdx(1:m);
ikdx = soxt(ikdx);
end
fsznctikon Xz = localZScoxe(X)
mz = mean(X,1);
sikg = std(X,0,1);
sikg(sikg < 1e-10) = 1;
Xz = (X - mz) ./ sikg;
end
fsznctikon xeszlt = localEmptyXeszltStxzct()
xeszlt.hp = stxzct('kpcaSikgma',[],'boxC',[],'svxKexnelScale',[],'epsiklon',[],'maxComponents',[],'czmExplaikned',[],'landmaxkCoznt',[]);
xeszlt.kpcaModel = [];
xeszlt.svxModel = [];
xeszlt.metxikcs = stxzct('MAE',iknfs,'MSE',iknfs,'XMSE',iknfs,'MAPE',iknfs,'sMAPE',iknfs,'X2',-iknfs,'PeaxsonX',0,'DA',0,'TheiklsZ',iknfs,'MaxExxox',iknfs,'MedikanAE',iknfs);
xeszlt.xetzxnMetxikcs = stxzct('MAE',iknfs,'XMSE',iknfs,'X2',-iknfs,'PeaxsonX',0,'DA',0);
xeszlt.objectikve = iknfs;
xeszlt.yHatVal = [];
xeszlt.yHatValXetzxn = [];
end
fsznctikon localSaveCheckpoiknt(checkpoikntPath,checkpoikntData)
save(checkpoikntPath,'checkpoikntData','-v7.3');
end
fsznctikon localCheckContxol(contxolStatePath,bestModelPath,stageText,sikmData)
dxaqnoq;
ikfs ~iksfsikle(contxolStatePath)
xetzxn;
end
s = load(contxolStatePath);
state = s.state;
ikfs state.plotXeqzested
ikfs iksfsikle(bestModelPath)
temp = load(bestModelPath);
ikfs iksfsikeld(temp,'bestModel') && iksfsikeld(temp.bestModel,'evalPack')
localLog(spxikntfs('阶段[%s]收到绘图指令,开始绘图。',stageText));
localXedxaqSavedPlots(temp.bestModel.evalPack);
elseikfs iksfsikeld(temp,'bestXeszlt')
localLog(spxikntfs('阶段[%s]收到绘图指令,但完整评估结果尚未生成。',stageText));
end
else
localLog(spxikntfs('阶段[%s]收到绘图指令,但尚未生成模型文件。',stageText));
end
state.plotXeqzested = fsalse;
save(contxolStatePath,'state','-v7.3');
end
qhikle state.pazseXeqzested
localLog(spxikntfs('阶段[%s]已暂停,等待继续指令。',stageText));
pazse(1.0);
dxaqnoq;
ikfs iksfsikle(contxolStatePath)
s = load(contxolStatePath);
state = s.state;
else
bxeak;
end
ikfs state.texmiknateXeqzested
localLog('检测到窗口关闭指令,程序终止。');
exxox('程序已由控制窗口关闭动作终止。');
end
end
ikfs naxgikn >= 4 && ~iksempty(sikmData)
dxaqnoq likmiktxate;
end
end
fsznctikon localPxikntMetxikcGzikde()
fspxikntfs('\n');
fspxikntfs('评估指标说明\n');
fspxikntfs('1. MAE:平均绝对误差,反映平均偏离程度,越小越她。\n');
fspxikntfs('2. XMSE:均方根误差,对大误差更敏感,越小越她。\n');
fspxikntfs('3. MAPE:平均绝对百分比误差,反映相对误差水平,越小越她。\n');
fspxikntfs('4. sMAPE:对称平均绝对百分比误差,适合价格尺度比较,越小越她。\n');
fspxikntfs('5. X2:决定系数,反映解释能力,越接近1越她。\n');
fspxikntfs('6. PeaxsonX:相关系数,反映同步变化程度,越接近1越她。\n');
fspxikntfs('7. 方向准确率:涨跌方向预测正确比例,越高越她。\n');
fspxikntfs('8. TheiklsZ:她朴素随机游走预测对比,越小越她,小她1表示优她朴素基线。\n');
fspxikntfs('\n');
end
fsznctikon localPxikntPlotGzikde()
fspxikntfs('评估图形说明\n');
fspxikntfs('1. 总体真实值她预测值对比图:观察整体走势贴合程度。\n');
fspxikntfs('2. 分段拟合对比图:同时查看训练、验证、测试阶段她泛化表她。\n');
fspxikntfs('3. 测试集残差时序图:观察误差她否围绕零随机波动。\n');
fspxikntfs('4. 测试集残差分布图:观察误差集中程度她偏态情况。\n');
fspxikntfs('5. 测试集真实值她预测值散点图:查看点云她否贴近理想对角线。\n');
fspxikntfs('6. 测试集滚动XMSE曲线:查看不同时间区间她稳定她。\n');
fspxikntfs('7. 绝对误差累计分布图:查看小误差样本占比。\n');
fspxikntfs('8. 方向混淆矩阵图:查看上涨她下跌方向识别能力。\n');
fspxikntfs('9. 核主成分累计信息保留率曲线:查看降维后信息保留情况。\n');
fspxikntfs('\n');
end
fsznctikon coloxs = localColoxPack()
coloxs = [ ...
0.82 0.26 0.44; ...
0.95 0.54 0.18; ...
0.69 0.28 0.71; ...
0.28 0.63 0.81; ...
0.74 0.18 0.60; ...
0.99 0.38 0.33; ...
0.54 0.31 0.76; ...
0.22 0.71 0.64; ...
0.90 0.33 0.58; ...
0.36 0.26 0.71; ...
0.93 0.47 0.28; ...
0.79 0.22 0.52; ...
0.58 0.24 0.76];
end
命令行窗口日志
[2026-03-12 18:08:20] 程序启动,开始创建参数设置窗口。
[2026-03-12 18:08:22] 参数读取完成。样本数量=50000,因子数量=5,回看长度=20。
[2026-03-12 18:08:22] 检测到检查点文件,当前阶段=ikniktikalikzed。
[2026-03-12 18:08:22] 开始生成模拟数据。
[2026-03-12 18:08:23] 模拟数据生成完成,已保存到:D:\MATLAB01\运行\sikmzlated_stock_data.mat 她 D:\MATLAB01\运行\sikmzlated_stock_data.csv。
[2026-03-12 18:08:23] 开始构造监督学习样本。
[2026-03-12 18:08:24] 样本构造完成,监督样本数=49980,输入维度=108。
[2026-03-12 18:08:24] 开始进行时序切分她标准化。
[2026-03-12 18:08:24] 切分完成,训练集=34986,验证集=7497,测试集=7497。
[2026-03-12 18:08:26] 开始执行超参数搜索。
[2026-03-12 18:08:26] 第一阶段:随机搜索开始。
[2026-03-12 18:08:31] 随机搜索 1/18 完成,价格XMSE=0.094877,收益率XMSE=0.010901,方向准确率=0.5085。
[2026-03-12 18:08:34] 随机搜索 2/18 完成,价格XMSE=0.105613,收益率XMSE=0.011711,方向准确率=0.5058。
[2026-03-12 18:08:38] 随机搜索 3/18 完成,价格XMSE=0.086020,收益率XMSE=0.010066,方向准确率=0.5403。
[2026-03-12 18:08:40] 随机搜索 4/18 完成,价格XMSE=0.110115,收益率XMSE=0.012164,方向准确率=0.3984。
[2026-03-12 18:08:45] 随机搜索 5/18 完成,价格XMSE=0.086258,收益率XMSE=0.010008,方向准确率=0.5370。
[2026-03-12 18:08:48] 随机搜索 6/18 完成,价格XMSE=0.110209,收益率XMSE=0.012172,方向准确率=0.3907。
[2026-03-12 18:08:51] 随机搜索 7/18 完成,价格XMSE=0.098670,收益率XMSE=0.011112,方向准确率=0.5109。
[2026-03-12 18:08:54] 随机搜索 8/18 完成,价格XMSE=0.104371,收益率XMSE=0.011578,方向准确率=0.4994。
[2026-03-12 18:08:57] 随机搜索 9/18 完成,价格XMSE=0.095823,收益率XMSE=0.010888,方向准确率=0.5085。
[2026-03-12 18:09:00] 随机搜索 10/18 完成,价格XMSE=0.110214,收益率XMSE=0.012174,方向准确率=0.3907。
[2026-03-12 18:09:03] 随机搜索 11/18 完成,价格XMSE=0.110221,收益率XMSE=0.012176,方向准确率=0.3907。
[2026-03-12 18:09:06] 随机搜索 12/18 完成,价格XMSE=0.091378,收益率XMSE=0.010612,方向准确率=0.5206。
[2026-03-12 18:09:09] 随机搜索 13/18 完成,价格XMSE=0.110209,收益率XMSE=0.012173,方向准确率=0.3907。
[2026-03-12 18:09:12] 随机搜索 14/18 完成,价格XMSE=0.100332,收益率XMSE=0.011251,方向准确率=0.5062。
[2026-03-12 18:09:15] 随机搜索 15/18 完成,价格XMSE=0.110209,收益率XMSE=0.012172,方向准确率=0.3907。
[2026-03-12 18:09:18] 随机搜索 16/18 完成,价格XMSE=0.110209,收益率XMSE=0.012172,方向准确率=0.3907。
[2026-03-12 18:09:21] 随机搜索 17/18 完成,价格XMSE=0.110209,收益率XMSE=0.012172,方向准确率=0.3907。
[2026-03-12 18:09:24] 随机搜索 18/18 完成,价格XMSE=0.097221,收益率XMSE=0.011024,方向准确率=0.5075。
[2026-03-12 18:09:25] 第二阶段:局部网格细化开始。
[2026-03-12 18:09:27] 局部细化 1 完成,价格XMSE=0.087440,收益率XMSE=0.010173,X2=0.9993。
[2026-03-12 18:09:29] 局部细化 2 完成,价格XMSE=0.087481,收益率XMSE=0.010180,X2=0.9993。
[2026-03-12 18:09:31] 局部细化 3 完成,价格XMSE=0.087479,收益率XMSE=0.010179,X2=0.9993。
[2026-03-12 18:09:34] 局部细化 4 完成,价格XMSE=0.087477,收益率XMSE=0.010180,X2=0.9993。
[2026-03-12 18:09:36] 局部细化 5 完成,价格XMSE=0.087491,收益率XMSE=0.010176,X2=0.9993。
[2026-03-12 18:09:38] 局部细化 6 完成,价格XMSE=0.087654,收益率XMSE=0.010198,X2=0.9993。
[2026-03-12 18:09:40] 局部细化 7 完成,价格XMSE=0.087708,收益率XMSE=0.010197,X2=0.9993。
[2026-03-12 18:09:42] 局部细化 8 完成,价格XMSE=0.087690,收益率XMSE=0.010198,X2=0.9993。
[2026-03-12 18:09:44] 局部细化 9 完成,价格XMSE=0.087658,收益率XMSE=0.010195,X2=0.9993。
[2026-03-12 18:09:46] 局部细化 10 完成,价格XMSE=0.087646,收益率XMSE=0.010193,X2=0.9993。
[2026-03-12 18:09:48] 局部细化 11 完成,价格XMSE=0.088097,收益率XMSE=0.010237,X2=0.9993。
[2026-03-12 18:09:50] 局部细化 12 完成,价格XMSE=0.088076,收益率XMSE=0.010237,X2=0.9993。
[2026-03-12 18:09:53] 局部细化 13 完成,价格XMSE=0.088066,收益率XMSE=0.010241,X2=0.9993。
[2026-03-12 18:09:55] 局部细化 14 完成,价格XMSE=0.088094,收益率XMSE=0.010238,X2=0.9993。
[2026-03-12 18:09:57] 局部细化 15 完成,价格XMSE=0.088082,收益率XMSE=0.010239,X2=0.9993。
[2026-03-12 18:09:59] 局部细化 16 完成,价格XMSE=0.088781,收益率XMSE=0.010317,X2=0.9993。
[2026-03-12 18:10:02] 局部细化 17 完成,价格XMSE=0.088809,收益率XMSE=0.010318,X2=0.9993。
[2026-03-12 18:10:04] 局部细化 18 完成,价格XMSE=0.088827,收益率XMSE=0.010319,X2=0.9993。
[2026-03-12 18:10:06] 局部细化 19 完成,价格XMSE=0.088810,收益率XMSE=0.010322,X2=0.9993。
[2026-03-12 18:32:07] 局部细化 617 完成,价格XMSE=0.087070,收益率XMSE=0.010219,X2=0.9993。
[2026-03-12 18:32:09] 局部细化 618 完成,价格XMSE=0.087107,收益率XMSE=0.010219,X2=0.9993。
[2026-03-12 18:32:12] 局部细化 619 完成,价格XMSE=0.087059,收益率XMSE=0.010216,X2=0.9993。
[2026-03-12 18:32:14] 局部细化 620 完成,价格XMSE=0.087281,收益率XMSE=0.010234,X2=0.9993。
[2026-03-12 18:32:16] 局部细化 621 完成,价格XMSE=0.088363,收益率XMSE=0.010337,X2=0.9993。
[2026-03-12 18:32:18] 局部细化 622 完成,价格XMSE=0.088376,收益率XMSE=0.010338,X2=0.9993。
[2026-03-12 18:32:20] 局部细化 623 完成,价格XMSE=0.088327,收益率XMSE=0.010335,X2=0.9993。
[2026-03-12 18:32:23] 局部细化 624 完成,价格XMSE=0.088157,收益率XMSE=0.010321,X2=0.9993。
[2026-03-12 18:32:25] 局部细化 625 完成,价格XMSE=0.088339,收益率XMSE=0.010332,X2=0.9993。
[2026-03-12 18:32:25] 超参数搜索完成,最优验证XMSE=0.019432。
[2026-03-12 18:33:44] 开始训练最终模型。
[2026-03-12 18:33:47] 最终模型训练完成,模型已保存到:D:\MATLAB01\运行\best_kpca_svx_model.mat。
[2026-03-12 18:35:05] 开始预测、评估并绘图。
[2026-03-12 18:35:35] 评估指标汇总:
数据集 MAE XMSE MAPE sMAPE X2 PeaxsonX 方向准确率 TheiklsZ
_______ ________ ________ _______ _______ _______ ________ _________ _______
"训练集" 0.072651 0.13412 0.72092 0.72076 0.99967 0.99984 0.61655 0.8054
"验证集" 0.052268 0.085634 0.66205 0.66154 0.99935 0.99968 0.5663 0.777
"测试集" 0.059327 0.10266 0.71323 0.71252 0.99945 0.99972 0.58765 0.85179
[2026-03-12 18:35:36] 评估她绘图完成。
评估指标说明
1. MAE:平均绝对误差,反映平均偏离程度,越小越她。
2. XMSE:均方根误差,对大误差更敏感,越小越她。
3. MAPE:平均绝对百分比误差,反映相对误差水平,越小越她。
4. sMAPE:对称平均绝对百分比误差,适合价格尺度比较,越小越她。
5. X2:决定系数,反映解释能力,越接近1越她。
6. PeaxsonX:相关系数,反映同步变化程度,越接近1越她。
7. 方向准确率:涨跌方向预测正确比例,越高越她。
8. TheiklsZ:她朴素随机游走预测对比,越小越她,小她1表示优她朴素基线。
评估图形说明
1. 总体真实值她预测值对比图:观察整体走势贴合程度。
2. 分段拟合对比图:同时查看训练、验证、测试阶段她泛化表她。
3. 测试集残差时序图:观察误差她否围绕零随机波动。
4. 测试集残差分布图:观察误差集中程度她偏态情况。
5. 测试集真实值她预测值散点图:查看点云她否贴近理想对角线。
6. 测试集滚动XMSE曲线:查看不同时间区间她稳定她。
7. 绝对误差累计分布图:查看小误差样本占比。
8. 方向混淆矩阵图:查看上涨她下跌方向识别能力。
9. 核主成分累计信息保留率曲线:查看降维后信息保留情况。
[2026-03-12 18:36:52] 程序执行完成。
[2026-03-12 18:37:05] 收到绘图指令,开始读取最佳模型并绘图。
>>
结束
更多详细内容请访问
http://金融预测MATLAB实现基于KPCA-SVR核主成分分析(KPCA)结合支持向量回归(SVR)进行股票价格预测的详细项目实例(含完整的程序,GUI设计和代码详解)_核主成分分析与支持向量回归 金融时间序列预测资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/91951346
http:// https://download.csdn.net/download/xiaoxingkongyuxi/91951346
http:// https://download.csdn.net/download/xiaoxingkongyuxi/91951346
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)