Создать backtestStrategy объект для определения стратегии распределения портфеля
Создать backtestStrategy объект, определяющий стратегию распределения портфеля.
Используйте этот рабочий процесс для разработки и выполнения бэктеста:
Определение логики стратегии с помощью backtestStrategy объект, чтобы указать, как стратегия перераспределяет портфель активов.
Использовать backtestEngine для создания backtestEngine объект, задающий параметры обратного теста.
Использовать runBacktest для выполнения обратного теста по историческим данным о цене актива и, по выбору, по данным торговых сигналов.
Использовать equityCurve для построения графиков капитала каждой стратегии.
Использовать summary для суммирования результатов обратного тестирования в табличном формате.
Для получения дополнительной информации об этом потоке операций см. Бэктест инвестиционных стратегий.
создает strategy = backtestStrategy(name,rebalanceFcn)backtestStrategy объект.
задает свойства, используя аргументы пары имя-значение и любой из аргументов предыдущего синтаксиса. Можно указать несколько аргументов пары имя-значение. Например, strategy = backtestStrategy(___,Name,Value)strat = backtestStrategy('MyStrategy',@myRebalFcn,'TransactionCost',0.005,'LookbackWindow',20).
name - Название стратегииИмя стратегии, указанное как строка.
Типы данных: string
rebalanceFcn - Функция ребалансировкиФункция ребалансировки, заданная как дескриптор функции. Дескриптор функции вычисляет новые веса портфеля во время бэктеста. Аргумент rebalureFcn реализует основную логику торговой стратегии и должен иметь одну из следующих подписей:
new_weights = rebalanceFcn(weights,assetPrices)
new_weights = rebalanceFcn(weights,assetPrices,signalData)
Функция ребалансировки вызывается backtestEngine объект каждый раз, когда стратегия должна быть повторно сбалансирована. backtestEngine объект вызывает функцию ребалансировки со следующими аргументами:
weights - текущие веса портфеля перед перебалансировкой, указанные как десятичные проценты.
assetPrices - A timetable содержит скользящее окно скорректированных цен основных средств.
signalData - A timetable содержит скользящее окно данных сигнала. При предоставлении сигнальных данных в backtestEngine затем объект обработчика передает его функции перебалансировки стратегии с использованием синтаксиса трех входных аргументов. Если не предоставить сигнальные данные, backtestEngine затем объект engine вызывает функцию ребалансировки с помощью синтаксиса двух входных аргументов.
Функция ребалансировки должна возвращать один выходной аргумент для new_weights который является вектором весов активов, указанных как десятичные проценты.
Если new_weights сумма к 1, то портфель полностью инвестирован.
Если new_weights сумма меньше, чем 1, то портфель будет иметь остаток наличными, зарабатывая RiskFreeRate указано в backtestEngine объект.
Если new_weights сумма более 1, то есть отрицательная денежная позиция (маржа) и заёмные денежные средства начисляют проценты по ставке заимствования денежных средств, указанной в CashBorrowRate имущества backtestEngine объект.
Для получения дополнительной информации о разработке rebalanceFcn дескриптор функции, см. Бэктест инвестиционных стратегий.
Типы данных: function_handle
Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.
strat = backtestStrategy('MyStrategy',@myRebalFcn,'TransactionCost',0.005,'LookbackWindow',20)'RebalanceFrequency' - Частота перебалансировки во время обратного тестирования1
(по умолчанию) | целое | duration объект | calendarDuration объект | вектор datetime объектыЧастота перебалансировки во время обратного теста, указанная как пара, разделенная запятыми, состоящая из 'RebalanceFrequency' и скалярное целое число, duration объект, calendarDuration объект или вектор datetime объекты.
При использовании целого числа целое число представляет количество временных шагов между повторным выравниванием. Например, если вы предоставляете backtestEngine объект с данными о дневной цене, затем RebalanceFrequency указывает количество дней между повторным выравниванием. Значение по умолчанию: 1, что означает, что стратегия восстанавливается с каждым временным шагом.
При использовании duration объект или calendarDurationмеханизм обратного тестирования создает график перебалансировки времени, начиная с самого последнего времени начала, причем время перебалансировки происходит после каждого шага заданной длительности.
При использовании вектора datetime объекты, RebalanceFrequency определяет явное расписание времени перебалансировки. Модуль обратного тестирования будет выполнять перебалансировку при каждом значении даты и времени в предоставленном расписании.
Примечание
Как для синтаксиса duration, так и для синтаксиса datetime, если время перебалансировки не найдено в наборе данных backtest, модуль будет сбалансирован в ближайшее время до запланированного времени. Например, если график перебалансировки содержит выходные, перебалансировка произойдет в пятницу до этого.
Типы данных: double | object
'TransactionCosts' - Операционные издержки для сделок0 (не вычислено) (по умолчанию) | числовой | вектор | дескриптор функцииОперационные издержки для сделок, указанные как пара, разделенная запятыми, состоящая из 'TransactionCosts' и скалярный числовой, векторный или функциональный дескриптор. Операционные затраты можно определить тремя способами:
rate - скалярный десятичный процент как для покупок, так и для продаж активов. Например, если задать TransactionCosts кому 0.001, то каждая сделка (покупает и продает) будет платить 0,1% комиссии за операцию.
[buyRate, sellRate] - A 1около-2 вектор десятичных процентных ставок, который определяет отдельные ставки для покупки и продажи активов.
computeTransactionCostsFcn - Функциональный дескриптор для вычисления настраиваемых комиссий за транзакции. Если вы указываете дескриптор функции, backtestEngine объект вызывает TransactionCosts функция для вычисления сборов за каждый ребаланс. Определяемый пользователем дескриптор функции должен иметь следующую подпись:
[buyCosts,sellCosts] = computeCostsFcn(deltaPositions)
Определяемый пользователем дескриптор функции принимает один входной аргумент deltaPositions, который является вектором изменений позиций основных средств для всех основных средств (в денежных единицах) в результате ребалансировки. Положительные элементы в deltaPositions вектор указывает покупки, в то время как отрицательные записи представляют продажи. Определяемый пользователем дескриптор функции должен возвращать два выходных аргумента buyCosts и sellCosts, которые содержат общие затраты (в валюте) для всего ребаланса для каждого типа транзакции.
Типы данных: double | function_handle
'LookbackWindow' - Окно обратного просмотра[0 Inf] (по умолчанию) | 1около-2 вектор с использованием целых чисел | duration объект | calendarDuration объектОкно поиска, указанное как разделенная запятыми пара, состоящая из 'LookbackWindow' и 1около-2 вектор целых чисел, a duration объект, или calendarDuration объект.
При использовании 1около-2 вектор с целыми числами, который определяет минимальный и максимальный размер скользящего окна данных (цены активов и данные сигналов), которые вы предоставляете rebalanceFcn аргумент. Эти пределы задаются с точки зрения количества шагов времени. Если указано как целые числа, окно обратного просмотра определяется в виде строк данных из актива (pricesTT) и сигнал (signalTT) расписания, используемые в заднем тестировании. Минимум обратного просмотра устанавливает минимальное количество строк данных о цене основного средства, которые должны быть доступны для функции ребалансировки, прежде чем может произойти перебалансировка стратегии. Максимальное значение обратного просмотра устанавливает максимальный размер для скользящего окна данных о ценах, передаваемых функции ребалансировки.
Например, если backtestEngine объект снабжается данными о дневной цене, затем LookbackWindow задает границы размера скользящего окна в днях. Значение по умолчанию: [0 Inf], что означает, что все доступные прошлые данные передаются функции ребалансировки. Если указать ненулевой минимум, то программное обеспечение не вызывает rebalanceFcn до тех пор, пока не будет выполнено достаточно временных шагов для достижения минимального размера.
При указании LookbackWindow как одно скалярное значение, то значение является и минимальным, и максимальным из LookbackWindow (то есть окно фиксированного размера).
При использовании duration объект или calendarDuration, минимальное и максимальное окно обратного просмотра определяются в терминах временных интервалов относительно времени при ребалансировке. Например, если минимум обратного просмотра был установлен равным пяти дням (т. е. days(5)), ребалансировка будет происходить только в том случае, если время начала обратного тестирования находится по меньшей мере за пять дней до времени ребалансировки. Аналогично, если максимальное значение обратного просмотра было установлено равным шести месяцам (то есть calmonths(6)), окно обратного просмотра будет содержать только данные, которые произошли за шесть месяцев до времени перебалансировки или позже.
Примечание
В качестве альтернативы, LookbackWindow может быть установлено в одно скалярное значение, указывающее, что скользящее окно должно иметь именно такой размер (в терминах строк или длительности времени). Как минимальный, так и максимальный размер будут установлены на указанное значение.
Типы данных: double | object
'InitialWeights' - Первоначальные веса портфеля[ ] (по умолчанию) | векторНачальные веса портфеля, указанные как пара, разделенная запятыми, состоящая из 'InitialWeights' и вектор. InitialWeights вектор устанавливает веса портфеля перед backtestEngine объект начинает обратный тест. Размер вектора начальных весов должен соответствовать количеству активов, использованных в фоновом тестировании.
Кроме того, можно задать InitialWeights аргумент пары имя-значение пустой ([ ]) указать, что стратегия начнется без инвестиций и в 100% денежной позиции. Значение по умолчанию для InitialWeights пуст ([ ]).
Типы данных: double
Name - Название стратегииИмя стратегии, указанное как строка.
Типы данных: string
RebalanceFcn - Функция ребалансировкиФункция ребалансировки, заданная как дескриптор функции.
Типы данных: function_handle
RebalanceFrequency - Частота перебалансировки во время обратного тестирования1
(по умолчанию) | числовыеЧастота перебалансировки во время обратного теста, заданная как скалярное число.
Типы данных: double
TransactionCosts - Операционные издержки0 (по умолчанию) | числовой | вектор | дескриптор функцииЗатраты на транзакции, указанные как скалярный числовой, векторный или функциональный дескриптор.
Типы данных: double | function_handle
LookbackWindow - Окно обратного просмотра[0 Inf] (по умолчанию) | числовой | векторОкно поиска, указанное как скалярное числовое или векторное.
Типы данных: double
InitialWeights - Начальные веса[ ] (по умолчанию) | векторНачальные веса, указанные как вектор.
Типы данных: double
Определение стратегии обратного тестирования с помощью backtestStrategy объект. backtestStrategy объекты содержат свойства, специфичные для торговой стратегии, такие как частота ребалансировки, транзакционные затраты и функция ребалансировки. Функция ребалансировки реализует основную логику стратегии и используется механизмом бэктестирования во время бэктеста, чтобы позволить стратегии изменить распределение активов и совершать сделки. В этом примере, чтобы проиллюстрировать создание и использование стратегий обратного тестирования в MATLAB ®, необходимо подготовить две простые стратегии для обратного тестирования :
Равнодействующая взвешенная стратегия
Стратегия, которая пытается «гоняться за доходами»
Логика стратегии для этих двух стратегий определяется в функциях ребалансировки.
Задать свойства стратегии
A backtestStrategy имеет несколько свойств, которые задаются с помощью параметров для backtestStrategy функция.
Начальные веса
InitialWeights свойство содержит веса распределения активов в начале бэктеста. Значение по умолчанию для InitialWeights пуст ([]), что указывает на то, что стратегия начинает бэктест неинвестированным, что означает, что 100% капитала находится в денежных средствах, зарабатывая безрисковую ставку.
Установите InitialWeights к определенному распределению основных средств. Размер вектора начальных весов должен соответствовать количеству активов в фоновом тестировании.
% 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];
Можно также установить свойство TransacityCosts в дескриптор функции, если необходимо реализовать произвольно сложные структуры затрат на транзакции. Дополнительные сведения о создании функций затрат по операциям см. в разделе backtestStrategy.
Частота перебалансировки
RebalanceFrequency свойство определяет, как часто механизм обратного тестирования выполняет ребалансировку и перераспределяет портфель стратегии с помощью функции ребалансировки. Установите RebalanceFrequency по временным шагам в заднем тесте. Например, если механизм бэктестирования тестирует стратегию с набором данных о дневной цене, то установите функцию ребалансировки в днях. По существу, RebalanceFrequency представляет количество строк ценовых данных для обработки между каждым вызовом функции перебалансировки стратегии.
% Both strategies rebalance every 4 weeks (20 days).
rebalFreq = 20;Окно обратного просмотра
Каждый раз, когда механизм обратного тестирования вызывает функцию перебалансировки стратегии, окно данных цены основного средства (и, возможно, данных сигнала) передается функции перебалансировки. Затем функция ребалансировки может принимать решения о торговле и соотнесении на основе скользящего окна рыночных данных. 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) - пользовательская функция, содержащая логику стратегии. Механизм бэктестирования вызывает функцию перебалансировки стратегии с фиксированным набором параметров и ожидает, что она вернет вектор весов основных средств, представляющий новое желаемое распределение портфеля после перебалансировки. Дополнительные сведения см. в разделе Функции перебалансировки.
Создание стратегий
С помощью подготовленных свойств стратегии можно создать два объекта стратегии.
% 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: [1x30 double]
% 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: [1x30 double]
Настройка модуля обратного тестирования
Чтобы выполнить обратное тестирование двух стратегий, используйте backtestEngine объект. Механизм обратного тестирования устанавливает параметры обратного тестирования, которые применяются ко всем стратегиям, таким как безрисковая ставка и начальная стоимость портфеля. Дополнительные сведения см. в разделе 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 функция, то механизм обратного тестирования передает скользящее окно данных сигнала каждой стратегии, которая его поддерживает.
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 на основе их скользящей доходности в окне обратного просмотра. Эта наивная стратегия используется просто в качестве иллюстративного примера.
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
backtestEngine | equityCurve | runBacktest | summary | timetable
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.