主要内容

backtestStrategy

创建backtestStrategy对象定义组合分配策略

描述

创建一个backtestStrategy对象定义了一个投资组合分配策略。

使用此工作流开发并运行一个val:

  1. 定义使用的战略逻辑backtestStrategy对象指定策略如何调整投资组合的资产。

  2. 使用backtestEngine创建一个backtestEngine对象指定val的参数。

  3. 使用runBacktest运行,val对资产价格的历史数据,可以选择交易信号数据。

  4. 使用equityCurve绘制每个策略的股票曲线。

  5. 使用总结总而言之,val结果以表格格式。

更详细的信息在这个工作流,看到val投资策略

创建

描述

例子

策略= backtestStrategy (的名字,rebalanceFcn)创建一个backtestStrategy对象。

例子

策略= backtestStrategy (___,名称,值)属性使用名称-值对参数和其他参数在前面的语法。您可以指定多个参数名称-值对。例如,stratocaster电吉他= backtestStrategy (@myRebalFcn‘MyStrategy’,‘TransactionCost’, 0.005,“LookbackWindow”, 20)

输入参数

全部展开

策略名称,指定为一个字符串。

数据类型:字符串

平衡功能,指定为一个函数处理。一个函数处理计算在val新的投资组合权重。rebalanceFcn参数实现交易策略的核心逻辑,必须有一个下面的签名:

  • assetPrices new_weights = rebalanceFcn(权重)

  • new_weights = rebalanceFcn(重量、assetPrices signalData)

平衡函数被调用的backtestEngine对象每次战略必须重新平衡。的backtestEngine对象调用平衡函数使用以下参数:

  • 权重——当前的投资组合权重调整之前,指定为十进制百分比。

  • assetPrices——一个时间表包含一个滚动窗口的调整资产价格。

  • signalData——一个时间表包含一个滚动窗口的信号数据。如果你提供信号数据backtestEngine引擎对象对象,然后将其传递到战略平衡函数使用的三个输入参数的语法。如果不提供信号数据backtestEngine引擎对象对象,然后调用平衡函数和两个输入参数的语法。

    平衡函数必须返回一个输出参数new_weights这是一个指定的资产权重向量为十进制的百分比。

    • 如果new_weights总和为1,那么完全投资组合。

    • 如果new_weights总和不到1,那么组合将在现金,其余收入RiskFreeRate中指定的backtestEngine对象。

    • 如果new_weights金额超过1,然后有一个负的现金头寸(保证金)和现金借款产生的利息的现金中指定的借款利率CashBorrowRate财产的backtestEngine对象。

    有关开发的更多信息rebalanceFcn函数处理,请参阅val投资策略

数据类型:function_handle

名称-值对的观点

指定可选的逗号分隔条名称,值参数。的名字参数名称和吗价值相应的价值。的名字必须出现在引号。您可以指定几个名称和值对参数在任何顺序Name1, Value1,…,的家

例子:stratocaster电吉他= backtestStrategy (@myRebalFcn‘MyStrategy’,‘TransactionCost’, 0.005,“LookbackWindow”, 20)

调整频率在val,指定为逗号分隔组成的“RebalanceFrequency”和一个标量整数,持续时间对象,calendarDuration对象,或一个向量datetime对象。

如果使用一个整数,整数表示的时间步骤数之间的平衡。例如,如果您提供的backtestEngine对象与每日价格数据,那么RebalanceFrequency指定的天数之间的平衡。默认值是1与每个时间步,即战略调整。

如果使用持续时间对象或calendarDuration,val引擎创建一个平衡计划,从val的开始时间,平衡时间发生后的每一步指定持续时间。

如果使用一个向量的datetime对象时,RebalanceFrequency定义了一个明确的时间表的调整时间。val引擎将在每一个datetime平衡提供时间表。

请注意

持续时间和datetime语法,如果没有找到平衡时间,val数据集,发动机将在最近的平衡时间预定时间前。例如,如果平衡计划包含一个周末,平衡将发生在周五之前。

