backtestStrategy

Создайте backtestStrategy объект задать стратегию выделения портфеля

Описание

Создайте backtestStrategy объект, который задает стратегию выделения портфеля.

Используйте этот рабочий процесс, чтобы разработать и запустить backtest:

  1. Задайте логику стратегии использование backtestStrategy объект задать, как стратегия восстанавливает равновесие портфеля активов.

  2. Используйте backtestEngine создать backtestEngine объект, который задает параметры backtest.

  3. Использование runBacktest запускать backtest против исторических данных цен активов и, опционально, данных о торговом сигнале.

  4. Использование equityCurve построить кривые акции каждой стратегии.

  5. Использование summary обобщать backtest приводит к формату таблицы.

Для более подробной информации об этом рабочем процессе см. Инвестиционные стратегии Backtest.

Создание

Описание

пример

strategy = backtestStrategy(name,rebalanceFcn) создает backtestStrategy объект.

пример

strategy = backtestStrategy(___,Name,Value) аргументы пары "имя-значение" использования свойств наборов и любой из аргументов в предыдущем синтаксисе. Можно задать несколько аргументов пары "имя-значение". Например, strat = backtestStrategy('MyStrategy',@myRebalFcn,'TransactionCost',0.005,'LookbackWindow',20).

Входные параметры

развернуть все

Имя стратегии в виде строки.

Типы данных: string

Функция восстановления равновесия в виде указателя на функцию. Указатель на функцию вычисляет новые веса портфеля во время backtest. rebalanceFcn аргумент реализует логику ядра торговой стратегии и должен иметь одну из следующих подписей:

  • new_weights = rebalanceFcn(weights,assetPrices)

  • new_weights = rebalanceFcn(weights,assetPrices,signalData)

Функция восстановления равновесия вызвана backtestEngine возразите каждый раз, когда стратегия должна быть перебалансирована. backtestEngine вызовы объектов восстановление равновесия функционируют со следующими аргументами:

  • weights — Текущие веса портфеля прежде, чем изменять баланс в виде десятичных процентов.

  • assetPrices A timetable содержа прокручивающееся окно настроенных цен активов.

  • signalData A timetable содержа прокручивающееся окно данных сигнала. Если вы обеспечиваете, данные сигнала к backtestEngine объект, затем объект механизма передает его функции восстановления равновесия стратегии с помощью трех синтаксисов входного параметра. Если не предоставляют данным сигнала backtestEngine объект, затем вызовы объектов механизма восстановление равновесия функционируют с двумя синтаксисами входного параметра.

    Функция восстановления равновесия должна возвратить один выходной аргумент в пользу new_weights который является вектором из весов актива, заданных как десятичные проценты.

    • Если new_weights суммируйте к 1, затем портфель полностью инвестируют.

    • Если new_weights суммируйте к меньше, чем 1, затем портфель будет иметь остаток наличными, зарабатывая RiskFreeRate заданный в backtestEngine объект.

    • Если new_weights суммируйте к больше, чем 1, затем существует отрицательная денежная позиция (поле), и одолженные наличные деньги накапливают проценты по наличному ссудному проценту, заданному в CashBorrowRate свойство backtestEngine объект.

    Для получения дополнительной информации о разработке rebalanceFcn указатель на функцию, см. Инвестиционные стратегии Backtest.

Типы данных: function_handle

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: strat = backtestStrategy('MyStrategy',@myRebalFcn,'TransactionCost',0.005,'LookbackWindow',20)

Восстановите равновесие частоты во время backtest в виде разделенной запятой пары, состоящей из 'RebalanceFrequency' и скалярное целое число, duration объект, calendarDuration объект или вектор из datetime объекты.

При использовании целого числа целое число представляет количество временных шагов между изменением баланса. Например, если вы обеспечиваете backtestEngine объект с ежедневными ценовыми данными, затем RebalanceFrequency задает номер дней между изменением баланса. Значением по умолчанию является 1, значение стратегии изменяет баланс с каждым временным шагом.

