summary

Сгенерируйте сводную таблицу результатов backtest

Описание

пример

summaryTable = summary(backtester) генерирует таблицу метрик, чтобы обобщить backtest. Каждая строка таблицы является расчетной метрикой, и каждый столбец представляет стратегию. Необходимо запустить функцию summary только после выполнения runBacktest функция.

Примеры

свернуть все

MATLAB® backtesting механизм запускает backtests стратегий портфельных инвестиций в зависимости от времени серия данных цен активов. Можно использовать summary сравнить несколько стратегий по тому же сценарию рынка. В этом примере показано, как исследовать результаты backtest с двумя стратегиями.

Загрузка данных

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

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

% Prune the table to include only the dates and selected stocks
timeColumn = "Dates";
assetSymbols = ["BA", "CAT", "DIS", "GE", "IBM", "MCD", "MSFT"];
T = T(:,[timeColumn assetSymbols]);

% Convert to timetable
pricesTT = table2timetable(T,'RowTimes','Dates');

% View the final asset price timetable
head(pricesTT)
ans=8×7 timetable
       Dates        BA       CAT      DIS      GE       IBM      MCD     MSFT 
    ___________    _____    _____    _____    _____    _____    _____    _____

    03-Jan-2006    68.63    55.86    24.18     33.6    80.13    32.72    26.19
    04-Jan-2006    69.34    57.29    23.77    33.56    80.03    33.01    26.32
    05-Jan-2006    68.53    57.29    24.19    33.47    80.56    33.05    26.34
    06-Jan-2006    67.57    58.43    24.52     33.7    82.96    33.25    26.26
    09-Jan-2006    67.01    59.49    24.78    33.61    81.76    33.88    26.21
    10-Jan-2006    67.33    59.25    25.09    33.43     82.1    33.91    26.35
    11-Jan-2006     68.3    59.28    25.33    33.66    82.19     34.5    26.63
    12-Jan-2006     67.9    60.13    25.41    33.25    81.61    33.96    26.48

Обратная стратегия отклонения требует, чтобы некоторая ценовая история инициализировала, таким образом, можно выделить фрагмент данных, чтобы использовать для установки начальных весов. Путем выполнения этого вы можете "горячий запуск" backtest.

warmupRange = 1:20;
testRange = 21:height(pricesTT);

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

Задайте инвестиционную стратегию при помощи backtestStrategy функция. Этот пример создает две стратегии:

  • Равный взвешенный

  • Обратное отклонение

Этот пример не предоставляет подробную информацию о том, как создать стратегии. Для получения дополнительной информации о создании стратегий смотрите backtestStrategy. Функции восстановления равновесия стратегии реализованы в разделе Rebalance Functions.

% Create the strategies
ewInitialWeights = equalWeightFcn([],pricesTT(warmupRange,:));
ewStrategy = backtestStrategy("EqualWeighted",@equalWeightFcn,...
    'RebalanceFrequency',20,...
    'TransactionCosts',[0.0025 0.005],...
    'LookbackWindow',0,...
    'InitialWeights',ewInitialWeights);

ivInitialWeights = inverseVarianceFcn([],pricesTT(warmupRange,:));
ivStrategy = backtestStrategy("InverseVariance",@inverseVarianceFcn,...
    'RebalanceFrequency',20,...
    'TransactionCosts',[0.0025 0.005],...
    'InitialWeights',ivInitialWeights);

% Aggregate the strategies into an array
strategies = [ewStrategy ivStrategy];

Запустите Backtest

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

% Create the backtesting engine using the default settings
backtester = backtestEngine(strategies)
backtester = 
  backtestEngine with properties:

               Strategies: [1x2 backtestStrategy]
             RiskFreeRate: 0
           CashBorrowRate: 0
          RatesConvention: "Annualized"
                    Basis: 0
    InitialPortfolioValue: 10000
                NumAssets: []
                  Returns: []
                Positions: []
                 Turnover: []
                  BuyCost: []
                 SellCost: []

Запустите backtest использование runBacktest.

% Run the backtest
backtester = runBacktest(backtester,pricesTT(testRange,:));

Исследуйте итоговые результаты

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

s1 = summary(backtester)
s1=9×2 table
                       EqualWeighted    InverseVariance
                       _____________    _______________

    TotalReturn            0.17567           0.17155   
    SharpeRatio           0.097946           0.10213   
    Volatility           0.0074876         0.0069961   
    AverageTurnover      0.0007014         0.0024246   
    MaxTurnover           0.021107          0.097472   
    AverageReturn       0.00073178        0.00071296   
    MaxDrawdown           0.097647          0.096299   
    AverageBuyCost        0.018532          0.061913   
    AverageSellCost       0.037064           0.12383   

