backtestEngine

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

Описание

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

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

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

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

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

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

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

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

Создание

Описание

пример

backtester = backtestEngine(strategies) создает backtestEngine объект. Используйте backtestEngine возразите против backtest торговым стратегиям портфеля, заданным в 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. Например, если backtest использует ежедневные данные цен активов, то RiskFreeRate значение должно быть суточной ставкой возврата для наличных денег.

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

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

Если RatesConvention "Annualized", затем CashBorrowRate задает годовой показатель.

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

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

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

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

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

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

  • 'PerStep' — Уровни обработаны уровни, согласно шагу и backtest механизм вычисляют интерес на предоставленных уровнях на каждом шаге backtest.

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

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

  •  0 = фактический/фактический

  •  1 = 30/360 (СИА)

  •  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 = ШИНА/252

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

Примечание

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

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

Свойства

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

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

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

Безрисковый уровень в виде числового скаляра.

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

Наличный ссудный процент в виде числового скаляра.

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

Начальная стоимость портфеля в виде числового скаляра.

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

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

Типы данных: логический

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры

свернуть все

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

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

Задайте инвестиционную стратегию при помощи 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]

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

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

Безрисковый уровень

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

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

Наличные деньги одалживают уровень

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

% 6% annualized margin interest rate
cashBorrowRate = 0.06;

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

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

% Start backtest with $1M
initPortfolioValue = 1000000;

Создайте Engine Backtest

Используя подготовленные свойства, создайте backtesting механизм с помощью 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: []

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

Загрузите данные и запущенный Backtest

Запустите backtest по ежедневным ценовым данным из 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');

Запустите backtest использование 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]

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

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

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

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

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

equityCurve(backtester)

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

Введенный в R2020b