backtestEngine

Создание backtestEngine возражает против стратегий backtest и анализирует результаты

Описание

Создайте backtestEngine проведение теста портфельных инвестиционных стратегий на основе исторических данных.

Используйте этот рабочий процесс для разработки и запуска бэктеста:

  1. Определите логику стратегии с помощью backtestStrategy объект, чтобы определить, как стратегия восстанавливает баланс портфеля активов.

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

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

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

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

Для получения дополнительной информации об этом рабочем процессе смотрите Backtest Investment Strategies.

Создание

Описание

пример

backtester = backtestEngine(strategies) создает backtestEngine объект. Используйте backtestEngine объект для обратной проверки стратегий торговли портфелем, определенных в backtestStrategy объекты.

пример

backtester = backtestEngine(___,Name,Value) устанавливает свойства с помощью аргументов пары "имя-значение" и любого из аргументов в предыдущем синтаксисе. Можно задать несколько аргументы пары "имя-значение". Для примера, backtester = backtestEngine(strategies,'RiskFreeRate',0.02,'InitialPortfolioValue',1000,'RatesConvention',"Annualized",'Basis',2).

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

расширить все

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

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

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

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

Пример: backtester = backtestEngine(strategies,'RiskFreeRate',0.02,'InitialPortfolioValue',1000,'RatesConvention',"Annualized",'Basis',2)

Безрисковая ставка, заданная как разделенная разделенными запятой парами, состоящая из 'RiskFreeRate' и скалярным числом.

Если RatesConvention является "Annualized", затем RiskFreeRate задает годовую ставку.

Если RatesConvention является "PerStep", затем RiskFreeRate является десятичным процентом и представляет скорость свободного риска для одного временного шага в обратном тесте. Например, если backtest использует ежедневные данные цены основного средства, то RiskFreeRate значение должно быть дневной нормой возврата за наличные.

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

Ставка заимствования денежных средств, заданная как разделенная разделенными запятой парами, состоящая из 'CashBorrowRate' и скалярным числом. The CashBorrowRate определяет ставку начисления процентов по отрицательным остаткам денежных средств (марже) во время бэктеста.

Если RatesConvention является "Annualized", затем CashBorrowRate задает годовую ставку.

Если RatesConvention является "PerStep", затем CashBorrowRate значение является десятичным процентом и представляет собой ставку начисления процентов для одного временного шага в бэктесте. Например, если backtest использует ежедневные данные цены основного средства, то CashBorrowRate значение должно быть суточной процентной ставкой для отрицательных остатков денежных средств.

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

Начальное значение портфеля, заданное как разделенная разделенными запятой парами, состоящая из 'InitialPortfolioValue' и скалярным числом.

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

Определяет, как backtest engine использует RiskFreeRate и CashBorrowRate для вычисления интереса, заданного как разделенная разделенными запятой парами, состоящая из 'RatesConvention' и вектор символов или строка.

  • 'Annualized' - Ставки рассматриваются как годовые ставки, и самый обратный механизм вычисляет дополнительные проценты на основе соглашения о отсчете дней, указанного в Basis свойство. Это значение по умолчанию.

  • 'PerStep' - Ставки обрабатываются по шаговым ставкам, и самый задний тест вычисляет проценты по предоставленным ставкам на каждом шаге обратного теста.

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

Определяет соглашение о отсчете дней при вычислении интереса в RiskFreeRate или CashBorrowRate, заданная как разделенная разделенными запятой парами, состоящая из 'Basis' и скаляр целое число с использованием поддерживаемого значения:

  • 0 = факт/факт

  • 1 = 30/360 (SIA)

  • 2 = факт/360

  • 3 = факт/365

  • 4 = 30/360 (PSA)

  • 5 = 30/360 (ISDA)

  • 6 = 30/360 (европейский)

  • 7 = факт/365 (японский)

  • 8 = факт/факт (ICMA)

  • 9 = факт/360 (ICMA)

  • 10 = факт/365 (ICMA)

  • 11 = 30/360E (ICMA)

  • 12 = факт/365 (ISDA)

  • 13 = BUS/252