Каждая строка таблицы выход является измерением эффективности стратегии. Каждая стратегия занимает столбец. summary функционируйте отчеты относительно следующих метрик:

  • TotalReturn — nonannulaized совокупный доход стратегии, включительно сборов, за полный backtest период.

  • SharpeRatio — Непересчитанное на год отношение Шарпа каждой стратегии по backtest. Для получения дополнительной информации смотрите sharpe.

  • Volatility — Непересчитанное на год стандартное отклонение стратегии на временной шаг возвращается.

  • AverageTurnover — Средний оборот портфеля на временной шаг, описанный как десятичный процент.

  • MaxTurnover — Максимальный оборот портфеля в одном восстановлении равновесия, описанном как десятичный процент.

  • AverageReturn — Среднее арифметическое наразовый портфеля шага возвращается.

  • MaxDrawdown — Максимальная просадка портфеля, описанного как десятичный процент. Для получения дополнительной информации смотрите maxdrawdown.

  • AverageBuyCost — Средние операционные издержки на временной шаг портфель понесены для покупок актива.

  • AverageSellCost — Средние операционные издержки на временной шаг портфель понесены для продаж актива.

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

s2 = rows2vars(s1);
s2.Properties.VariableNames{1} = 'StrategyName'
s2=2×10 table
       StrategyName        TotalReturn    SharpeRatio    Volatility    AverageTurnover    MaxTurnover    AverageReturn    MaxDrawdown    AverageBuyCost    AverageSellCost
    ___________________    ___________    ___________    __________    _______________    ___________    _____________    ___________    ______________    _______________

    {'EqualWeighted'  }      0.17567       0.097946      0.0074876        0.0007014        0.021107       0.00073178       0.097647         0.018532          0.037064    
    {'InverseVariance'}      0.17155        0.10213      0.0069961        0.0024246        0.097472       0.00071296       0.096299         0.061913           0.12383    

bar(s2.AverageTurnover)
title('Average Turnover')
ylabel('Average Turnover (%)')
set(gca,'xticklabel',s2.StrategyName)

Figure contains an axes object. The axes object with title Average Turnover contains an object of type bar.

Исследуйте подробные результаты

После того, как вы запускаете backtest, backtestEngine обновления объекта поля только для чтения подробными результатами backtest. Returns, Positions, Turnover, BuyCost, и SellCost свойства каждый содержит расписание результатов. Начиная с этого примера использование ежедневные ценовые данные в backtest эти расписания содержат ежедневные результаты.

backtester
backtester = 
  backtestEngine with properties:

               Strategies: [1x2 backtestStrategy]
             RiskFreeRate: 0
           CashBorrowRate: 0
          RatesConvention: "Annualized"
                    Basis: 0
    InitialPortfolioValue: 10000
                NumAssets: 7
                  Returns: [230x2 timetable]
                Positions: [1x1 struct]
                 Turnover: [230x2 timetable]
                  BuyCost: [230x2 timetable]
                 SellCost: [230x2 timetable]

Возвращается

Returns свойство содержит расписание стратегии (простые) возвраты для каждого временного шага. Эти возвраты являются включенными всех комиссионных за транзакции.

head(backtester.Returns)
ans=8×2 timetable
       Time        EqualWeighted    InverseVariance
    ___________    _____________    _______________

    02-Feb-2006      -0.007553        -0.0070957   
    03-Feb-2006     -0.0037771         -0.003327   
    06-Feb-2006     -0.0010094        -0.0014312   
    07-Feb-2006      0.0053284         0.0020578   
    08-Feb-2006      0.0099755         0.0095781   
    09-Feb-2006     -0.0026871        -0.0014999   
    10-Feb-2006      0.0048374         0.0059589   
    13-Feb-2006     -0.0056868        -0.0051232   

binedges = -0.025:0.0025:0.025;
h1 = histogram(backtester.Returns.EqualWeighted,'BinEdges',binedges);
hold on
histogram(backtester.Returns.InverseVariance,'BinEdges',binedges);
hold off
title('Distribution of Daily Returns')
legend([strategies.Name]);

Figure contains an axes object. The axes object with title Distribution of Daily Returns contains 2 objects of type histogram. These objects represent EqualWeighted, InverseVariance.

Положения

Positions свойство содержит структуру расписаний, один на стратегию.

backtester.Positions
ans = struct with fields:
      EqualWeighted: [231x8 timetable]
    InverseVariance: [231x8 timetable]

Positions расписание каждой стратегии занимает позиции на временной шаг для каждого актива, а также Cash актив (который зарабатывает безрисковый уровень). Positions расписания содержат еще одну строку, чем другие расписания результатов потому что Positions расписания включают исходные положения стратегии как их первая строка. Можно рассмотреть исходные положения как Time= 0 положения портфеля. В этом примере, Positions расписания запускаются с 1 февраля, в то время как другие запускают 2 февраля.

