← Zurück

Простейшая стратегия долгосрочного инвестирования.

Попробуем сделать простейшую стратегию для долгосрочного инвестирования. В качестве рабочего будем использовать дневной таймфрейм. Вся суть стратегии будет заключаться в простейшей идее, что падение рынка обычно связано с более высокой волатильностью, чем в среднем. Соответственно, мы будем покупать, когда волатильность ниже среднего, и выходить из лонга, когда она повышается. В качестве меры волатильности будем использовать размах бара 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 принесла за рассматриваемый период нулевую доходность, в то время как наша простейшая система показала небольшую, не совсем стабильную, но прибыль.

War dieses Thema hilfreich?

Thema teilen

Kommentare (9)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

VoDA
VoDA

А подобная стратегия может использоваться внутри дня? или есть какие то требования к волатильности или длительности периода, на которых это может работать?

vlad1024
vlad1024 Autor

VoDA: А подобная стратегия может использоваться внутри дня? или есть какие то требования к волатильности или длительности периода, на которых это может работать?

добавьте еще один параметр medianPeriod, и прооптимизируете на часовиках, посмотрите на поверхность результата, получается не плохо, PF ~ 2, win rate 59% (sma period = 51, median period= 700) . Вопрос в том конечно насколько это переоптимизация, но вроде поверхность выглядит робастной. По крайней мере для трех-строчечной стратегии очень не плохо )

Smelov
Smelov
  1. Ни разу не работал в WL. Скажите пожалуйста, какова стоимость начального портфеля?
  2. Не пробовали добавлять в систему шорты?
  3. Скажите пожалуйста, как формируется сигнал (согласно вашему коду)? Т.е. текущая волатильность это max - min предыдущего бара. Далее вычисляется СС с заданным периодом. А вот формирование сигнала я почему-то не совсем понял. И зачем переменная range в функциях вычисления СС и медины?

Заранее благодарю за ответ.

vlad1024
vlad1024 Autor

Smelov:

  1. Ни разу не работал в WL. Скажите пожалуйста, какова стоимость начального портфеля?

  2. Не пробовали добавлять в систему шорты?

  3. Скажите пожалуйста, как формируется сигнал (согласно вашему коду)? Т.е. текущая волатильность это max - min предыдущего бара. Далее вычисляется СС с заданным периодом. А вот формирование сигнала я почему-то не совсем понял. И зачем переменная range в функциях вычисления СС и медины?

Заранее благодарю за ответ.

  1. Стоимость в пунктах фьючерса одним контрактом.
  2. Можно добавить но они должны быть построены на другой идеи, потому что шорт на повышении волы, плохо работает.
  3. range это разница High - Low за период, среднее значение волатильности считаем через медиану за период, затем сравниваем его со сглаженным значеним High-Low, если оно меньше медианного то входим в лонг.
Smelov
Smelov

vlad1024: 3. range это разница High - Low за период, среднее значение волатильности считаем через медиану за период, затем сравниваем его со сглаженным значеним High-Low, если оно меньше медианного то входим в лонг.

  1. Где задается период для High - Low? Тот же smaPeriod?

  2. WealthLab.Indicators.SMA(range, smaPeriod.ValueInt, "sma"); WealthLab.Indicators.Median(range, 200, "median");

какую роль играет range в этих функциях?

  1. Выходим когда волатильность больше медианного значения?
vlad1024
vlad1024 Autor

Smelov:

vlad1024: 3. range это разница High - Low за период, среднее значение волатильности считаем через медиану за период, затем сравниваем его со сглаженным значеним High-Low, если оно меньше медианного то входим в лонг.

  1. Где задается период для High - Low? Тот же smaPeriod?

  2. WealthLab.Indicators.SMA(range, smaPeriod.ValueInt, "sma"); WealthLab.Indicators.Median(range, 200, "median");

какую роль играет range в этих функциях?

  1. Выходим когда волатильность больше медианного значения?
  1. нигде, период это я не слишком ясно выразился, range = High-Low за все те данные что есть
  2. range это значения по которым эти функции расчитываются, то есть массив данных каждое значение которого = High - Low свечи.
  3. да
ibm_i
ibm_i

Добрый день! Подскажите, пожалуйста, схематично, какие шаги нужно сделать, чтобы реализовать данную стратегию под Альфа Директ? Совсем для новичка в этом деле. Спасибо заранее.

Самунджян Артем

ibm_i: Добрый день! Подскажите, пожалуйста, схематично, какие шаги нужно сделать, чтобы реализовать данную стратегию под Альфа Директ? Совсем для новичка в этом деле. Спасибо заранее. Добрый день, шаг все один 😀!

Кот Матроскин
Кот Матроскин

ibm_i: Подскажите, пожалуйста, схематично, какие шаги нужно сделать, чтобы реализовать данную стратегию под Альфа Директ? А зачем? Внутри дня и на краткосроке она не работает, а начиная со среднесрока и выше - проще руками...