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


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



Спасибо: VoDA StockSharp FinDirector



Поздравляем именинников: Hydra User, sedor

9 Ответов
VoDA

Фотография
Дата: 07.06.2012
Ответить


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

vlad1024

Фотография
Автор статей
Дата: 08.06.2012
Ответить


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


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

Smelov

Фотография
Дата: 09.06.2012
Ответить


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

Заранее благодарю за ответ.
Спасибо:

vlad1024

Фотография
Автор статей
Дата: 10.06.2012
Ответить


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


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

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

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


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

Автор топика
Спасибо:

Smelov

Фотография
Дата: 10.06.2012
Ответить


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 в этих функциях?

3. Выходим когда волатильность больше медианного значения?
Спасибо:

vlad1024

Фотография
Автор статей
Дата: 10.06.2012
Ответить


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 в этих функциях?

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


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

ibm_i

Фотография
Дата: 29.04.2013
Ответить


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

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

Фотография
Автор статей Программист
Дата: 30.04.2013
Ответить


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

Добрый день, шаг все один BigGrin!
Спасибо:

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

Фотография
Дата: 30.04.2013
Ответить


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

А зачем? Внутри дня и на краткосроке она не работает, а начиная со среднесрока и выше - проще руками...
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy