Последовательность имеет значение

Как было сказано в прошлой заметке, тестирование любой торговой системы даёт три блока данных, характеризующих её работу: график капитала (equity), набор совершённых сделок и набор числовых метрик. Темой этой заметки является знакомство с ещё одним способом оценки стабильности торговой системы, суть которого состоит в анализе влияния очерёдности совершённых сделок на генерируемый системой капитал.

Существует достаточно много коммерческих программных пакетов, реализующих анализ торговых стратегий посредством применения так называемого «метода Монте-Карло». Метод Монте-Карло не является сугубо биржевым термином. В его основе лежит вероятностный подход к анализу различных проблем и процессов; изначально метод Монте-Карло был разработан в рамках Американского проекта по созданию атомной бомбы.

В применении к торговле, метод Монте-Карло работает достаточно просто. Исходными данными служат сделки, которые торговая стратегия осуществила в процессе исторического тестирования. В рамках метода, производится достаточно большое количество испытаний, каждое из которых представляет собой симуляцию поведения торговой системы, которая совершала бы сделки не в исходной, но в случайной последовательности. В рамках каждого испытания, исходная последовательность сделок «перемешивается» случайным образом, после чего производится расчёт интересующих торговых метрик и генерируемой линии капитала. Результаты испытаний систематизируются и подвергаются статистическому анализу.

Я могу порекомендовать пакет System Analyzer в качестве полноценного и недорогого продукта, который позволяет осуществлять разносторонний анализ работы торговый стратегий, в том числе с применением метода Монте-Карло. Входными данными для пакета служат результаты совершённых стратегией сделок, записанные в обычный текстовый файл. Ниже я покажу, как получить текстовые данные по сделкам из кода на языке Wealth Script (языка пакета Wealth-Lab Developer 3 и 4), а так же пример работы метода Монте-Карло, реализованный с помощью Excel.

В качестве примера, я взял стратегию из заметки о тестировании торговой системы на синтетических данных и добавил в неё код экспорта результатов совершённых сделок. Вот полный исходный код стратегии:

// Переменные оптимизации
{#OptVar1 5; 1; 30; 1}
{#OptVar2 1; 1; 30; 1}

// Параметры торговой стратегии
var nHighPeriod: integer = #OptVar1;
var nLowPeriod: integer  = #OptVar2;

var nStartBar: integer = Int(Max(nHighPeriod, nLowPeriod)) - 1;

// Расчёт границ канала
var serHigh: integer = HighestSeries(#High, nHighPeriod);
var serLow: integer  = LowestSeries(#Low, nLowPeriod);

PlotStops();

// Основной цикл
var nBar: integer;
for nBar := nStartBar to BarCount() - 1 do
begin
    if not LastPositionActive() then
    begin
        if not BuyAtStop(nBar + 1, @serHigh[nBar], 'Enter') then
            ShortAtStop(nBar + 1, @serLow[nBar], 'Enter')
    end
    else
    begin
        var nPos: integer = LastPosition();
        if PositionLong(nPos) then
            SellAtStop(nBar + 1, @serLow[nBar], nPos, 'Exit')
        else
            CoverAtStop(nBar + 1, @serHigh[nBar], nPos, 'Exit');
    end;
end;

// Визуализация
HideVolume();

PlotSeriesLabel(serHigh, 0, #Blue, #Thin, 'High');
PlotSeriesLabel(serLow,  0, #Red,  #Thin, 'Low');

// Запись финансового результата совершённых сделок в файл
var nFile: integer = FileOpen('c:\Trades.csv');
FileClear(nFile);

var nPos: integer;
for nPos := 0 to PositionCount() - 1 do
begin
    if not PositionActive(nPos) then
    begin
        var fProfit: float = PositionProfit(nPos);
        FileWrite(nFile, FormatFloat('0.00', fProfit));
    end;
end;

FileClose(nFile);

Код экспорта начинается от комментария «Запись финансового результата совершённых сделок в файл». После того, как стратегия будет запущена на интересующих данных, на диске C будет создан файл «Trades.csv», каждая строка в котором отображает финансовый результат одной сделки, выраженный в деньгах. После теста стратегии на данных по обыкновенным акциям Сбербанка, использовавшихся в заметке о работе системы на синтетике, файл будет выглядеть так (на картинке показано его начало, всего же в файле содержатся данные по 125 сделкам):

Начнём создание рабочей формы Excel с копирования данных по сделкам на лист:

Для осуществления «перемешивания» сделок, будем использовать случайные числа так же, как это делалось в заметке о создании синтетических ценовых данных. Добавим столбец со случайными числами (используем формулу RAND()):

После этого, скопируем значения из первого столбца в третий столбец:

Содержимое третьего столбца и будет подвергаться «перемешиванию». В четвёртом столбце запрограммируем расчёт equity. Первое значение столбца нулевое:

Все последующие значения являются суммой предыдущего значения equity и финансового результата очередной сделки:

В итоге, после копирования формулы из третьей ячейки четвёртого столбца во все прочие ячейки этого же столбца, рабочая форма будет выглядеть следующим образом:

Завершает создание формы добавление графика, отображающего линию капитала для текущей последовательности сделок. График исходной последовательности выглядит так:

Для расстановки результатов сделок случайным образом, необходимо выделить данные во втором и третьем столбцах, после чего отсортировать их по значениям второго столбца:

После нажатия кнопки «OK», результаты сделок будут перемешаны, а график equity пересчитан:

Каждая новая сортировка даст новую линию капитала, которая могла бы быть в действительности, если бы сделки, имевшие место быть в реальной торговле, были бы осуществлены в другом порядке. Конечное значение линии капитала не меняется, но весьма существенно меняется траектория, по которой сумма на счету добралась до него.

Приведу ещё два примера возможных графиков equity.

Пример 1:

Пример 2:

Созданная рабочая форма позволяет визуально оценивать возможные варианты, точный же количественный анализ Монте-Карло симуляций разбирается в уже рекомендованной мною книге Modeling Trading System Performance, а так же реализуется в упомянутом выше пакете Market System Analyzer. Анализ по методу Монте-Карло позволяет не только делать выводы о надёжности торговой стратегии, но и находить способ управления размером позиции (Money Management), оптимальный для конкретной МТС.

Назад   На оглавление   Вперед

Написать администратору