?

Log in

No account? Create an account

jc_trader


JC-TRADER. Биржевые игры. Системные Спекуляции.


Previous Entry Поделиться Next Entry
Моментум инвестирование.
jc_trader
Решил проверить очередную гипотезу, разработанную академиками, исследующими рынки. На этот раз, так называемое, моментум-инвестирование. Некоторые стратегии, якобы, зарабатывающие 10-30% годовых приведены здесь
http://quantpedia.com/Screener?FilterKeywords=momentum&Page=1

А здесь, есть ссылки на разные академические исследования сайта http://papers.ssrn.com с разными логарифмами, корнями квадратными, интегралами и прочими непонятными математическими формулами, доказывающими что на этой неэффективности не зарабатывает только ленивый.
http://quantpedia.com/Screener/Details/14

В общем, суть моментум-инвестирования следующая:
Momentum основан на предположении, что инструменты, которые в последнее время обгоняли рынок, будут продолжать в том же духе еще некоторое время, а те, кто отставали от рынка, будут отставать и дальше. Хотя практики используют этот принцип уже десятилетия, идея завоевала признание академического сообщества только за прошлые 20 лет. Momentum противоречит гипотезе эффективного рынка, но его доказательства слишком очевидны, чтобы их игнорировать.
http://www.wave-trading.ru/post/238

А методы применяются, примерно, такие:
Выбираем, например, 10 акций, которые за 12 предыдущих месяцев показали лучшую доходность и 10 акций, которые показали худшую доходность. Соответственно, 10 лучших покупаем, а 10 худших продаем. Держим месяц, а потом повторяем ту же процедуру.

Проверить это -- раз плюнуть, например, в Велслабе. Пишем 2 стратегии -- одна для лонга, другая для шорта, а потом тестируем, объединяя эти две стратегии в комбинацию.

[Код для лонгов]using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using WealthLab.Rules;
namespace WealthLab.Strategies
{
public class MyStrategy : WealthScript
{
protected override void Execute()
{
for(int bar = 251; bar < Bars.Count; bar++)
{
Position p = LastPosition;
if(DateRules.IsLastTradingDayOfMonth(Bars.Date[bar]))
{
SellAtMarket(bar+1, p, "Group1");
if ( BuyAtMarket(bar + 1, Convert.ToString( (Close[bar] - Close[bar-250]) / Close[bar-250] )) != null )
 LastActivePosition.Priority = (Close[bar] - Close[bar-250]) / Close[bar-250];
}
}
}
}
}

[Код для шорта]using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using WealthLab.Rules;
namespace WealthLab.Strategies
{
public class MyStrategy : WealthScript
{
protected override void Execute()
{
for(int bar = 251; bar < Bars.Count; bar++)
{
Position p = LastPosition;
if(DateRules.IsLastTradingDayOfMonth(Bars.Date[bar]))
{
CoverAtMarket(bar+1, p, "Group1");
if ( ShortAtMarket(bar + 1, Convert.ToString( -1 * ((Close[bar] - Close[bar-250]) / Close[bar-250]) )) != null )
 LastActivePosition.Priority = -1 * ((Close[bar] - Close[bar-250]) / Close[bar-250]);
}
}
}
}
}



Но вот проблема -- ну никак не удается получить прибыль за последние 10 лет. На разных листах перепробовал. И на SP-500, и на Russell1000, и на комбинированных и везде получается примерно такая картина:

2

Черная линия -- лонги, а красная --шорт.

Что делаю не так? Почему у академиков получается заработать на бумаге до 30% годовых, а у меня на тестах даже в убытке остаюсь? :)



ЗЫ. Не забудьте посмотреть как изменился топ 100 лучших трейдерских сайтов!

  • 1
(Анонимно)
Спасибо за ссылки, будем исследовать))))

