Страницы

2013-02-11

Трендслежение для американских акций

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

А что если обойти этот момент со стопами. Например, привязаться к индексу. Если QQQ пробивает свою месячную вершину, то на следующий день купить на открытии сессии портфель из десяти акций, входящих в состав индекса Nasdaq100. Почему наздак100? Потому что на пути индекса вверх возникнет поддержка институциональных игроков, которые как раз и двигают рынок, покупая надежные акции, входящие в индексы, а индекс насдак100 всегда растет лучше других индексов на растущем рынке.

Но тут же возникает вопрос -- какие именно 10 компаний выбрать из индекса, состоящего из 100 компаний. Можно попробовать те компании, у которых на данный момент сложился самый сильный тренд. То есть просто отсортируем 10 компаний по индикатору ADX -- те, у которых самые большие показатели этого индикатора.

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

Пишем код:



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()
{
Bars external = GetExternalSymbol("z_ETFs", "SPY", true);
DataSeries extH = Highest.Series(external.High, 20);
DataSeries extL = Lowest.Series(external.Low, 20);
DataSeries HH = Highest.Series(High, 20);
DataSeries LL = Lowest.Series(Low, 20);
DataSeries ADXX = ADX.Series(Bars, 14);

ChartPane pane1 = CreatePane(75,true,true);
PlotSymbol(pane1, external, Color.Black, Color.Red);
PlotSeries(pane1, extH, Color.Black, LineStyle.Solid, 2);
PlotSeries(pane1, extL, Color.Black, LineStyle.Solid, 2);


for(int bar = GetTradingLoopStartBar(21); bar < Bars.Count; bar++)
{
if (IsLastPositionActive)
{
Position p = LastPosition;
if (p.EntrySignal.Contains("Group1|"))
{
if (extL[bar-1] > external.Close[bar])
{
SellAtMarket(bar + 1, p, "Group1");
}
}

}
else
{
if (extH[bar-1] < external.Close[bar])
{
if (BuyAtMarket(bar + 1, "Group1|")!= null )

LastActivePosition.Priority = ADXX[bar];

}

}
}
}
}
}



-----------------------------------------------------------


Тестируем:





Получили среднегодовую доходность 20% при средней длительности позиции почти 60 дней или 3 месяца. Просадка тоже около 20%. Но 2011 год завершили в минусе.

Что можно тут усовершенствовать. На мой взгляд, то что QQQ быстрее других индексов растет на бычьем рынке, имеет обратную сторону медали -- наверняка и больше ложных срабатываний на вход. А что если попробовать более медленный, консервативный индекс DIA.

Меняем QQQ на DIA и тестируем:





Ну вот, немного получше. Доходность увеличилась до 21,5%, просадка уменьшилась до 15,5%. А 2011 год почти в нуле.

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

Тестируем:





Ну вообще круто получилось -- доходность почти 29%, просадка уменьшилась до 9%. И все года прибыльные!

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

Получаем 59% годовых при максимальной просадке 17.5%. Позиция держится в среднем 58 дней.

Теперь код выглядит так:

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()
{
Bars external = GetExternalSymbol("z_ETFs", "DIA", true);
DataSeries extH = Highest.Series(external.High, 20);
DataSeries extL = Lowest.Series(external.Low, 20);
DataSeries HH = Highest.Series(High, 20);
DataSeries LL = Lowest.Series(Low, 20);
DataSeries ADXX = ADX.Series(Bars, 14);

ChartPane pane1 = CreatePane(75,true,true);
PlotSymbol(pane1, external, Color.Black, Color.Red);
PlotSeries(pane1, extH, Color.Black, LineStyle.Solid, 2);
PlotSeries(pane1, extL, Color.Black, LineStyle.Solid, 2);


for(int bar = GetTradingLoopStartBar(21); bar < Bars.Count; bar++)
{
if (IsLastPositionActive)
{
Position p = LastPosition;
if (p.EntrySignal.Contains("Group1|"))
{
if (extL[bar-1] > external.Close[bar])
{
SellAtMarket(bar + 1, p, "Group1");
}
}

}
else
{
if (extH[bar-1] < external.Close[bar])
{
if (BuyAtMarket(bar + 1, "Group1|")!= null )

LastActivePosition.Priority = Close[bar];

}

}
}
}
}
}

Ну вот, начало положено. Дальше можно развивать эту тему.

Какие недостатки:

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

Комментариев нет:

Отправить комментарий