Попробуем сделать простейшую стратегию для долгосрочного инвестирования. В качестве рабочего будем использовать дневной таймфрейм. Вся суть стратегии будет заключаться в простейшей идее, что падение рынка обычно связано с более высокой волатильностью, чем в среднем. Соответственно, мы будем покупать, когда волатильность ниже среднего, и выходить из лонга, когда она повышается. В качестве меры волатильности будем использовать размах бара 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 принесла за рассматриваемый период нулевую доходность, в то время как наша простейшая система показала небольшую, не совсем стабильную, но прибыль.
评论 (9)
登录 或 创建账户, 登录或注册以发表评论
А подобная стратегия может использоваться внутри дня? или есть какие то требования к волатильности или длительности периода, на которых это может работать?
добавьте еще один параметр 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 в этих функциях?
Добрый день! Подскажите, пожалуйста, схематично, какие шаги нужно сделать, чтобы реализовать данную стратегию под Альфа Директ? Совсем для новичка в этом деле. Спасибо заранее.