数据类型:|对象

交易成本,交易,指定为逗号分隔组成的“TransactionCosts”和一个标量数值,向量,或函数处理。您可以指定交易成本在三个方面:

  • ——一个标量十进制百分比收取购买和出售资产。例如,如果您设置TransactionCosts0.001,然后每笔交易(买卖)将支付交易费用的0.1%。

  • [buyRate, sellRate]——一个1——- - - - - -2向量的百分比数率指定单独的购买和出售的资产。

  • computeTransactionCostsFcn——一个函数处理计算定制的交易费用。如果你指定一个函数处理,backtestEngine对象调用TransactionCosts为每个平衡函数来计算费用。用户定义函数处理必须有以下签名:

    [buyCosts, sellCosts] = computeCostsFcn (deltaPositions)

    用户定义函数处理接受一个输入参数deltaPositions资产头寸,这是一个向量的变化对所有资产(货币单位)平衡的结果。积极的元素deltaPositions向量表示购买而消极条目代表销售。用户定义的函数处理必须返回两个输出参数buyCostssellCosts控制总成本(货币)为整个平衡为每个类型的事务。

数据类型:|function_handle

Lookback窗口中,指定为逗号分隔组成的“LookbackWindow”和一个1——- - - - - -2整数的向量持续时间对象,或calendarDuration对象。

当使用一个1——- - - - - -2与整数向量定义的最小和最大大小滚动窗口的数据(资产价格和信号数据)提供的rebalanceFcn论点。您指定这些限制数量的时间步骤。当指定为整数,lookback窗口中定义的行数据资产(pricesTT)和信号(signalTT在val)时间表使用。lookback最小集的最小资产价格数据的行数必须平衡函数可用战略平衡之前发生。lookback最大设置滚动窗口的最大尺寸的价格数据传递到平衡的功能。

例如,如果backtestEngine对象提供每日价格数据LookbackWindow指定滚动窗口的大小范围在天。默认值是[0正]过去,这意味着所有可用的数据平衡功能。如果你指定一个非零最小,那么软件不能调用rebalanceFcn直到足够的时间步骤过程满足的最小大小。

如果您指定LookbackWindow作为一个标量值,值的最小值和最大值LookbackWindow(即一个固定大小的窗口)。

如果使用持续时间对象或calendarDuration,lookback窗口定义最小值和最大值的时间跨度相对平衡的时间。例如如果lookback最小值设置为5天(也就是说,天(5)),平衡只会发生如果val开始时间至少5天前调整时间。同样,如果lookback最大设置为6个月(即,calmonths (6)),lookback窗口将只包含数据,发生在6个月前调整时间或更高版本。

请注意

或者,LookbackWindow可以设置为一个标量值表明滚动窗口应该准确,大小(以行或时间)。最小和最大大小都将被设置为所提供的价值。

数据类型:|对象

初始投资组合权重,指定为逗号分隔组成的“InitialWeights”和一个向量。的InitialWeights向量集前的组合权重backtestEngine对象开始,val。初始权值向量的大小必须匹配资产用于val的数量。

此外,您可以设置InitialWeights名称-值对参数为空([])来表示该策略将开始没有投资和100%的现金头寸。的默认值InitialWeights是空的([])。

数据类型:

属性

全部展开

策略名称,指定为一个字符串。

数据类型:字符串

平衡功能,指定为一个函数处理。

数据类型:function_handle

调整频率在val,指定为一个标量数值。

数据类型:

交易成本、指定为一个标量数值向量,或函数处理。

数据类型:|function_handle

Lookback窗口中,指定为一个标量数字或向量。

数据类型:

初始权值,指定为一个向量。

数据类型:

例子

全部折叠

