March 5th, 2015

Главная ошибка системного трейдера

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

Что такое торговая стратегия? Это некое преобразование исходных ценовых графиков в торговую эквити. Преобразование осуществляется посредством исполнения сигналов, неважно руками или роботом. Важно, что в итоге вы получаете некий график, основываясь на который вы принимаете решения. Только если в случае дискреционного трейдинга эти решения касаются открытия/закрытия позиций, в случае системного трейдера эти решения касаются принятия/отказа от данной конкретной торговой стратегии или выбора стратегии из ряда альтернатив.

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

А тайминг рыночных движений, как много раз доказано - это основной способ слива собственных денег широкому рынку. Есть даже мнение, и не только мое, что долгосрочный рост фондовых рынков обеспечен ошибками тайминга трейдеров. Трейдеры эмоционируют, входят-выходят из рынка в самые неудачные моменты, а слитые рынку деньги в итоге в основном приходят к долгосрочным инвесторам, которые сидят крепко в своих портфелях, стоически пересиживая любые колебания индексов.

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

В случае акций хорошие недавние результаты обычно ведут к посредственным результатам в будущем и наоборот. Почему это должно быть иначе в случае торговых систем? Ваша система может обгонять buy&hold в долгосрочном периоде, но она точно так же подвержена влиянию краткосрочных рыночных особенностей, как и собственно акции. Эти особенности, факторы - они приходят и уходят, и часто делают это циклично. Результаты “лучше среднего”, полученные торговой стратегией за недавний период, могут означать посредственные перспективы в будущем, потому что фактор, обеспечивший стратегии успех, не вечен.

Можно оценить примерные временные горизонты действия факторов ориентируясь на уже достаточно изученные факторы моментума и долгосрочного возврата к среднему. Моментум действует 3-6 месяцев. Долгосрочный возврат к среднему это 3-5 лет. Что это значит? Это может означать, что если стратегия отлично себя вела последние полгода, у нее есть шансы продержаться еще квартал или два. Но если стратегия подозрительно хорошо себя вела несколько последних лет подряд - лучше готовиться к тому, что ее результаты за будущий год могут огорчить.

Подводя итог - если вы таймите собственную эквити, делайте это с умом. Если вы постоянно прыгаете из просадки в “лидера”, ваша торговля может оказаться нескончаемой чередой просадок, тогда как выброшенные в моменты сомнений системы будут цвести и плодоносить.

Системный трейдинг ограждает трейдера от некоторых ошибок, но он не ограждает трейдера от всех ошибок. Некоторые ошибки вам все равно придется делать вместо робота.

Автор: mehanizator
http://www.long-short.ru/post/glavnaya-oshibka-sistemnogo-treydera-581
  • Current Mood
    работаю

Для удобства WL

Все знают как порой бывает неудобен интерфейс нового WealthLab. Например, у нас открыт график, но для того чтобы посмотреть на сколько акций (контрактов) и по какой цене выставлять ордер, нам надо перейти во вкладку Alerts, там запомнить количество акций (контрактов), цену ордера и перейти обратно в график чтобы визуально посмотреть где будет ордер. Но пока будете рассматривать график, уже забудете количество акций или цену, или и то и другое. В старом WealthLab было все продумано и ордера появлялись внизу графика, поэтому никуда переключаться не было нужды.

Поэтому, для удобства рекомендую создать новую панель и туда вынести описание ордера, например вот так:



Но, интересно, что стандартным способом получалось что ордера на открытие позиции отображались правильно, а на закрытие позиции цена всегда была равна нулю. Пришлось написать на форум WealthLab, где быстро получил ответ от Eugene (это их главный представитель) о том что напрямую это сделать не получится, так как что-то там у них не так, но можно все провернуть окольными путями. И привел пример кода.
http://www.wealth-lab.com/Forum/Posts/Alert-BasisPrice-is-zero-for-sell-orders-35546

Вроде бы все работает нормально. Только одна незначительная загвоздка теперь. Если тестировать фьючерсы, то, как и прежде, ордера на открытие позиции отображаются нормально, а вот на закрытие позиции получается что-то такое:

Sell 1 contract of ES at Stop 2097.826256522141421

Правильнее было бы, конечно так:

Sell 1 contract of ES at Stop 2097.75

Потому что шаг цены для фьючерса ES -- 0,25.

Если интересно, привожу код. Пример системы -- покупаем на пробой двухбарного канала по high, продаем на пробой двухбарного канала по low. Остальной код для отображения ордера в верхней панели:

[Spoiler (click to open)]
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;

namespace WealthLab.Strategies
{
   public class MyStrategy : WealthScript
   {
      protected override void Execute()
      {
         ChartPane zPane = CreatePane( 10, true, true );
         Font font = new Font("Arial", 10, FontStyle.Regular);
         
         for(int bar = 20; bar < Bars.Count; bar++)
         {
            if (IsLastPositionActive)
            {
               Position p = LastPosition;
               double exitPrice = Lowest.Value(bar, Low, 2);
               p.Tag = (object)exitPrice;
               SellAtStop(bar+1, p, exitPrice);
            }
            else
            {
               BuyAtStop(bar+1, Highest.Value(bar, High, 2));
            }
            for( int i = 0; i < Alerts.Count; i++ )
            {
               WealthLab.Alert a = Alerts[i];
               bool exit = (a.AlertType == TradeType.Sell || a.AlertType == TradeType.Cover);
               string basis = exit == true ? ((double)a.Position.Tag).ToString() : a.BasisPrice.ToString();
               DrawText( zPane, a.AlertType + " " + a.Shares + " contracts of " + a.Symbol + " at " + a.OrderType + " " + basis, 
                  0, 0, Color.White, Color.Black, font);
            }
         }
      }
   }
}