Для получения дополнительной информации см. раздел Базиса.

Примечание

Basis используется только тогда, когда RatesConvention для свойства задано значение "Annualized". Если на RatesConvention является "PerStep", и Basis задан, backtestEngine игнорирует Basis значение.

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

Свойства

расширить все

Стратегии Backtest, заданные как вектор backtestStrategy объекты.

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

Скорость без риска, заданная в виде скалярного числа.

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

Ставка заимствования денежных средств, заданная в виде скалярного числа.

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

Начальное значение портфеля, заданное как скалярное число.

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

Используйте годовые ставки для RiskFreeRate и CashBorrowRate, заданный как скалярная логика.

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

Дневной подсчет годовых ставок для RiskFreeRate и CashBorrowRate, заданное скалярное целое число.

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

Это свойство доступно только для чтения.

Количество активов во вселенной портфеля, число. NumAssets определяется из расписания скорректированных цен, переданных в runBacktest. NumAssets пуст, пока вы не запустите backtest, используя runBacktest функция.

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

Это свойство доступно только для чтения.

Стратегические возвраты, NumTimeSteps-by- NumStrategies расписание возвратов стратегии. Возвраты указаны для каждого временного шага. Для примера, если вы используете ежедневные цены с runBacktest, затем Returns - ежедневная стратегия возвратов. Returns пуст, пока вы не запустите backtest, используя runBacktest функция.

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

Это свойство доступно только для чтения.

Позиции основных средств для каждой стратегии, структура, содержащая NumTimeSteps-by- NumAssets расписание должностей активов по каждой стратегии. Например, если вы используете ежедневные цены в runBacktest, затем Positions структура содержит расписания, содержащие ежедневные позиции активов. Positions пуст, пока вы не запустите backtest, используя runBacktest функция.

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

Это свойство доступно только для чтения.

Оборот стратегии, а NumTimeSteps-by- NumStrategies timetable. Turnover пуст, пока вы не запустите backtest, используя runBacktest функция.

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

Это свойство доступно только для чтения.

Транзакционные затраты для покупок основных средств каждой стратегии a NumTimeSteps-by- NumStrategies timetable. BuyCost пуст, пока вы не запустите backtest, используя runBacktest функция.

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

Это свойство доступно только для чтения.

Транзакционные затраты для продаж основных средств каждой стратегии a NumTimeSteps-by- NumStrategies timetable. SellCost пуст, пока вы не запустите backtest, используя runBacktest функция.

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

Функции объекта

runBacktestЗапуск backtest на одной или нескольких стратегиях
summaryСгенерируйте сводную таблицу результатов бэктеста
equityCurveПостройте кривые собственного капитала стратегий

Примеры

свернуть все

Используйте механизм обратного тестирования в MATLAB ®, чтобы запустить backtest инвестиционной стратегии в течение временных рядов рыночных данных. Можно задать механизм обратного тестирования при помощи backtestEngine объект. A backtestEngine Объект устанавливает свойства обратного тестирования окружения, такие как скорость без риска, и хранит результаты бэктеста. В этом примере можно создать механизм обратного тестирования, чтобы запустить простой бэктест и изучить результаты.

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

Определите инвестиционную стратегию при помощи backtestStrategy функция. Этот пример создает простую равновзвешенную инвестиционную стратегию, которая одинаково инвестирует во все активы. Для получения дополнительной информации о создании стратегий backtest смотрите backtestStrategy.

% The rebalance function is simple enough that you can use an anonymous function
equalWeightRebalanceFcn = @(current_weights,~) ones(size(current_weights)) / numel(current_weights);

% Create the strategy
strategy = backtestStrategy("EqualWeighted",equalWeightRebalanceFcn,...
    'RebalanceFrequency',20,...
    'TransactionCosts',[0.0025 0.005],...
    'LookbackWindow',0)