При использовании duration объект или calendarDuration, backtest механизм создает расписание восстановления равновесия времен, запускающихся в backtest время начала, с временами восстановления равновесия, происходя после каждого шага заданной длительности.

При использовании вектора из datetime объекты, RebalanceFrequency задает явное расписание времен восстановления равновесия. backtest механизм будет изменять баланс в каждом datetime в предоставленном расписании.

Примечание

И на время и на синтаксисы datetime, если время восстановления равновесия не найдено в backtest наборе данных, механизм будет изменять баланс в ближайшее время до запланированного времени. Например, если расписание восстановления равновесия будет содержать выходные, восстановление равновесия произойдет в пятницу прежде.

Типы данных: double | object

Операционные издержки для отраслей в виде разделенной запятой пары, состоящей из 'TransactionCosts' и скаляр, числовой, векторный, или указатель на функцию. Можно задать операционные издержки тремя способами:

  • rate — Скалярный десятичный процент заряжается и к покупкам и к продажам активов. Например, если вы устанавливаете TransactionCosts к 0.001, затем каждая транзакция (покупает и продает), заплатила бы 0,1% в комиссионных за транзакции.

  • [buyRate, sellRate]1- 2 вектор из десятичных процентных ставок, который задает отдельные уровни для покупки и продажи активов.

  • computeTransactionCostsFcn — Указатель на функцию, чтобы вычислить настроенные комиссионные за транзакции. Если вы задаете указатель на функцию, backtestEngine вызовы объектов TransactionCosts функция, чтобы вычислить сборы за каждое восстановление равновесия. Пользовательский указатель на функцию должен иметь следующую подпись:

    [buyCosts,sellCosts] = computeCostsFcn(deltaPositions)

    Пользовательский указатель на функцию берет один входной параметр deltaPositions, который является вектором из изменений в положениях актива для всех активов (в модулях валюты) в результате восстановления равновесия. Положительные элементы в deltaPositions вектор указывает на покупки, в то время как отрицательные записи представляют продажи. Пользовательский указатель на функцию должен возвратить два выходных аргумента buyCosts и sellCosts, которые содержат общие затраты (в валюте) для целого восстановления равновесия для каждого типа транзакции.

Типы данных: double | function_handle

Окно Lookback в виде разделенной запятой пары, состоящей из 'LookbackWindow' и 1- 2 вектор из целых чисел, duration объект или calendarDuration объект.

При использовании 1- 2 вектор с целыми числами, который задает минимальный и максимальный размер прокручивающегося окна данных (цены активов и данные сигнала), что вы обеспечиваете к rebalanceFcn аргумент. Вы задаете эти пределы в терминах количества временных шагов. Когда задано как целые числа, lookback окно задано в терминах строк данных из актива (pricesTT) и сигнал (signalTT) расписания используются в backtest. lookback минимум определяет минимальный номер строк данных цен активов, которые должны быть доступны для функции восстановления равновесия, прежде чем восстановление равновесия стратегии сможет произойти. lookback максимум устанавливает максимальный размер для прокручивающегося окна ценовых данных, которые передаются функции восстановления равновесия.

Например, если backtestEngine объекту предоставляют ежедневные ценовые данные, затем LookbackWindow задает границы размера прокручивающегося окна в днях. Значением по умолчанию является [0 Inf], подразумевать, что все доступные прошлые данные даны функции восстановления равновесия. Если вы задаете ненулевой минимум, то программное обеспечение не вызывает rebalanceFcn до достаточного процесса временных шагов, чтобы соответствовать минимальному размеру.

Если вы задаете LookbackWindow как одно скалярное значение, затем значение является и минимумом и максимумом LookbackWindow (то есть, окно фиксированного размера).

