exponenta event banner

backtestEngine

Создать backtestEngine объект для обратного тестирования стратегий и анализа результатов

Описание

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

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

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

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

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

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

  5. Использовать summary для суммирования результатов обратного тестирования в табличном формате.

Для получения дополнительной информации об этом потоке операций см. Бэктест инвестиционных стратегий.

Создание

Описание

пример

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

пример

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

Входные аргументы

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

Стратегии обратного тестирования, указанные как вектор 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 является десятичным процентом и представляет безрисковую ставку за один шаг в бэктесте. Например, если при тестировании используется ежедневная цена основного средства, то RiskFreeRate значение должно быть суточной нормой прибыли за наличные.

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

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

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

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

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

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

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

Определяет, как использует механизм обратного тестирования 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

Свойства

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

Стратегии обратного тестирования, указанные как вектор backtestStrategy объекты.

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

Безрисковая скорость, указанная как скалярное число.

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

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

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

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

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

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

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

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

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

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

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

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

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

Возврат стратегии, a NumTimeStepsоколо-NumStrategies график возврата стратегии. Возврат выполняется за шаг времени. Например, если вы используете дневные цены с runBacktest, то Returns - ежедневная доходность стратегии. Returns пуст, пока не будет выполнен обратный тест с помощью runBacktest функция.

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

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

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

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

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

Оборот стратегии, a NumTimeStepsоколо-NumStrategies расписание. Turnover пуст, пока не будет выполнен обратный тест с помощью runBacktest функция.

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

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

Операционные издержки для покупки активов каждой стратегии, a NumTimeStepsоколо-NumStrategies расписание. BuyCost пуст, пока не будет выполнен обратный тест с помощью runBacktest функция.

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

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

Операционные издержки для продажи активов каждой стратегии, a NumTimeStepsоколо-NumStrategies расписание. SellCost пуст, пока не будет выполнен обратный тест с помощью runBacktest функция.

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

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

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

Примеры

свернуть все

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

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

Определение инвестиционной стратегии с помощью backtestStrategy функция. Этот пример создает простую стратегию инвестиций с равным весом, которая одинаково инвестирует по всем активам. Дополнительные сведения о создании стратегий обратного тестирования см. в разделе 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]

Задать свойства модуля обратного тестирования

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

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

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

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

Ставка заимствования денежных средств

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

% 6% annualized margin interest rate
cashBorrowRate = 0.06;

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

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

% Start backtest with $1M
initPortfolioValue = 1000000;

Создать механизм бэктеста

Используя подготовленные свойства, создайте механизм обратного тестирования с помощью 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 объект с результатами обратного тестирования. Для анализа доступны ежедневные значения доходности портфеля, позиций активов, оборота и операционных затрат.

% 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