定义一个使用val策略backtestStrategy对象。backtestStrategy对象包含属性的特定交易策略,如调整频率、交易成本、平衡功能。平衡功能实现的核心逻辑策略和使用val引擎在val允许改变其战略资产配置,进行交易。在这个例子中,来说明如何创建和使用val策略在MATLAB®, val你准备两个简单的策略:

  1. 同等权重的策略

  2. 一个策略,试图“追逐回报”

这两个策略的战略逻辑的定义平衡功能

设置策略属性

一个backtestStrategy对象有几个属性,使用参数设置backtestStrategy函数。

最初的重量

InitialWeights属性包含的资产分配权重,val的开始。的默认值InitialWeights是空的([]),这表明战略开始,val闲置,这意味着100%的现金资本赚取无风险利率。

设置InitialWeights到一个特定的资产配置。初始权值向量的大小必须匹配,val的资产数量。

与30重量%初始化策略,因为,val%的数据来自一年30吗股票。numAssets = 30;%给这两种策略的初始权重相等的权重。权重%总和必须为1完全投入。numAssets initialWeights = 1 (1);initialWeights = initialWeights /笔(initialWeights);

交易成本

TransactionCosts属性允许您设置的费用支付交易资产的策略。支付交易成本占总每个资产的位置变化。在十进制指定成本百分比。例如,如果TransactionCosts设置为1% (0.01)和策略购买价值100美元的股票,然后交易费用是1美元。

交易成本设置使用1——- - - - - -2向量集单独收费标准购买和出售资产。在这个例子中,这两种策略同样支付交易成本——25个基点资产购买和销售50个基点。

%的交易成本定义为[buyCosts sellCost)和指定的成本%为十进制百分比。tradingCosts = (0.0025 - 0.005);

你也可以设置TransactionCosts属性函数处理如果你需要实现任意复杂的交易成本结构。在创建交易成本函数的更多信息,见backtestStrategy

调整频率

RebalanceFrequency属性决定了多久,val引擎调整和再分配的投资组合策略使用平衡功能。设置RebalanceFrequency在val的时间步骤。例如,如果val引擎测试策略与一组每日价格数据,然后设置平衡函数在天。从本质上讲,RebalanceFrequency代表之间的价格数据处理的行数每个调用策略平衡功能。

%这两种策略平衡每4周(20天)。rebalFreq = 20;

Lookback窗口

每次val引擎调用策略平衡函数,资产价格数据的窗口(也可能是信号数据)传递给平衡功能。平衡功能可以使交易和分配的决定基于滚动窗口的市场数据。的LookbackWindow属性集这些滚动窗口的大小。设置窗口的时间步骤。窗口确定的行数的数据从资产价格时间表传递到平衡的功能。

LookbackWindow属性可以设置在两个方面。一个固定大小的滚动窗口的数据(例如,“50天的价格历史”),LookbackWindow属性设置为一个标量值(N=50)。软件然后调用平衡功能与价格包含确切时间表N行价格数据。

或者,您可以定义LookbackWindow属性使用1——- - - - - -2向量(最小最大)指定的最小和最大尺寸扩大窗口的数据。通过这种方式,您可以设置灵活的窗口大小。例如:

  • (10正)——至少10行数据

  • 50 [0]——不超过50行数据

  • [0正]——所有可用的数据(即,没有最低,没有最大);这是默认值

  • 20 [20]- 20行数据;这相当于设置LookbackWindow标量值20.

软件不调用平衡函数如果数据不足以创建一个有效的滚动窗口,无论的价值RebalanceFrequency财产。

如果策略不需要任何价格或信号数据的历史,那么你就可以表明,平衡函数不需要数据通过设置LookbackWindow财产0

% =重量策略不需要任何价格历史数据。ewLookback = 0;%的“追逐回报”战略决策的基础落后% 10天的资产回报。lookback窗口设置为11因为计算10天%的回报要求价格从第0天关闭。chaseLookback = 11;

平衡功能

平衡函数(rebalanceFcn)是user-authored包含策略的逻辑函数。val引擎调用策略平衡函数用一组固定的参数,并希望它返回一个向量的资产权重代表新的、理想的投资组合分配平衡。有关更多信息,请参见平衡功能