потому , что вы неправильно кодируете концепцию.
И моментумных концепций хватает.Кроме того, эта концепция имеет и свои нюансы и растянуть один и тот же алгоритм на многие года не получится.
Что значит в последнее время?
У каждого актива, акции свои периоды моментума, как можно один алгоритм натянуть на все или портфолио

ОБратите внимание на моментум в Эпле или Гугл, продолжительность разная. Задача в том, чтобы для каждого инструмента найти свой цикл восхождения и падения, если в кучу будете кодировать то вряд ли удастся чтоб либо сделать.
Еще есть вариант моментумный это лонги сильных против шорт индекса.

Edited at 2013-04-24 16:54 (UTC)

То есть, Ваше резюме: такой подход не годится? Нужен индивидуальный подход к каждой акции?

ради интереса прогоните 10 худших за последние 12 месяцев:))))

Красным цветом на графике десять худших. Это шорт. Если их брать в лонг, то будет наоборот.

Может попробывать как-то Макс(за х дней) - Close и Мин(за х дней) + Close или еще лучше в % эту величину

Обычно Close(x) - Close(0) это такое очень (амфорное) состояние, так как Close(x) может быть на Максимуме, Середине, Минимуме или где-то там, и смысловая нагрузка также будет различаться.

Вобще я не верю в эти вещи, так как тренд френд, в любой момент может развернуться, иначе бы вы не ловили падающие ножи :)

Edited at 2013-04-24 20:47 (UTC)

Совершенно верно -- конечно же, надо это дело перевести в проценты. Странно что еще никто этого не заметил. :)


Вся правда об Инвестициях :) Еслиб их заставляли иследовать на собственном депо с предоставлением стейтмента результатов, наверно много бы Оналитеков полегло :)

Изображение - savepic.net — сервис хранения изображений

А что, аналитики рост прогнозировали?
Бывает....

Я не разбирался, что там академики вывели, но есть такое наблюдение:

по такой тактике нужно пересматривать портфель каждый день, даже неделя может оказаться слишком много. Посмотрели кто-как вчера с индексом ходил, кто слабее - сегодня зашортили, кто сильнее - в лонг, так собрали и держим до завтра вечера. И завтра вечером опять всё пересматриваем, как бы с нуля.

Но работает не всегда, конечно, могут быть бумаги с сильным характером типа Move to Mean, то есть с обратным поведением. Это всё нужно тестить. В конечном итоге главная ставка делается на то, что сохраняется _характер_ движения в каждой бумаге.

Вообще, можно оптимизацию прогнать по количеству дней от дня до года. Тогда будет ясно :)

Maximum drawdown -77.46% !!! это как долго ? в течении 10? а может 20 лет? вопрос наверное в другом - с какой целью они публикуют это?
смотрим тут http://quantpedia.com/Screener/Details/14
.......я думаю там не учтен slippage и если его учесть то там будет картинка как у вас.....
и почему с 27 года ? а до него Maximum drawdown -99.09%?

Edited at 2013-04-25 13:13 (UTC)

Точно, я и не заметил что аж от 1927 года :)

Чтобы подобного рода код не тормозил на тестах или оптимизациях, одни и теже значения за 1 цикл лучше вычислять один раз, т.е. просто добавить переменную после начала (тела) индикатора, в итоге на много быстрей будут проходить циклы

protected override void Execute()
{
double myPrice=0;

for(int bar = 251; bar < Bars.Count; bar++)
{
myPrice = (Close[bar] - Close[bar-250]) / Close[bar-250];

...
...

if ( BuyAtMarket(bar + 1, Convert.ToString( myPrice ) != null )
LastActivePosition.Priority = myPrice;

*на дневках это может и не сильно заметно, а вот при тестах интрадея вылезет во всей своей красе, да впринципе и интересно сокращать код и делать его более быстродействующим, когда больше никаких мыслей нету :)))

Edited at 2013-04-28 08:56 (UTC)

Да, согласен. Все верно, наверное.

а что таится под функциями в представленном коде?

  • 1