Сгенерируйте сводную таблицу результатов backtest
генерирует таблицу метрик, чтобы обобщить backtest. Каждая строка таблицы является расчетной метрикой, и каждый столбец представляет стратегию. Необходимо запустить функцию summary только после выполнения summaryTable
= summary(backtester
)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)
Исследуйте подробные результаты
После того, как вы запускаете 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]);
Положения
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
Оборот
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 (%)');
BuyCost и SellCost
BuyCost
и SellCost
расписания содержат комиссионные за транзакции на временной шаг за каждый тип транзакции, покупок и продаж.
totalCost = sum(backtester.BuyCost{:,:}) + sum(backtester.SellCost{:,:}); bar(totalCost); title('Total Transaction Costs'); ylabel('$') set(gca,'xticklabel',[strategies.Name])
Сгенерируйте кривую акции
Используйте equityCurve
построить кривую акции для равных взвешенных и обратных стратегий отклонения.
equityCurve(backtester)
Восстановите равновесие функций
Этот раздел содержит реализацию функций восстановления равновесия стратегии. Для получения дополнительной информации о создании стратегий и записи функций восстановления равновесия, смотрите 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
backtester
— Механизм BacktestingbacktestEngine
объектМеханизм Backtesting в виде backtestEngine
объект. Используйте backtestEngine
создать backtesting механизм и затем использовать runBacktest
запускать backtest.
Типы данных: object
summaryTable
— Метрики, подводящие итог backtestМетрики, обобщающие backtest, возвращенный как таблица, где каждая строка таблицы является расчетной метрикой и каждым столбцом, представляют стратегию. Метрики, о которых сообщают, следующие:
TotalReturn
— Совокупный доход стратегии по целому backtest
SharpeRatio
— Отношение Шарпа для каждой стратегии
Volatility
— Энергозависимость каждой стратегии по backtest
AverageTurnover
— Средний оборот на временной шаг как десятичный процент
MaxTurnover
— Максимальный оборот в одном временном шаге
AverageReturn
— Средняя доходность на временной шаг
MaxDrawdown
— Максимальный спад портфеля как десятичный процент
AverageBuyCost
— Средние операционные издержки на временной шаг для покупок актива
AverageSellCost
— Средние операционные издержки на временной шаг для продаж актива
backtestStrategy
| backtestEngine
| runBacktest
| equityCurve
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.