创建策略

使用准备战略属性,您可以创建两个策略对象。

%建立平等加权策略。平衡功能@equalWeights%是在平衡中定义的函数部分的这个例子。equalWeightStrategy = backtestStrategy (评级“持股观望上调为增持”@equalWeight,“RebalanceFrequency”rebalFreq,“TransactionCosts”tradingCosts,“LookbackWindow”ewLookback,“InitialWeights”initialWeights)
评级equalWeightStrategy = backtestStrategy属性:名称:“持股观望上调为增持”RebalanceFcn: @equalWeight RebalanceFrequency: 20 TransactionCosts: [0.0025 - 0.0050] LookbackWindow: 0 InitialWeights: [0.0333 0.0333 0.0333 0.0333 0.0333 0.0333……]
%创建“追逐回报”战略。平衡功能% @chaseReturns平衡功能部分中定义的例子。chaseReturnsStrategy = backtestStrategy (“ChaseReturns”@chaseReturns,“RebalanceFrequency”rebalFreq,“TransactionCosts”tradingCosts,“LookbackWindow”chaseLookback,“InitialWeights”initialWeights)
chaseReturnsStrategy = backtestStrategy属性:名称:“ChaseReturns”RebalanceFcn: @chaseReturns RebalanceFrequency: 20 TransactionCosts: [0.0025 - 0.0050] LookbackWindow: 11 InitialWeights: [0.0333 0.0333 0.0333 0.0333 0.0333 0.0333……]

设置,val引擎

val两种策略,使用backtestEngine对象。val的val引擎设置参数,适用于所有的策略,如无风险利率和初始投资组合价值。有关更多信息,请参见backtestEngine

%为backtestEngine创建数组的策略。策略= [equalWeightStrategy chaseReturnsStrategy];%创建val引擎测试这两种策略。val = backtestEngine(策略);

平衡功能

策略定义平衡函数使用rebalanceFcn理由backtestStrategy必须坚持一个固定的API, val引擎预计交互时,每个策略。平衡功能必须实现以下两个语法之一:

函数new_weights = exampleRebalanceFcn (current_weights assetPriceTimeTable)函数new_weights = exampleRebalanceFcn (current_weights assetPriceTimeTable signalDataTimeTable)

所有平衡功能将作为他们的第一个输入参数的当前分配权重组合。current_weights代表了资产配置调整前发生。在调整期间,您可以使用current_weights以多种方式。例如,您可以使用current_weights确定投资组合分配多少已从目标分配或转移至交易规模在平衡限制营业额。

第二个和第三个参数调整函数的语法是资产价格和可选的滚动窗口信号数据。这两个表包含落后N行资产和信号传递给的时间表runBacktest函数,N设置使用LookbackWindow每种策略的属性。

如果可选信号数据的提供runBacktest滚动窗口函数,那么,val引擎传递的信号数据,每个策略支持。金宝app

equalWeight策略简单投资同样在所有资产。

函数评级new_weights =持股观望上调为增持(current_weights assetPrices)% #好< INUSD >%同样在所有资产投资。num_assets =元素个数(current_weights);num_assets new_weights = 1 (1) / num_assets;结束

chaseReturns战略投资只在顶部X股票基于他们在lookback窗口滚动的回报。这个天真的策略是使用简单的作为一个说明性的例子。

函数new_weights = chaseReturns (current_weights assetPrices)%设置数量的股票投资。numStocks = 15;%计算轧制返回从lookback窗口。rollingReturns = assetPrices {,,}。/ assetPrices {1,};%选择X表现最好的股票/ lookback窗口[~,idx] =排序(rollingReturns,“下”);bestStocksIndex = idx (1: numStocks);%初始化新的权重为零。new_weights = 0(大小(current_weights));%同样顶部进行股票投资。new_weights (bestStocksIndex) = 1;new_weights = new_weights /笔(new_weights);结束
介绍了R2020b