Автор |
Сообщение |
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
В теме желательно давать комменты только тем, кто в теме по тестированию Out_of_sample и In_sample.
Предисловие:
Ставлю в автоматическом тесте АА период IS c августа по ноябрь включительно. Период OOS ставлю 1 мес.
Пока все ОК. В результате сделка, начатая в середине декабря дает результат, например, 3000 долл (см. рисунок). Хотя в реале сделка была бы закрыта с резалтом 1500 долл. Таким образом при таких вариантах развития событий мы получаем не совсем, мягко говоря, адекватные результаты тестирования OOS.
Вопросы:
1. Как вы решали такие траблы?
2. Может быть в реале надо сделку закрывать при истечении периода OOS. То есть полностью в реал переводить тот алгоритм действий, который тестировался? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну вопрос то почти филосовский.
Совершенно понятно почему так сделано в программе. Если использовать правила закрытия действующие в новом периоде, то не факт, что по новым правилам сделка вообще была открыта. Если же тянуть старые правила по уже открытым сделкам, то вероятно это достаточно сложно реализовать...
Теперь про то как действовать.
Двух мнений быть не может. Как тестировалось, так и действовать. Если есть большое желание не прикрывать сделки в момент смены параметров, то это надо сперва протестировать. В ручную, в excel, где угодно. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
000 писал(а): |
Двух мнений быть не может. Как тестировалось, так и действовать. Если есть большое желание не прикрывать сделки в момент смены параметров, то это надо сперва протестировать. В ручную, в excel, где угодно. |
По большому счету согласен с тобой. Ведь закрытие сделки при завершении периода OOS - это тоже часть системы. Смущает вот что:
1) Система в Walk-Forward test дала очень хорошие резалты: 30 годовых при максимальной просадке 7%.
2) Закрытие в конце периода OOS - это то, что противоречит ПЕРВОНАЧАЛЬНЫМ принципам системы.
В связи с этой проблемой перерыл книжку Пардо "Разработка Тс" и вот чего прочитал:
Короче в раздумьях я... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DmZ
Зарегистрирован: 12.11.2009
Сообщения: 4
Откуда: Донецк
|
ID писал(а): |
Система в Walk-Forward test дала очень хорошие резалты: 30 годовых при максимальной просадке 7% |
Вы анализируете ~~~OSEQUITY ? Стандартного отчета по OutOfSample в АМИ вроде бы нет?
C уважением Дмитрий. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
Можно резалты OOS и IS загнать в Excel и получить эквитю, просадки, и проч показатели |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DmZ
Зарегистрирован: 12.11.2009
Сообщения: 4
Откуда: Донецк
|
я потихоньку дорабатываю индикатор portfolio.afl. Параметры ТС вывожу в окне "Interpretation". Весь стандартный отчет получить не получиться, но основное - можно.
По OOS с моей точки зрения самое сложное - подобрать оптимальные периоды IS и OS: Если период короткий- результат недостоверен, если длинный - при резкой смене рынка получаем большую серию убыточных сделок.
С уважением Дмитрий. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
VladimirN
Зарегистрирован: 07.11.2009
Сообщения: 49
|
У меня вопрос о другом, но подходит под название темы.
Можно ли настроить Walk-Forward, что бы он нормально пропускал выходные дни, при тестировании внутридневной торговли с настройкой Step N day?
А то сейчас беру минутки за две недели, настраиваю:
IS - два дня (например понедельник-вторник),
OOS - следующий один день после них (среда).
Когда тестирование доходит до субботы, то она входит в IS и тестирование проходит фактически по одному дню (а на графике то данных за субботу вообще нет!). И суббота- воскресенье с нулевыми данными почему-то дают параметры для OOS на новый понедельник, а ведь по моему он должен торговаться на основе IS-четверг-пятница.
Т.е. нормальный walk-forwarding при такой настройке получается только три дня в неделю - со среды по пятницу.
А хотелось бы загрузить сразу пару-тройку месяцев и прогонять по ним с разными настройками. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А если в настройках БД в Intaday поставить галку Filter weekends |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
VladimirN
Зарегистрирован: 07.11.2009
Сообщения: 49
|
Надо было просто в настройках Walk-forwarda выбирать не days a trades day. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DmZ
Зарегистрирован: 12.11.2009
Сообщения: 4
Откуда: Донецк
|
Немного доработанный индикатор portfolio.afl.
Для оценки equity OutOfSample.
Код: |
_SECTION_BEGIN("Portfolio_my");
eq = Foreign("~~~OSEQUITY", "C");
cash = Foreign("~~~OSEQUITY", "L");
dr = eq - Highest(eq);
procDr=100*(Highest(eq)-eq)/Highest(eq);
bslh = HighestBars(eq);
GraphZOrder=1;
Plot(eq, "Portfolio Equity", colorLightBlue, styleArea );
if( ParamToggle("Show Cash", "No|Yes", 1 ) ) Plot(cash, "Cash", colorGreen, styleArea );
if( ParamToggle("Show Drawdown", "No|Yes", 1 ) ) Plot(dr, "Drawdown", colorDarkRed, styleArea );
if( ParamToggle("Show #bars since last high", "No|Yes", 0 ) ) Plot(bslh, "#bars since last high", colorDarkYellow, styleLine | styleOwnScale, 0, 10 * LastValue( Highest( bslh ) ) );
islastbar = Status("lastbarintest");
isfirstbar = Status("firstbarintest");
bar = BarIndex();
firstbar = LastValue( ValueWhen( isfirstbar, bar ) );
for( i = 1; i <BarCount>0 AND IsNull(cash[i-1])>0)firstbar =i;
lastbar = LastValue( ValueWhen( islastbar, bar ) );
al = LastValue( ValueWhen( islastbar, LinRegSlope( eq, Lastbar - firstbar + 1 ) ) );
bl = LastValue( ValueWhen( islastbar, LinRegIntercept( eq, Lastbar - firstbar + 1 ) ) );
Lr = al * ( BarIndex() - firstbar ) + bl;
Lr = IIf( bar >= firstbar AND bar <= lastbar , Lr, Null );
if( ParamToggle("Show lin. reg.", "No|Yes", 0 ) )Plot( Lr , "Linear Reg", colorRed, styleThick );
StartDepozit=cash[firstbar];
NetProfit=eq-StartDepozit;
procNetProfit=round(NetProfit/StartDepozit *100);
Trades=LossTrades=WinTrades=0;
SumLoss=SumWin=0;
for( i = 1; i <BarCount>=cash[i-1])
{WinTrades[i]=1; SumWin[i]=SumWin[i-1]+cash[i]-cash[i-1];}
else
{LossTrades[i]=1;SumLoss[i]=SumLoss[i-1]+abs(cash[i]-cash[i-1]);}
};
};
PF=SumWin/SumLoss;
Winners=Cum(WinTrades);procWinners=round(100*Cum(WinTrades)/Cum(Trades));
Losers=Cum(LossTrades);procLosers=round(100*Cum(LossTrades)/Cum(Trades));
//For interpretation window
strh=strB=strS=" ";
ShortScaleIn=BuyScaleIn=0;
for( i = BarCount-1; i < BarCount; i++ )
{
strB=strB+StrFormat("StartDeposit = %g,\nNetProfit = %g,\nNetProfit(proc) = %g,\nProfit Factor= %g, \n ",
StartDepozit[i], eq[i]-StartDepozit[i],procNetProfit[i],PF[i]);
strB=strB+StrFormat("\nTotal Trades=%g\nWin=%g Loss=%g\nWinners(proc)=%g \n",
Winners[i]+Losers[i],Winners[i],Losers[i],procWinners[i]);
strB=strB+StrFormat("\nMaxDD(proc)=%g \n",
Highest(procDr));
}
printf(strh+strB+strS );
_SECTION_END();
|
С уважением Дмитрий |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|