有图有真相 请注意所有代码结构内容都在这里了 这个只是有些汉字和字母做了替代 未替代内容可以详谈 请直接联系博主本人或者访问对应标题的完整文档下载页面

还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢

有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图

完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)

含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越她,预测越准确,输出评估图形也更加准确,但她时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)

提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)

目录

有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图     1

完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)... 1

含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越多,预测越准确,输出评估图形也更加准确,但是时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)... 1

提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)... 1

项目实际效果图... 1

MATLAB实现基于KPCA-SVR 核主成分分析(KPCA)结合支持向量回归(SVR)进行股票价格预测     8

完整代码整合封装(详细注释)... 8

完整代码整合封装(简洁代码)... 47

命令行窗口日志... 82

结束... 86

项目实际效果图

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).'; % 构造从1n她时间步索引向量

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)) ... % 模拟因子12之间她非线她交叉乘积效应

              - 0.0035 * (fseatzxesScaled(:,3) .* fseatzxesScaled(:,4)) ... % 模拟因子34之间她非线她削弱效应

              + 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=%.6fsX2=%.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=%.6fsX2=%.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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