При использовании duration объект или calendarDuration, lookback минимум окна и максимум заданы в терминах промежутков относительно времени в восстановлении равновесия. Например, если lookback минимум был установлен к пяти дням (то есть, days(5)), восстановление равновесия только произойдет, если backtest время начала составит по крайней мере пять дней до времени восстановления равновесия. Точно так же, если lookback максимум был установлен в шесть месяцев (то есть, calmonths(6)), lookback окно содержало бы только данные, которые произошли в шесть месяцев до времени восстановления равновесия или позже.

Примечание

В качестве альтернативы LookbackWindow может быть установлен в одно скалярное значение, указывающее, что прокручивающееся окно должно быть точно что размер (или в терминах строк или в терминах длительности времени). Минимальный и максимальный размер будет оба установлен во введенное значение.

Типы данных: double | object

Начальные веса портфеля в виде разделенной запятой пары, состоящей из 'InitialWeights' и вектор. InitialWeights вектор устанавливает веса портфеля перед backtestEngine объект начинает backtest. Размер начального вектора весов должен совпадать с количеством активов, используемых в backtest.

В качестве альтернативы можно установить InitialWeights аргумент пары "имя-значение", чтобы опустеть ([ ]) указать на стратегию начнется без инвестиций и в 100%-й денежной позиции. Значение по умолчанию для InitialWeights isempty).

Типы данных: double

Свойства

развернуть все

Имя стратегии в виде строки.

Типы данных: string

Функция восстановления равновесия в виде указателя на функцию.

Типы данных: function_handle

Восстановите равновесие частоты во время backtest в виде числового скаляра.

Типы данных: double

Операционные издержки в виде скаляра, числового, векторного, или указатель на функцию.

Типы данных: double | function_handle

Окно Lookback в виде скаляра, числового или векторного.

Типы данных: double

Начальные веса в виде вектора.

Типы данных: double

Примеры

свернуть все

Задайте backtest стратегию при помощи backtestStrategy объект. backtestStrategy объекты содержат свойства, характерные для торговой стратегии, такие как частота восстановления равновесия, операционные издержки и функция восстановления равновесия. Функция восстановления равновесия реализует логику ядра стратегии и используется backtesting механизмом во время backtest, чтобы позволить стратегии изменить ее распределение активов и сделать отрасли. В этом примере, чтобы проиллюстрировать, как создать и использовать backtest стратегии в MATLAB®, вы готовите две простых стратегии backtesting:

  1. Равная взвешенная стратегия

  2. Стратегия, которая пытается "преследовать, возвращается"

Логика стратегии для этих двух стратегий задана в функциях восстановления равновесия.

Установите свойства стратегии

backtestStrategy объект имеет несколько свойств, что вы устанавливаете параметры использования для backtestStrategy функция.

Начальные веса

InitialWeights свойство содержит веса распределения активов в начале backtest. Значение по умолчанию для InitialWeights isempty), который указывает, что стратегия начинает backtest, который не инвестируют, означая, что 100% капитала находятся наличными, зарабатывая безрисковый уровень.

Установите InitialWeights к определенному распределению активов. Размер начального вектора весов должен совпадать с количеством активов в backtest.

% Initialize the strategies with 30 weights, since the backtest
% data comes from a year of the 30 DJIA stocks.
numAssets = 30;

% Give the initial weights for both strategies equal weighting. Weights
% must sum to 1 to be fully invested.
initialWeights = ones(1,numAssets);
initialWeights = initialWeights / sum(initialWeights);

Операционные издержки

TransactionCosts свойство позволяет вам устанавливать плату, которую стратегия вносит за торговые активы. Операционные издержки заплачены как процент общего изменения в положении для каждого актива. Задайте затраты в десятичных процентах. Например, если TransactionCosts установлен в 1% (0.01) и стратегия покупает ценность за 100$ запаса, затем понесенные операционные издержки составляют 1$.

Операционные издержки установлены с помощью 1- 2 вектор, который устанавливает отдельные уровни сбора для покупок и продаж активов. В этом примере обе стратегии платят те же операционные издержки — 25 пунктов для покупок актива и 50 пунктов для продаж.