strategy = 
  backtestStrategy with properties:

                  Name: "EqualWeighted"
          RebalanceFcn: [function_handle]
    RebalanceFrequency: 20
      TransactionCosts: [0.0025 0.0050]
        LookbackWindow: 0
        InitialWeights: [1x0 double]

Установите свойства Backtesting Engine

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

Безрисковая ставка

The RiskFreeRate свойство содержит процентную ставку, заработанную за неинвестированный капитал (то есть денежные средства). Когда сумма весов портфеля ниже 1, оставшийся капитал инвестируется в наличные и зарабатывает безрисковый тариф. Безрисковая ставка и ставка заимствования денежных средств могут быть определены в годовом исчислении или как явные процентные ставки «за временной шаг». The RatesConvention свойство используется, чтобы задать, как backtestEngine интерпретирует две скорости (интерпретация по умолчанию - «Annualized»). В данном примере установите ставку без риска 2% в годовом выражении.

% 2% annualized risk-free rate
riskFreeRate = 0.02;

Ставка заимствования наличными

The CashBorrowRate свойство устанавливает ставку начисления процентов, применяемую к отрицательным остаткам денежных средств. Если в любое время вес портфеля равен значению, превышающей 1, то денежная позиция отрицательна на сумму, превышающую 1. Такое поведение весов портфеля аналогично заимствованию капитала на марже для инвестирования с кредитным плечом. Как и RiskFreeRate свойство, CashBorrowRate свойство может быть либо ежегодно, либо в зависимости от значения RatesConvention свойство.

% 6% annualized margin interest rate
cashBorrowRate = 0.06;

Начальное значение портфеля

The InitialPortfolioValue свойство устанавливает значение портфеля в начале бэктеста для всех стратегий. По умолчанию это 10 000 долларов.

% Start backtest with $1M
initPortfolioValue = 1000000;

Создайте Backtest Engine

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

% The backtesting engine takes an array of backtestStrategy objects as the first argument
backtester = backtestEngine(strategy,...
    'RiskFreeRate',riskFreeRate,...
    'CashBorrowRate',cashBorrowRate,...
    'InitialPortfolioValue',initPortfolioValue)
backtester = 
  backtestEngine with properties:

               Strategies: [1x1 backtestStrategy]
             RiskFreeRate: 0.0200
           CashBorrowRate: 0.0600
          RatesConvention: "Annualized"
                    Basis: 0
    InitialPortfolioValue: 1000000
                NumAssets: []
                  Returns: []
                Positions: []
                 Turnover: []
                  BuyCost: []
                 SellCost: []

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

Загрузка данных и запуск бэктеста

Запустите бэктест по ежедневным ценовым данным из 30 запасов компонентов DJIA.

% Read table of daily adjusted close prices for 2006 DJIA stocks
T = readtable('dowPortfolio.xlsx');

% Remove the DJI index column and convert to timetable
pricesTT = table2timetable(T(:,[1 3:end]),'RowTimes','Dates');

Запуск бэктеста с помощью runBacktest функция.

backtester = runBacktest(backtester,pricesTT)
backtester = 
  backtestEngine with properties:

               Strategies: [1x1 backtestStrategy]
             RiskFreeRate: 0.0200
           CashBorrowRate: 0.0600
          RatesConvention: "Annualized"
                    Basis: 0
    InitialPortfolioValue: 1000000
                NumAssets: 30
                  Returns: [250x1 timetable]
                Positions: [1x1 struct]
                 Turnover: [250x1 timetable]
                  BuyCost: [250x1 timetable]
                 SellCost: [250x1 timetable]

Исследуйте результаты

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

% Generate a histogram of daily portfolio returns
histogram(backtester.Returns{:,1})
title('Daily Portfolio Returns')

Figure contains an axes. The axes with title Daily Portfolio Returns contains an object of type histogram.

Использование equityCurve для построения кривой собственного капитала для простой равновзвешенной инвестиционной стратегии.

equityCurve(backtester)

Figure contains an axes. The axes with title Equity Curve contains an object of type line. This object represents EqualWeighted.

Введенный в R2020b