matlab将数据集分成训练集和测试集,如何将数据分成训练集和测试集?
本例展示如何将数据分成训练集和测试集。我们将回测一个配对交易策略,在训练集上优化参数,在测试集上观察效果。
GLD代表黄金的现货价格,GDX是一揽子采金企业股票,两者的价格是高度相关的,故GLD和GDX可用于做配对交易。不过我要到第7章才会讲训练集上的协整分析,结果表明,GLD多头和GDX空头所形成的差价呈均值回归。通过训练集上的回归分析可得出GLD和GDX之间的对冲比率,并设定配对交易策略进出市场的阀值。从后面可以看到,阀值在训练集上的优化会改变策略在测试集上的业绩。(程序文件可从epchan. com/book/example3-6.m下载,数据文件为GLD. xls和GLD.xls。)程序使用滞后命令,将时间序列滞后一期,这在epchan.com/book中也能找到。还会使用“普通最小二乘法(OLS)”命令进行线性回归,在spatial-econometrics.com上可免费打包下载。
使用MATLAB
%清除工作空间已有变量
clear;
%将“GLD.xls”读入MATLAB
[num,txt]=xlsread('GLD');
%第一列(从第二行开始)是交易日,格式为mm/dd/yyyy
tdayl=txt(2:end,1);
%将时间格式转化为yyyymmdd
tdayl=…
datestr(datenum (tdayl,'mm/dd/yyyy'),'yyyymmdd');
%将数据字符串转化为单元型变量,再转化为数值型变量
tdayl =str2double(cellstr(tdayl));
%最后一列是调整后收盘价
adjclsl=num(:,end);
%读入“GDX. x1s”
[num,txt]=xlsread('GDX');
%第一列(从第二行开始)是交易日,格式为mm/dd/yyyy
tday2=txt(2:end,1);
%将时间格式转化为yyyymmdd
tday2=…
datestr(datenum (tday2,'mm/dd/yyyy'),'yyyymmdd');
%将数据字符串转化为单元型变量,再转化为数位型变量
tday2=str2double(cellstr(tday2));
%最后一列是调整后收盘价
adjcls2=num(:,end);
%找到两组数据的交集并按升序排列
[tday,idxl,idx2]=intersect(tdayl,tday2);
cll=adjclsl(idxl);
c12=adjcls2(idx2);
trainset=1:252;%定义训练集一标
%定义测评集下标
testset = trainset(end)+1:length(tday);
%用回归函数计葬得到对冲比率
results=ols(cll (trainset),c12(trainset));
hedgeRatio= results. beta;
%差价=GLD一对冲比率*GDX
spread=cll一hedgeRatio*c12;
plot(spread(trainset));
figure;
plot(spread(testset));
figure;
%训练集平均差价
spreadMean= mean(spread(trainset ));
%训练集差价标准差
spreadStd =std(spread(trainset));
%差价标准化(用z-scores方法)
zscore = (spread一spreadMean). /spreadStd;
%在组合价值向下跌破2倍标准差时,购买此差价组合
longs=zscore<=一2;
%当组合价值上升超过2倍标准差时,做空该差价组合
shorts=zscore>=2;
%当组合价值回到1倍标准差以内时,清仓
exits=abs(zscore) <=1;
写初始化头寸数组
positions=NaN(length Way),2);
%多头入市
positions(shorts,:)= repmat[一1 1],[length(find(shorts))1]);
%空头入市
positions(longs,:)=repmat([1一1],[length(find(longs))1]);
%清仓
positions(exits,:)=zeros(length(find(exits)),2);
%确保继续持仓,除非出现清仓信号
%positions= fillMissingData(positions);
cl=[cllc12];%合并两个价格序列
dailyret=(cl一lagl(cl))./lagl(cl);
pnl=sum(lagl(positions).*dailyret,2);
%训练集的夏普比应该足2.3
sharpeTrainset=…
sgrt(252)*mean(pnl(trainset(2:end)))./std(pnl(trainset(2:end)))
%测评集的夏普比应该是1.5
sharpeTestset =sgrt(252)*mean(pnl(testset))./std(pnl(testset))
plot(cumsum(pnl(testset )));
sharpeTestset = sqrt(252)*mean(pnl(testset))./std(pnl(testset))
plot(cumsum(pnl(testset)));
%保存头寸文件以便检查数据先窥偏差
save example3-6-positions positions;
文件lagl. m:
function y=lagl(x)
%y=lag(x)
if(isnumeric(x))
%第一个元素填充为NaN
y=[NaN(1,size(x,2));x(1:end一1,:)];elseif(ischar(x))
%第一个元素填充为”
Y=[repmat(””,[1 size(x,2)]);x(1:end一1,:)];else error('Can only be numeric or char array’);
End
此配对交易策略在训练集和测试集上的夏普比率都很高,因此可认为它是无数据迁就偏差的。但也许还有进一步改进的空间。若把建仓阀值改为1倍标准差、清仓阀值改为0.5倍标准差,训练集上的夏普比率会上升到2.9 ,测试集上的夏普比率会上升到2.1。显然,这一阀值集更佳。
不过,在训练集上进行参数优化也许会降低测试集上的业绩。这种情况下,应选择使得训练集和测试集上的业绩结果都较好(也许不是最好)的参数集。
我没有将交易成本考虑在内(下一节会讨论交易成本)。读者可以自己做练习。由于这一策略不是频繁交易,因此,交易成本对所得的夏普比率影响并不大。
为观察这一策略是如何工作的,读者可参见所显示的差价。你将看到差价走势呈现出很明显的均值回归。因此,不断地低买高卖是很管用的。
最后,还要检测任何可能的数据前视偏差。在上面的MATLAB代码“cl2=adjcls2 (idx2);”之后,添加以下代码。
%将最近的交易日数据移除掉
cutoff=60;%移除最近60天的数据
tday(end一cutoff+l:end,:)=[];
cll(end一cutoff +l:end,:)=[];
c12(end-cutoff+1:end,:)=[];
将以下代码放在上面MATLAB程序的结尾,取代“save example3_6_positions positions”。
%检测数据先窥偏差的第二步
oldoutput=load (’example3-6-positions');
oldoutput. positions(end一cutoff+1:end,:)=[];
if (any( positions~=oldoutput. positions))
fprintf(1.'Program has look-forward-bias!\n')
End
将新的代码保存为“example3 - 6 - 1. m”并运行,你会发现“Program has look-forward-bias”语句不会被打印出来,这说明算法通过测试了。
matlab将数据集分成训练集和测试集,如何将数据分成训练集和测试集?相关推荐
- 大数据ab 测试_在真实数据上进行AB测试应用程序
大数据ab 测试 Hello Everyone! 大家好! I am back with another article about Data Science. In this article, I ...
- ES 7.6.2集群迁移(从一套ES集群迁移数据到另一套集群)
有时有需要从ES集群中去除多个节点的需求,比如迁移一套ES集群到另外一套ES集群,这时可以先将新的ES节点加入到现有集群里,再将老ES节点下线. 一 实验环境 二 实验步骤 2.1 集群扩 ...
- python机器学习 train_test_split()函数用法解析及示例 划分训练集和测试集 以鸢尾数据为例 入门级讲解
文章目录 train_test_split()用法 获取数据 划分训练集和测试集 完整代码脚手架 train_test_split()用法 python机器学习中常用 train_test_split ...
- R语言使用lm构建线性回归模型、并将目标变量对数化实战:模型训练集和测试集的残差总结信息(residiual summary)、模型训练(测试)集自由度计算、模型训练(测试)集残差标准误计算
R语言使用lm构建线性回归模型.并将目标变量对数化实战:模型训练集和测试集的残差总结信息(residiual summary).模型训练(测试)集自由度计算.模型训练(测试)集残差标准误计算(Resi ...
- 为什么神经网络模型在测试集上的准确率高于训练集上的准确率?
为什么神经网络模型在测试集上的准确率高于训练集上的准确率? 种花家的奋斗兔 2020-03-21 17:28:37 5847 已收藏 11 分类专栏: Deep Learning 文章标签: dr ...
- NLP文本情感分析:测试集loss比训练集loss大很多,训练集效果好测试集效果差的原因
NLP情感分析:测试集loss比训练集loss大很多 一.前言 二.原因 一.前言 最近在学习神经网络自然语言处理的相关知识,发现运行的之后测试集的loss比训练集的loss大很多,而accuracy ...
- 在数据中随机抽取一定比例的数据为训练集,剩下的为测试集的小方法
在进行常见机器学习任务中,我们经常会随机抽取一定比例的数据为训练集,而剩下的为测试集.一般情况下都比较繁琐,所以看了其他的博客之后,准备了一个小函数实现这个功能. EG: def getRandomI ...
- 训练softmax分类器实例_一个值得深思的问题?为什么验证集的loss会小于训练集的loss...
编辑:zero 关注 搜罗最好玩的计算机视觉论文和应用,AI算法与图像处理 微信公众号,获得第一手计算机视觉相关信息 在本教程中,您将学习在训练自己的自定义深度神经网络时,验证损失可能低于训练损失的三 ...
- [caffe学习笔记]用自己的数据进行训练和测试
我今天尝试制作一个自己的训练数据集,参考薛开宇的学习方式,模仿搭建自己的数据库. 1.因为我的电脑里有整个ImageNet_ILSVRC2012的数据集,所以从训练集ILSVRC2012_img_tr ...
- 一个值得深思的问题?为什么验证集的loss会小于训练集的loss
在本教程中,您将学习在训练自己的自定义深度神经网络时,验证损失可能低于训练损失的三个主要原因. 我的验证损失低于训练损失! 怎么可能呢? 我是否意外地将训练和验证loss绘图的标签切换了? 潜在地. ...
最新文章
- 【Fiddler学习】Fiddler抓包HTTPS请求和手机抓包
- 联想云:借助云计算助力中国企业数字化转型
- APK加密方法:某社交类Android APP加密分享
- 结对项目-WordCount
- QComboBox可以随意设置itemData的数值
- 数据库死锁_死锁荔枝_解决方法
- DataOutputStream 类 和DatainputStream类 的主要方法简单介绍,及代码演示。
- MongoDB副本集学习(一):概述和环境搭建
- Best quotes from The Vampire Diary(《吸血鬼日记》经典台词)
- 【优化预测】基于matlab粒子群算法优化DBN预测【含Matlab源码 1420期】
- 破解密码很难?利用Python自动编写暴力破解字典,***必学技能!
- cmos逻辑门传输延迟时间_组合逻辑电路详解、实现及其应用
- 有线网口设备转为无线wifi,RJ45网口转wifi,即插即用,网卡转无线wifi完全透传
- 致联系报考我免试研究生的同学们-山世光 研究员-中科院计算所
- 操作系统独木桥问题解法
- 【积水成渊-逐步定制自己的Emacs神器】1:Emacs入门
- 5G系统——UE移动性
- python数字华容道算法_Python 3*3数字华容道源代码
- 编程极简入门(python)-07-批量处理
- 一个小项目--银行项目
热门文章
- 超级实用springBoot学习
- CAD中属性编辑操作——对象属性
- 蔡学镛谈Java学习
- [蓝桥杯python] Sine之舞 :最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐
- 分布式存储问题及解决方案
- 控制工程中的数学建模(1)——二阶有源低通滤波器(之一)
- linux鼠标指针隐藏,触摸屏鼠标指针隐藏消失方法
- 微信美食菜谱小程序系统毕业设计毕设(6)开题答辩PPT
- yuki翻译器钩子_最新YUKI GALGAME翻译器下载地址电脑版-CC软件
- 推荐一款使用快捷的免费文字识别OCR(图片转文字)在线服务