% Define the Transaction costs as [buyCosts sellCost] and specify the costs
% as decimal percentages.
tradingCosts = [0.0025 0.005];

Можно также установить свойство TransactionCosts на указатель на функцию, если необходимо реализовать произвольно комплексные структуры операционных издержек. Для получения дополнительной информации о создании функций операционных издержек смотрите backtestStrategy.

Восстановите равновесие частоты

RebalanceFrequency свойство определяет, как часто backtesting механизм восстанавливает равновесие и перераспределяет портфель стратегии с помощью функции восстановления равновесия. Установите RebalanceFrequency в терминах временных шагов в backtest. Например, если backtesting механизм тестирует стратегию с набором ежедневных ценовых данных, то установленный функция восстановления равновесия в днях. По существу, RebalanceFrequency представляет количество строк ценовых данных к процессу между каждым вызовом функции восстановления равновесия стратегии.

% Both strategies rebalance every 4 weeks (20 days).
rebalFreq = 20;

Окно Lookback

Каждый раз, когда backtesting механизм вызывает функцию восстановления равновесия стратегии, окно данных цен активов (и возможно данные сигнала) передается функции восстановления равновесия. Функция восстановления равновесия может затем принять решения торговли и выделения на основе прокручивающегося окна данных о рынке. LookbackWindow наборы свойств размер этих окон прокрутки. Установите окно в терминах временных шагов. Окно определяет количество строк данных из расписания цен активов, которые передаются функции восстановления равновесия.

LookbackWindow свойство может быть установлено двумя способами. Для окна прокрутки фиксированного размера данных (например, "50 дней ценовой истории"), LookbackWindow свойство установлено в одно скалярное значение (N= 50 ). Программное обеспечение затем вызывает функцию восстановления равновесия с ценовым расписанием, содержащим точно N строки прокручивающихся ценовых данных.

В качестве альтернативы можно задать свойство LookbackWindow при помощи 1- 2 векторный [min max] это задает минимальный и максимальный размер для расширяющегося окна данных. Таким образом можно установить гибкие размеры окна. Например:

  • [10 Inf] — По крайней мере 10 строк данных

  • [0 50] — Не больше, чем 50 строк данных

  • [0 Inf] — Все доступные данные (то есть, никакой минимум, никакой максимум); это - значение по умолчанию

  • [20 20] — Точно 20 строк данных; это эквивалентно установке LookbackWindow к скалярному значению 20

Программное обеспечение не вызывает функцию восстановления равновесия, если данные недостаточны, чтобы создать допустимое окно прокрутки, независимо от значения RebalanceFrequency свойство.

Если стратегия не требует никакой цены или истории данных сигнала, то можно указать, что функция восстановления равновесия не требует никаких данных путем установки LookbackWindow свойство к 0.

% The equal weight strategy does not require any price history data.
ewLookback = 0;

% The "chase returns" strategy bases its decisions on the trailing
% 10-day asset returns. The lookback window is set to 11 since computing 10 days 
% of returns requires the close price from day 0.
chaseLookback = 11;

Функция восстановления равновесия

Функция восстановления равновесия (rebalanceFcn) созданная пользователями функция, которая содержит логику стратегии. backtesting механизм вызывает функцию восстановления равновесия стратегии с фиксированным набором параметров и ожидает, что он возвратит вектор из весов актива, представляющих новое, желаемое выделение портфеля после восстановления равновесия. Для получения дополнительной информации смотрите функции восстановления равновесия.

Создайте стратегии

Используя подготовленные свойства стратегии, можно создать два объекта стратегии.

% Create the equal weighted strategy. The rebalance function @equalWeights
% is defined in the Rebalance Functions section at the end of this example.
equalWeightStrategy = backtestStrategy("EqualWeight",@equalWeight,...
    'RebalanceFrequency',rebalFreq,...
    'TransactionCosts',tradingCosts,...
    'LookbackWindow',ewLookback,...
    'InitialWeights',initialWeights)
