Создайте backtestStrategy
объект задать стратегию выделения портфеля
Создайте backtestStrategy
объект, который задает стратегию выделения портфеля.
Используйте этот рабочий процесс, чтобы разработать и запустить backtest:
Задайте логику стратегии использование backtestStrategy
объект задать, как стратегия восстанавливает равновесие портфеля активов.
Используйте backtestEngine
создать backtestEngine
объект, который задает параметры backtest.
Использование runBacktest
запускать backtest против исторических данных цен активов и, опционально, данных о торговом сигнале.
Использование equityCurve
построить кривые акции каждой стратегии.
Использование summary
обобщать backtest приводит к формату таблицы.
Для более подробной информации об этом рабочем процессе см. Инвестиционные стратегии Backtest.
создает strategy
= backtestStrategy(name
,rebalanceFcn
)backtestStrategy
объект.
аргументы пары "имя-значение" использования свойств наборов и любой из аргументов в предыдущем синтаксисе. Можно задать несколько аргументов пары "имя-значение". Например, strategy
= backtestStrategy(___,Name,Value
)strat = backtestStrategy('MyStrategy',@myRebalFcn,'TransactionCost',0.005,'LookbackWindow',20)
.
name
— Имя стратегииИмя стратегии в виде строки.
Типы данных: string
rebalanceFcn
— Функция восстановления равновесияФункция восстановления равновесия в виде указателя на функцию. Указатель на функцию вычисляет новые веса портфеля во время 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)
'RebalanceFrequency'
— Восстановите равновесие частоты во время backtest
(значение по умолчанию) | целое число | duration
возразите | calendarDuration
возразите | вектор из datetime
объектыВосстановите равновесие частоты во время backtest в виде разделенной запятой пары, состоящей из 'RebalanceFrequency'
и скалярное целое число, duration
объект, calendarDuration
объект или вектор из datetime
объекты.
При использовании целого числа целое число представляет количество временных шагов между изменением баланса. Например, если вы обеспечиваете backtestEngine
объект с ежедневными ценовыми данными, затем RebalanceFrequency
задает номер дней между изменением баланса. Значением по умолчанию является 1
, значение стратегии изменяет баланс с каждым временным шагом.
При использовании duration
объект или calendarDuration
, backtest механизм создает расписание восстановления равновесия времен, запускающихся в backtest время начала, с временами восстановления равновесия, происходя после каждого шага заданной длительности.
При использовании вектора из datetime
объекты, RebalanceFrequency
задает явное расписание времен восстановления равновесия. backtest механизм будет изменять баланс в каждом datetime в предоставленном расписании.
Примечание
И на время и на синтаксисы datetime, если время восстановления равновесия не найдено в backtest наборе данных, механизм будет изменять баланс в ближайшее время до запланированного времени. Например, если расписание восстановления равновесия будет содержать выходные, восстановление равновесия произойдет в пятницу прежде.
Типы данных: double |
object
'TransactionCosts'
— Операционные издержки для отраслей
(не вычисленный) (значение по умолчанию) | числовой | вектор | указатель на функциюОперационные издержки для отраслей в виде разделенной запятой пары, состоящей из '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
'LookbackWindow'
— Окно Lookback[0 Inf]
(значение по умолчанию) | 1
- 2
вектор с помощью целых чисел | duration
возразите | calendarDuration
объектОкно 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'
и вектор. InitialWeights
вектор устанавливает веса портфеля перед backtestEngine
объект начинает backtest. Размер начального вектора весов должен совпадать с количеством активов, используемых в backtest.
В качестве альтернативы можно установить InitialWeights
аргумент пары "имя-значение", чтобы опустеть ([ ]
) указать на стратегию начнется без инвестиций и в 100%-й денежной позиции. Значение по умолчанию для InitialWeights
isempty
).
Типы данных: double
Name
— Имя стратегииИмя стратегии в виде строки.
Типы данных: string
RebalanceFcn
— Функция восстановления равновесияФункция восстановления равновесия в виде указателя на функцию.
Типы данных: function_handle
RebalanceFrequency
— Восстановите равновесие частоты во время backtest
(значение по умолчанию) | числовойВосстановите равновесие частоты во время backtest в виде числового скаляра.
Типы данных: double
TransactionCosts
— Операционные издержки
(значение по умолчанию) | числовой | вектор | указатель на функциюОперационные издержки в виде скаляра, числового, векторного, или указатель на функцию.
Типы данных: double |
function_handle
LookbackWindow
— Окно Lookback[0 Inf]
(значение по умолчанию) | числовой | векторОкно Lookback в виде скаляра, числового или векторного.
Типы данных: double
InitialWeights
— Начальные веса[ ]
(значение по умолчанию) | векторНачальные веса в виде вектора.
Типы данных: double
Задайте backtest стратегию при помощи backtestStrategy
объект. backtestStrategy
объекты содержат свойства, характерные для торговой стратегии, такие как частота восстановления равновесия, операционные издержки и функция восстановления равновесия. Функция восстановления равновесия реализует логику ядра стратегии и используется backtesting механизмом во время backtest, чтобы позволить стратегии изменить ее распределение активов и сделать отрасли. В этом примере, чтобы проиллюстрировать, как создать и использовать backtest стратегии в MATLAB®, вы готовите две простых стратегии backtesting:
Равная взвешенная стратегия
Стратегия, которая пытается "преследовать, возвращается"
Логика стратегии для этих двух стратегий задана в функциях восстановления равновесия.
Установите свойства стратегии
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: [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]
Настройте 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
backtestEngine
| equityCurve
| runBacktest
| summary
| timetable
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.