主要内容

runbacktest.

在一个或多个策略上恢复最新

描述

例子

反击= runBacktest (反击pricesTT在调整后资产价格数据的时间表上运行后退。

runbacktest.初始化先前定义的每个策略反向rightsgy.InitialPortfoliovalue.然后开始处理价格数据的时间表(pricesTT) 如下:

  1. 每次步骤,runbacktest.函数将资产回报应用于策略投资组合头寸。

  2. runbacktest.功能确定基于的重新平衡的哪些策略重新平衡财产的财产反向rightsgy.对象。

  3. 对于需要重新平衡的策略,runbacktest.函数调用他们的重新平衡函数与基于资产价格数据的滚动窗口寻找窗德每个人的财产反向rightsgy.

  4. 基于资产职位的变化,计算并收取交易成本和收费交易成本每个人的财产反向rightsgy.目的。

  5. 后退完成后,结果存储在几个属性中倒退生儿目的。

例子

反击= runBacktest (反击pricesTTsignaltt.使用调整后的资产价格数据和信号数据运行返回。指定信号数据时间表(signaltt.),然后runbacktest.函数运行回溯测试,并在rebalance步骤期间将信号数据的滚动窗口传递给每个策略的rebalance函数。

例子

反击= runBacktest (___名称,值除了以前语法中的输入参数之外,使用一个或多个可选名称值对参数指定选项。例如,反向临时= RunbackTest(反击,Assetprices,'开始',50,'End',100)

例子

全部折叠

MATLAB®Softtesting引擎在资产价格数据的次数上运行次数的投资组合投资策略。在创建一组反向策略之后反向rightsgy.和后退发动机使用倒退生儿, 这runbacktest.函数执行逆机。此示例说明了如何使用runbacktest.测试投资策略的功能。

加载数据

加载一年的股票价格数据。对于可读性,此示例仅使用Djia股票的子集。

%读取日常调整的接近价格2006年DJIA股票t = readtable(“dowPortfolio.xlsx”);%修剪只按住日期和所选股票的表格timecolumn =.“日期”;assetsymbols = [“ba”“猫”“说”“ge”“IBM”“力”“msft”];t = t(:,[timecolumn assetsymbols]);%转换为时间表pricestt = table2timetable(t,'rowtimes''日期');%查看最终资产价格时间表头(Pricestt)
ans =.8×7时间表DATES BA CAT DIS GE IBM MCD MCD MCD MSFT _________________________ _________________ _____ 03-jan-2006 68.63 55.86 24.18 33.6 80.13 32.72 26.19 04-JAN-2006 69.34 57.29 23.77 33.56 80.03 33.01 26.32 05-JAN-2006 68.53 57.29 24.19 33.47 57.29 24.19 33.47 80.5633.05 26.34 06-JAN-2006 67.57 58.43 24.52 33.7 82.96 33.25 26.26 09-JAN-2006 67.01 59.49 24.78 33.61 81.76 33.88 26.21 10-JAN-2006 67.33 59.25 25.09 33.43 82.1 33.91 26.35 11-JAN-2006 68.3 59.28 25.33 33.66 82.19 32.5 26.632006年1月12日67.9 60.13 25.41 33.25 81.61 33.96 26.48

创造策略

在本介绍性示例中,测试等加权投资策略。该策略将可用资金的平等部分投入到每个资产中。此示例确实描述了有关如何创建反向策略的详细信息。有关创建反向策略的更多信息,请参阅反向rightsgy.

设定重新平衡每60天重新平衡投资组合。此示例不使用Lookback窗口重新平衡。

%创建了策略numAssets =大小(pricesTT, 2);equals weightsvector = ones(1,numAssets) / numAssets;@(~,~) equalWeightsVector;ewStrategy = backtestStrategy (“EqualWeighted”,平等的尺寸票弗伦,......'重新平衡'现年60岁的......'lookbackwindow',0,......'交易成本',0.005,......“InitialWeights”,相等的vleightsvector)
ewStrategy = backtestStrategy与属性:名称: “EqualWeighted” RebalanceFcn:@(〜,〜)equalWeightsVector RebalanceFrequency:60个TransactionCosts:0.0050 LookbackWindow:0 InitialWeights:[0.1429 0.1429 0.1429 0.1429 0.1429 0.1429 0.1429]

跑回

创建一个回溯测试引擎,并对一年的股票数据进行回溯测试。有关创建后台测试引擎的更多信息,请参见倒退生儿

%创建了反馈引擎。保存的最终发动机属性%结果初始化为空。val = backtestEngine (ewStrategy)
backtester = backtestEngine with properties: Strategies: [1x1 backtestStrategy] RiskFreeRate: 0 CashBorrowRate: 0 RatesConvention: "Annualized" Basis: 0 InitialPortfolioValue: 10000 NumAssets: [] Returns: [] Positions: [] Turnover: [] BuyCost: [] SellCost: []
%运行后端。现在填充空的属性%详细的后退结果的时间表。反向临时= RunbackTest(反击,Pricestt)
反向临时= Backtestengine与属性:策略:[1x1 Backteststy]风险频繁:0 CashBoRrorate:0率加强:“年化”基础:0 InitialPortFolioValue:10000 NumAse:7返回:[250x1时间表]位置:[1x1 struct]营业额:[250x1时间表]Buycost:[250x1时间表] SELLCOST:[250x1时间表]

val总结

使用概括函数生成回溯测试结果的汇总表。

%检查结果。摘要表显示了几个性能指标。摘要(反向聊天)
ans =.9×1表平等_____________ totalreturn 0.22943 Sharperatio 0.11415波动率0.0075013 Averageturnover 0.00054232 MaxTurnover 0.038694 Averagereturn 0.098905均线0.098905均线0.030193 Averageellcost 0.030193

在MATLAB®中运行回溯测试时,您需要了解回溯测试开始时的初始条件是什么。每个策略的初始权值、策略回看窗口的大小,以及数据集分成训练和测试分区的任何可能的分割都会影响回看测试的结果。这个例子展示了如何使用runbacktest.用来的功能'开始'“结束”与之交互的名称值对参数'lookbackwindow''重新平衡'属性反向rightsgy.反对“温暖开始”一个反向。

加载数据

加载一年的股票价格数据。对于可读性,此示例仅使用Djia股票的子集。

%读取日常调整的接近价格表2006年DJIA股票。t = readtable(“dowPortfolio.xlsx”);%修剪表只包含日期和所选库存。timecolumn =.“日期”;assetsymbols = [“ba”“猫”“说”“ge”“IBM”“力”“msft”];t = t(:,[timecolumn assetsymbols]);%转换为时间表。pricestt = table2timetable(t,'rowtimes''日期');%查看最终资产价格时间表。头(Pricestt)
ans =.8×7时间表DATES BA CAT DIS GE IBM MCD MCD MCD MSFT _________________________ _________________ _____ 03-jan-2006 68.63 55.86 24.18 33.6 80.13 32.72 26.19 04-JAN-2006 69.34 57.29 23.77 33.56 80.03 33.01 26.32 05-JAN-2006 68.53 57.29 24.19 33.47 57.29 24.19 33.47 80.5633.05 26.34 06-JAN-2006 67.57 58.43 24.52 33.7 82.96 33.25 26.26 09-JAN-2006 67.01 59.49 24.78 33.61 81.76 33.88 26.21 10-JAN-2006 67.33 59.25 25.09 33.43 82.1 33.91 26.35 11-JAN-2006 68.3 59.28 25.33 33.66 82.19 32.5 26.632006年1月12日67.9 60.13 25.41 33.25 81.61 33.96 26.48

创造策略

这个例子反向测试了“逆方差”策略。中实现了逆方差再平衡函数本地函数部分。有关创建反向策略的更多信息,请参阅反向rightsgy..逆方差策略利用资产收益的协方差来进行资产配置决策。这寻找窗德对于此策略必须包含至少30天的尾随数据(大约6周),最多60天(约12周)。

重新平衡为了反向rightsgy.每25天重新平衡投资组合。

%创建了策略minlookback = 30;maxlokback = 60;IV xtressgy = Backteststy(“inversevariance”,@ InversevarianceFCN,......'重新平衡',25,......'lookbackwindow',[minlockback maxlokback],......'交易成本',[0.0025 0.005])
IV quilltgy = BreaktestSgy具有属性:名称:“Inversewariance”RebalanceFCN:@InversevarianceFCN重新平衡:25 TransactionScosts:[0.0025 0.0050] LookbackWindow:[30 60]初始重量:[1x0 double]

runttest并检查结果

创建一个回溯测试引擎,并对一年的股票数据进行回溯测试。有关创建后台测试引擎的更多信息,请参见倒退生儿

%创建了反馈引擎。val = backtestEngine (ivStrategy);%运行后端。反向临时= RunbackTest(反击,Pricestt);

使用Assetareaplot.帮助函数,定义本地函数此示例的一部分,在返回的过程中显示资产分配的变化。

Assetareaplot(反向聊天,“inversevariance”

图包含轴。标题inversevariance位置的轴包含8个类型区域的对象。这些对象代表现金,BA,Cat,Dis,GE,IBM,MCD,MSFT。

请注意,逆差策略全部以现金始于现金,仍处于该州约2.5个月。这是因为反向rightsgy.对象没有指定的一组初始权重,您可以使用该初始权重集InitialPortfoliovalue.名称值对参数。反方差策略需要在重新平衡之前需要30天的尾随资产价格历史。你可以使用printrebalancetable.帮助函数,定义本地函数部分,显示重新平衡表。

PrintreBalancetable(IV Quistgy,Pricestt,Minlookback);
数据回测开始日期最少天数的第一天重新平衡_________________ ___________________ _________________________ 03-JAN-2006年03月 -  2006年30再平衡日期可用的历史价格数据不足的天数再平衡_______________ _______________________________ ________________________ 08  -  2月 -  2006年26“否” 162006年Mar-2006 51“是”21-APR-2006 76“是”2006年5月26日 -  2006年5月“是”03-jul-2006 126“是”08-2006-2006 151“是”13-2006 176“是“2006年10月18日 - 是”22-ov-2006 226“是”29-Dec-2006 251“是”

第一次重新平衡日期出现于2月8日,但该策略没有足够的价格历史填写有效的寻求窗口(最低30天),因此没有发生重新平衡。下一个重新平衡日期是3月16日,全面50天进入后端。

这种情况并不理想,因为这50天的全部现金头寸约占整个回测的20%。因此,当回溯测试引擎报告策略的表现(即总回报率、夏普比率、波动性等)时,结果并不能反映“真实”的策略表现,因为策略只在回溯测试的20%左右才开始做出资产配置决策。

温暖的开始恢复

可以“热启动”后退。温暖的开始意味着后退结果反映了价格时间表中反映的市场条件中的战略性能。要开始,请设置策略的初始权重,以避免所有现金开始。

逆方差策略需要30天的价格历史记录来填写有效的回溯窗口,因此您可以将价格数据集划分为两个部分,一个“热身”集和一个“测试”集。

warmuprange = 1:30;%第30行包含在两个范围内,因为使用第30天的价格%来计算第31天的返回值。testrange = 30:高度(pricestt);

使用热身划分来设置逆方差策略的初始权值。通过这样做,你可以用已经“运行”的策略开始后测,避免在最初几周的现金头寸上花费时间。

%使用rebalance函数设置初始权重。这可能百分比或可能无法根据细节进行其他策略%策略逻辑。initweights = Inversevariancefcn([],pricestt(warmuprange,:));

更新策略并重新运行后退。由于预热范围用于初始化逆方差策略,因此您必须从逆机中省略此数据,以避免偏见的偏见,或“看到未来”,并仅在“测试范围内”。

%在反向特中设置初始权重。你可以做到这一点%使用“初始重量级”参数创建策略。反向聊天.trategies(1).initialweights = Initweights;在“test”范围内重新运行回测。反向临时= runbacktest(反击,pricestt(testrange,:));

当您生成区域绘图时,避免了避免了策略为最新的策略为返回的第一部分现金的问题。

Assetareaplot(反向聊天,“inversevariance”

图包含轴。标题inversevariance位置的轴包含8个类型区域的对象。这些对象代表现金,BA,Cat,Dis,GE,IBM,MCD,MSFT。

但是,如果您查看重新平衡表,您可以看到策略仍然“错过了”第一次重新平衡日期。当您在数据集的测试范围内运行时,第一个重新平衡日期是3月22日。这是因为从价格历史中省略了预热范围,并且该策略在该策略上仅提供了26天的历史(少于Lookback窗口所需的至少30天)。因此,3月22日重新平衡。

为避免在预热范围内恢复挖掘,从数据集中删除范围。这意味着新的逆时开始日期和所有后续重新平衡日期稍后是30天。预热范围中包含的价格历史数据完全被删除,因此当后退发动机击中第一次重新平衡日期时,价格历史不足以重新平衡。

printrebalancetable(IV Quinkygy,pricestt(testrange,:),minlockback);
数据回测开始日期最少天数的第一天重新平衡_________________ ___________________ _________________________ 14  -  2月 -  2006年14月 -  2006年30再平衡日期可用的历史价格数据不足的天数再平衡_______________ _______________________________ ________________________ 22月 -  2006年26“否” 27-2006年4月51“是”02-jun-2006 76“是”10-jul-2006 101“是”14-2006-24-2006 126“是”19-Sep-2006-2006-2006 151“是”24-101〜2006“是“2006年11月29日201”是“

这种情况也不正确,因为原始价格时间表(热身和测试分区在一起)在3月22日之前有足够的价格历史才能填写一个有效的Lookback窗口。但是,较早的数据不可用于反馈引擎,因为仅使用测试分区运行reaktest。

使用开始结尾参数runbacktest.

在这种情况下,理想的工作流是两者兼而有之忽略热预热数据范围从后端避免了偏见的偏见包括价格历史中的热身数据能够填写策略的LISKBACK窗口,并具有所有可用的价格历史数据。你可以通过使用它来这样做'开始'参数为runbacktest.功能。

'开始'“结束”的名称-值对参数runbacktest.启用您在特定日期开始并结束逆端。您可以指定'开始'“结束”作为价格时间表的行或作为日期时间值(参见文档了解runbacktest.功能有关详细信息)。这'开始'参数允许反向最新的日期开始,同时为反馈引擎访问完整数据集。

使用re rerun使用它使用的'开始'名称值对参数,而不是仅在原始数据集的分区上运行。

%重新运行后端开始在预热范围的最后一天开始。startrow = warmuprange(结束);反向临时= Runbacktest(反击,Pricestt,'开始',startrow);

绘制新的资产区域情节。

Assetareaplot(反向聊天,“inversevariance”

图包含轴。标题inversevariance位置的轴包含8个类型区域的对象。这些对象代表现金,BA,Cat,Dis,GE,IBM,MCD,MSFT。

用新的重新平衡表查看新的重新平衡表'开始'范围。

PrintreBalancetable(IV Quistgy,Pricestt,Minlockback,Startrow);
数据回测开始日期最少天数的第一天重新平衡_________________ ___________________ _________________________ 03-JAN-2006年14月 -  2006年可用的历史价格数据不足30再平衡日期日重新平衡_______________ _______________________________ ________________________ 22月 -  2006年55“是” 27-2006年4月80日“是”02-jun-2006 105“是”10-jul-2006 130“是”14-2006-21-2006 155“是”19-2006年9月19日 -  2006年180“是”24-10月24日 -  2006“是“2006年11月29日230”是“

逆转差异策略现在有足够的数据来重新平衡第一个重新平衡日期(3月22日),而后退是“温暖的开始”。通过使用原始数据集,数据的第一天仍然是1月3日,而且'开始'参数允许您向前移动返回启动日期以避免热身范围。

即使结果没有显着差别,这个例子说明了它们之间的相互作用寻找窗德重新平衡名称 - 值对参数反向rightsgy.对象和数据中使用的数据范围runbacktest.当您在反馈中评估策略的性能时。

本地函数

策略再平衡功能实现如下。有关创建策略和编写rebalance函数的更多信息,请参见反向rightsgy.

函数new_weights = Inversevariancefcn(Current_weights,pricestt)%逆方差投资组合配置。assetReturns = tick2ret (pricesTT);assetCov = x (assetReturns {:,:});new_weights = 1 ./ diag(assetCov);New_weights = New_weights / sum(New_weights);结束

此辅助功能将资产分配作为区域图绘制。

函数Assetareaplot(反向聊天,StrategyName)T =反攻者。(StrategyName)。时间;positions = backtester.positions。(StrategyName).variables;h =区域(t,位置);标题(Sprintf('%s职位',strategyname));Xlabel('日期');ylabel('资产职位');dateTick(“x”'mm / dd''保持');XLIM([T(1)T(end)])offylim = ylim;ylim([0 offylim(2)]);cm = parula(numel(h));为了I = 1:numel(h) set(h(I),“FaceColor”,cm(i,:));结束传奇(反击。(StrategyName).properties.variablenames)结束

此辅助功能在每个日期的可用价格历史上生成重新平衡日期表。

函数printrebalancetable(策略,pricestt,minlockback,startrow)如果nargin <4 startrow = 1;结束alldates = pricestt。(pricestt.properties.dimensionnames {1});重新平衡= alldates(startrow:策略.RebalanceFrequency:结束);[〜,重新平衡议案] = ismember(重新平衡,pricestt.dates);DISP(表(1),重新平衡(1),Minlookback,'variablenames',{'数据的第一天''反恢复日期'“重新平衡最少的日子”}));流('\ n \ n');numhistory =重新平衡议团(2:结束);足够= repmat(“不”,尺寸(numhistory));足够(numhistory> minlockback)=“是的”;disp(表(rebalanceDates(2:结束),rebalanceIndices(2:结束),足够了,'variablenames',{'重新平衡日期''可用价格历史日子'“足够的数据重新平衡”}));结束

输入参数

全部折叠

被抛出的引擎,指定为a倒退生儿目的。使用倒退生儿创建反击目的。

数据类型:目的

资产价格,指定为资产价格的时间表倒退生儿用于回溯测试策略。价格时间表的每一列必须包含资产价格的时间序列。历史资产价格必须根据分割和股息进行调整。

数据类型:时间表

(可选)信号数据,指定为交易信号的时间表,策略用于进行交易决策。signaltt.是可选的。如果提供,倒退生儿使用资产价格数据和信号数据调用策略重新平衡函数。这signaltt.时间表必须具有与时间表相同的时间维度pricesTT时间表。

数据类型:时间表

名称-值对的观点

指定可选的逗号分隔的对名称,值论点。名称是参数名称和价值是相应的价值。名称必须出现在引号内。可以以任意顺序指定多个名称和值对参数name1,value1,...,namen,valuen

例子:反向临时= RunbackTest(反击,Assetprices,'开始',50,'End',100)

启动后退的时间步骤,指定为逗号分隔对组成'开始'和标量整数或DateTime。

如果是一个整数,开始时间是指行中的行pricesTT第二次开始的时间表。

如果一个datetime对象,逆时将首次在价格上首次开始,以在或之后发生的时间表'开始'范围。后退将在最近的价格结束,价格在价格上或之前发生的时间表“结束”范围。这'开始'“结束”参数设置返回中包含的数据的边界。

数据类型:双倍的|datetime

结束后退的时间步骤,指定为逗号分隔对组成“结束”和标量整数或DateTime。

如果是一个整数,结尾时间是指行中的行pricesTT最终结束的时间表。

如果一个datetime对象,待定

数据类型:双倍的|datetime

输出参数

全部折叠

逆行引擎,作为更新的更新返回倒退生儿目的。回到次次完成后,runbacktest.控件中填充多个属性倒退生儿对象与后退的结果。您可以通过使用来总结结果概括功能。

介绍了R2020b