Попробуем сделать простейшую стратегию для долгосрочного инвестирования. В качестве рабочего будем использовать дневной таймфрейм. Вся суть стратегии будет заключаться в простейшей идее, что падение рынка обычно связано с более высокой волатильностью, чем в среднем. Соответственно, мы будем покупать, когда волатильность ниже среднего, и выходить из лонга, когда она повышается. В качестве меры волатильности будем использовать размах бара High - Low. Остается один вопрос: как измерить долгосрочное среднее волатильности? Можно использовать среднее (то есть скользящую среднюю, взятую за определенный период). Но так как мы имеем дело с распределением с тяжелыми хвостами, среднее будет плохой оценкой центра распределения. Поэтому будем использовать робастную оценку центра распределения - в нашем случае это будет медиана или, более точно, скользящая медиана, взятая с большим окном. Наши рассуждения напрямую транслируются в код на WealthLab:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
namespace WealthLab.Strategies
{
public class MyStrategy : WealthScript
{
private StrategyParameter smaPeriod;
public MyStrategy()
{
smaPeriod = CreateParameter("Range Sma Period", 1, 1, 50, 1);
}
protected override void Execute()
{
DataSeries range = High - Low;
DataSeries rangeSma = new WealthLab.Indicators.SMA(range, smaPeriod.ValueInt, "sma");
DataSeries signal = rangeSma - new WealthLab.Indicators.Median(range, 200, "median");
for(int bar = 0; bar < Bars.Count; bar++)
{
if (IsLastPositionActive)
{
//code your exit rules here
if (signal[bar] > 0)
SellAtMarket(bar + 1, LastPosition, "sell");
}
else
{
//code your entry rules here
if (signal[bar] < 0)
BuyAtMarket(bar + 1, "buy");
}
}
}
}
}
Единственный параметр - это длина скользящей средней для сглаживания текущего сигнала High-Low (полный аналог ATR). В дальнейшем мы будем его использовать, лишь чтобы сократить количество входов. Установим сначала smaPeriod = 1, то есть не будем использовать сглаживание сигнала. Получим:


Судя по полученным параметрам бэктеста, идея содержит какое-то статистическое преимущество. Теперь попробудем уменьшить количество сигналов, увеличив период фильтрации High-Low. Сначала проверим робастность этого параметра, то есть убедимся, что параметры стратегии сохраняются на широком диапазоне значений параметра. После этого возьмем его, к примеру, равным 12. И как результат получаем:


Как видно, стратегия bye & hold принесла за рассматриваемый период нулевую доходность, в то время как наша простейшая система показала небольшую, не совсем стабильную, но прибыль.
Kommentare (9)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
А подобная стратегия может использоваться внутри дня? или есть какие то требования к волатильности или длительности периода, на которых это может работать?
добавьте еще один параметр medianPeriod, и прооптимизируете на часовиках, посмотрите на поверхность результата, получается не плохо, PF ~ 2, win rate 59% (sma period = 51, median period= 700) . Вопрос в том конечно насколько это переоптимизация, но вроде поверхность выглядит робастной. По крайней мере для трех-строчечной стратегии очень не плохо )
Заранее благодарю за ответ.
Где задается период для High - Low? Тот же smaPeriod?
WealthLab.Indicators.SMA(range, smaPeriod.ValueInt, "sma"); WealthLab.Indicators.Median(range, 200, "median");
какую роль играет range в этих функциях?
Добрый день! Подскажите, пожалуйста, схематично, какие шаги нужно сделать, чтобы реализовать данную стратегию под Альфа Директ? Совсем для новичка в этом деле. Спасибо заранее.