equalWeightStrategy = 
  backtestStrategy with properties:

                  Name: "EqualWeight"
          RebalanceFcn: @equalWeight
    RebalanceFrequency: 20
      TransactionCosts: [0.0025 0.0050]
        LookbackWindow: 0
        InitialWeights: [0.0333 0.0333 0.0333 0.0333 0.0333 0.0333 ... ]

% Create the "chase returns" strategy.  The rebalance function
% @chaseReturns is defined in the Rebalance Functions section at the end of this example.
chaseReturnsStrategy = backtestStrategy("ChaseReturns",@chaseReturns,...
    'RebalanceFrequency',rebalFreq,...
    'TransactionCosts',tradingCosts,...
    'LookbackWindow',chaseLookback,...
    'InitialWeights',initialWeights)
chaseReturnsStrategy = 
  backtestStrategy with properties:

                  Name: "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 ... ]

Настройте Engine Backtesting

К backtest эти две стратегии используйте backtestEngine объект. backtesting механизм устанавливает параметры backtest, которые применяются ко всем стратегиям, таким как безрисковый уровень и начальная стоимость портфеля. Для получения дополнительной информации смотрите backtestEngine.

% Create an array of strategies for the backtestEngine.
strategies = [equalWeightStrategy chaseReturnsStrategy];

% Create backtesting engine to test both strategies.
backtester = backtestEngine(strategies);

Восстановите равновесие функций

Функции, определяемые восстановления равновесия стратегии с помощью rebalanceFcn аргумент для backtestStrategy должен придерживаться фиксированного API, который backtest механизм ожидает при взаимодействии с каждой стратегией. Изменяйте баланс функции должны реализовать один из следующих двух синтаксисов:

function new_weights = exampleRebalanceFcn(current_weights,assetPriceTimeTable)

function new_weights = exampleRebalanceFcn(current_weights,assetPriceTimeTable,signalDataTimeTable)

Все функции восстановления равновесия берут в качестве их первого входного параметра текущие веса выделения портфеля. current_weights представляет распределение активов непосредственно перед тем, как восстановление равновесия происходит. Во время восстановления равновесия можно использовать current_weights во множестве путей. Например, можно использовать current_weights определить, как далеко выделение портфеля дрейфовало от целевого выделения или к отраслям размера во время восстановления равновесия, чтобы ограничить оборот.

Вторые и третьи аргументы синтаксиса функций восстановления равновесия являются прокручивающимися окнами цен активов и дополнительных данных сигнала. Эти две таблицы содержат запаздывающий N строки актива и расписаний сигнала, которые передаются runBacktest функция, где N установлен с помощью LookbackWindow свойство каждой стратегии.

Если дополнительные данные сигнала предоставляются runBacktest функция, затем backtest механизм передает прокручивающееся окно данных сигнала к каждой стратегии, которая поддерживает его.

equalWeight стратегия просто вкладывает капитал одинаково через все активы.

function new_weights = equalWeight(current_weights,assetPrices) %#ok<INUSD> 

% Invest equally across all assets.
num_assets = numel(current_weights);
new_weights = ones(1,num_assets) / num_assets;

end

chaseReturns стратегия вкладывает капитал только в верхнюю часть, которую X запасов на основе их прокрутки возвращают в lookback окне. Эта наивная стратегия используется просто в качестве иллюстративного примера.

function new_weights = chaseReturns(current_weights,assetPrices) 

% Set number of stocks to invest in.
numStocks = 15;

% Compute rolling returns from lookback window.
rollingReturns = assetPrices{end,:} ./ assetPrices{1,:};

% Select the X best performing stocks over the lookback window
[~,idx] = sort(rollingReturns,'descend');
bestStocksIndex = idx(1:numStocks);

% Initialize new weights to all zeros.
new_weights = zeros(size(current_weights));

% Invest equally across the top performing stocks.
new_weights(bestStocksIndex) = 1;
new_weights = new_weights / sum(new_weights);

end
Введенный в R2020b