Попробуем придумать что-нибудь долгосрочное для американских акций, чтобы каждый день не сидеть у монитора. Для фьючерсов обычно применяются трендследящие стратегии. Напрямую трендследящие стратегии совершенно неприменимы для торговли портфелем американских акций. Обычно при тестировании на исторических данных результат болтается у нуля или, в лучшем случае, со среднегодовой доходностью процентов 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 дней.
Теперь код выглядит так:
Ну вот, начало положено. Дальше можно развивать эту тему.
Какие недостатки:
1. Тестируется на индексе, состав которого менялся в течении периода тестирования. Мы же тестируем на сегодняшнем составе.
2. На тестируемых акциях могли быть сплиты, а мы ранжировали акции по уже измененным ценам.
3. Период тестирования мог бы быть больше. Но дело в том что чем дальше отодвигаемся от сегодняшнего дня, тем больше изменений будет в составе индекса. И те компании, которые сейчас входят в индекс могли быть просто неликвидом или их еще просто не было на бирже. Поэтому, на удаленных годах получится что мы и не состав индекса тестировали, а так, сборник неликвидов.
А что если обойти этот момент со стопами. Например, привязаться к индексу. Если 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];
}
}
}
}
}
}
-----------------------------------------------------------
Тестируем:
Что можно тут усовершенствовать. На мой взгляд, то что QQQ быстрее других индексов растет на бычьем рынке, имеет обратную сторону медали -- наверняка и больше ложных срабатываний на вход. А что если попробовать более медленный, консервативный индекс DIA.
Меняем QQQ на DIA и тестируем:
Еще одно соображение появилось. А что если десять акций отбирать не по ADX, а просто по цене. Дело в том, что большая цена акции означает что акция постоянно растет, поэтому и цена большая. А маленькая цена акции означает что она не растет и вряд ли будет расти если до сих пор не выросла. Просто и гениально. Проверим эту гипотезу.
Тестируем:
А теперь воспользуемся плечом 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];
}
}
}
}
}
}
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. Период тестирования мог бы быть больше. Но дело в том что чем дальше отодвигаемся от сегодняшнего дня, тем больше изменений будет в составе индекса. И те компании, которые сейчас входят в индекс могли быть просто неликвидом или их еще просто не было на бирже. Поэтому, на удаленных годах получится что мы и не состав индекса тестировали, а так, сборник неликвидов.
Комментариев нет:
Отправить комментарий