head(backtester.Positions.InverseVariance)
ans=8×8 timetable
       Time           Cash          BA       CAT       DIS        GE       IBM       MCD       MSFT 
    ___________    ___________    ______    ______    ______    ______    ______    ______    ______

    01-Feb-2006              0    1401.2    682.17    795.14    2186.8    1900.1    1874.9    1159.8
    02-Feb-2006              0    1402.8    673.74    789.74    2170.8    1883.5    1863.6      1145
    03-Feb-2006     1.0987e-12    1386.5     671.2     787.2    2167.3    1854.3    1890.5      1139
    06-Feb-2006              0    1391.9    676.78    785.62    2161.1    1843.6    1899.1    1123.8
    07-Feb-2006              0      1400    661.66    840.23    2131.9    1851.6    1902.3    1114.5
    08-Feb-2006    -2.2198e-12    1409.8     677.9    846.58    2160.4    1878.2      1911    1113.2
    09-Feb-2006    -2.2165e-12    1414.8    674.35    840.87    2172.2      1869    1908.3    1102.6
    10-Feb-2006    -2.2297e-12    1425.1    677.29     839.6    2195.8    1890.6    1909.3    1103.9

% Plot the change of asset allocation over time
t = backtester.Positions.InverseVariance.Time;
positions = backtester.Positions.InverseVariance.Variables;
h = area(t,positions);
title('Inverse Variance Positions');
xlabel('Date');
ylabel('Asset Positions');
datetick('x','mm/dd','keepticks');
ylim([0 12000])
xlim([t(1) t(end)])
cm = parula(numel(h));
for i = 1:numel(h)
    set(h(i),'FaceColor',cm(i,:));
end

Figure contains an axes object. The axes object with title Inverse Variance Positions contains 8 objects of type area.

Оборот

Turnover расписание содержит оборот портфеля на временной шаг.

head(backtester.Turnover)
ans=8×2 timetable
       Time        EqualWeighted    InverseVariance
    ___________    _____________    _______________

    02-Feb-2006          0                 0       
    03-Feb-2006          0                 0       
    06-Feb-2006          0                 0       
    07-Feb-2006          0                 0       
    08-Feb-2006          0                 0       
    09-Feb-2006          0                 0       
    10-Feb-2006          0                 0       
    13-Feb-2006          0                 0       

В зависимости от вашей частоты восстановления равновесия, Turnover таблица может содержать в основном нули. Удаление этих нулей, когда вы визуализируете оборот портфеля, полезно.

nonZeroIdx = sum(backtester.Turnover.Variables,2) > 0;
to = backtester.Turnover(nonZeroIdx,:);
plot(to.Time,to.EqualWeighted,'-o',to.Time,to.InverseVariance,'-x',...
    'LineWidth',2,'MarkerSize',5);
legend([strategies.Name]);
title('Portfolio Turnover');
ylabel('Turnover (%)');

Figure contains an axes object. The axes object with title Portfolio Turnover contains 2 objects of type line. These objects represent EqualWeighted, InverseVariance.

BuyCost и SellCost

BuyCost и SellCost расписания содержат комиссионные за транзакции на временной шаг за каждый тип транзакции, покупок и продаж.

totalCost = sum(backtester.BuyCost{:,:}) + sum(backtester.SellCost{:,:});
bar(totalCost);
title('Total Transaction Costs');
ylabel('$')
set(gca,'xticklabel',[strategies.Name])

Figure contains an axes object. The axes object with title Total Transaction Costs contains an object of type bar.

Сгенерируйте кривую акции

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

equityCurve(backtester)

Figure contains an axes object. The axes object with title Equity Curve contains 2 objects of type line. These objects represent EqualWeighted, InverseVariance.

Восстановите равновесие функций

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

function new_weights = equalWeightFcn(current_weights, pricesTT) %#ok<INUSL> 
% Equal weighted portfolio allocation

nAssets = size(pricesTT, 2);
new_weights = ones(1,nAssets);
new_weights = new_weights / sum(new_weights);

end
function new_weights = inverseVarianceFcn(current_weights, pricesTT) %#ok<INUSL> 
% Inverse-variance portfolio allocation

assetReturns = tick2ret(pricesTT);
assetCov = cov(assetReturns{:,:});
new_weights = 1 ./ diag(assetCov);
new_weights = new_weights / sum(new_weights);

end

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

свернуть все

Механизм Backtesting в виде backtestEngine объект. Используйте backtestEngine создать backtesting механизм и затем использовать runBacktest запускать backtest.

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

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

свернуть все

Метрики, обобщающие backtest, возвращенный как таблица, где каждая строка таблицы является расчетной метрикой и каждым столбцом, представляют стратегию. Метрики, о которых сообщают, следующие:

  • TotalReturn — Совокупный доход стратегии по целому backtest

  • SharpeRatio — Отношение Шарпа для каждой стратегии

  • Volatility — Энергозависимость каждой стратегии по backtest

  • AverageTurnover — Средний оборот на временной шаг как десятичный процент

  • MaxTurnover — Максимальный оборот в одном временном шаге

  • AverageReturn — Средняя доходность на временной шаг

  • MaxDrawdown — Максимальный спад портфеля как десятичный процент

  • AverageBuyCost — Средние операционные издержки на временной шаг для покупок актива

  • AverageSellCost — Средние операционные издержки на временной шаг для продаж актива

Введенный в R2020b