Бэктестинг Бета-нейтрального подхода

Sep 06, 2012 18:36

Ниже, под спойлером, представлен код для тестирования торговли разностью (на принципах многоуровнего маркет-мейкинга с использованием фиксированного справедливого спреда) в программе технического анализа AmiBroker. Данный код рассчитывает пять типов графиков (Net Proft | Potential Profit | Potential Loss | Position Value | Deviation) по ценам сделок или по лучшим ценам спроса и предложения. Выбор типа отображаемого графика и цен, используеммых для его расчета осуществляется в окне настройки параметров (Parametrs). Настройки самих стратегий прописываются непосредственно в коде тестировщика.

График Net Profit
Отображает Чистую прибыль/убыток, как по каждой отдельной стратегии (линейные графики), так и совокупную Чистую прибыль/убыток всех стратегий (диаграмма с областями). График Net Profit является результатом сложения графиков Potential Profit и Potential Loss с учетом бонуса в размере Потенциального убытка второго бара.



График Potential Profit
Отображает Потенциальную прибыль, полученную от реверсивных движений спреда, как по каждой отдельной стратегии (линейные графики), так и совокупную Потенциальную прибыль всех стратегий (диаграмма с областями).
ВАЖНО: Данная версия тестировщика рассчитывает Потенциальную прибыль по округленным значениям спреда, в реальной же торговле вход и выход из позиции практически всегда осуществляется по более выгодным ценам (без учета проскальзывания), в связи с чем реальные результаты, как правило, отличаются в лучшую сторону.



График Potential Loss
Отображает Потенциальный убыток, полученный в результате отклонения спреда от своего справедливого уровня, как по каждой отдельной стратегии (линейные графики), так и совокупный Потенциальный убыток всех стратегий (диаграмма с областями).



График Position Value
Отображает Стоимость позиций, как по каждой отдельной стратегии (линейные графики), так и совокупную Стоимость позиций всех стратегий (диаграмма с областями).
ВАЖНО: Данная версия тестировщика рассчитывает совокупную Стоимость позиций без учета кросс-позиций по инструменту, используемому в разных стратегиях. Например, если по одной стратегии будет открыто 100 акций Лукойла в лонг , а по другой стратегии 80 акций Лукойла в шорт, то совокупная стоимость позиции будет рассчитана исходя из 180 акций Лукойла.



График Deviation
Отображает величину Отклонения текущего округленного спреда от своего справедливого уровня для каждой отдельной стратегии.



ВНИМАНИЕ! Приведенные в коде настройки стратегий даны исключительно в целях демонстрации работы тестировщика.

[Показать код]
////// Общие Настройки //////
SetBarsRequired( sbrAll );
ChartType=ParamList("Chart Type","Net Profit|Potential Profit|Potential Loss|Postion Value|Deviation");
PriceType=ParamList("Price Type","Deal|Bid-Ask");
if(PriceType=="Deal"){
Price_LKOH=Foreign("LKOH","C");
Price_GAZP=Foreign("GAZP","C");
Price_SBER=Foreign("SBER","C");
Price_VTBR=Foreign("VTBR","C");
// Price_XXXX=Foreign("XXXX","C"); // Добавляем нужные бумаги
// Price_YYYY=Foreign("YYYY","C"); // Добавляем нужные бумаги
}

if(PriceType=="Bid-Ask"){
Price_LKOH=(Foreign("LKOH_bid","C")+Foreign("LKOH_ask","C"))/2;
Price_GAZP=(Foreign("GAZP_bid","C")+Foreign("GAZP_ask","C"))/2;
Price_SBER=(Foreign("SBER_bid","C")+Foreign("SBER_ask","C"))/2;
Price_VTBR=(Foreign("VTBR_bid","C")+Foreign("VTBR_ask","C"))/2;
// Price_XXXX=(Foreign("XXXX_bid","C")+Foreign("..._ask","C"))/2; // Добавляем нужные бумаги
// Price_YYYY=(Foreign("YYYY_bid","C")+Foreign("..._ask","C"))/2; // Добавляем нужные бумаги
}

////// Настройки Стратегии_1 //////
Amount_LKOH_1 = 10; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов
Amount_GAZP_1 = -100; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов
Step_1 = 200; // Задаем шаг котирования
FairSpread_1 = 0; // Задаем значение справедливого спреда
Spread_1=(Price_LKOH*Amount_LKOH_1)+(Price_GAZP*Amount_GAZP_1); // Суммируем произведения цены и количества всех инструментов данной стратегии
Value_1=abs(Price_LKOH*Amount_LKOH_1)+abs(Price_GAZP*Amount_GAZP_1); // Суммируем абсолютные произведения цены и количества всех инструментов данной стратегии
Round_1=round(Spread_1/Step_1)*Step_1;
RoundF_1=floor(Spread_1/Step_1)*Step_1;
RoundC_1=ceil(Spread_1/Step_1)*Step_1;

////// Настройки Стратегии_2 //////
Amount_SBER_2 = 200; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов
Amount_VTBR_2 = -200000; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов
Step_2 = 200; // Задаем шаг котирования
FairSpread_2 = 0; // Задаем значение справедливого спреда
Spread_2=(Price_SBER*Amount_SBER_2)+(Price_VTBR*Amount_VTBR_2); // Суммируем произведения цены и количества всех инструментов данной стратегии
Value_2=abs(Price_SBER*Amount_SBER_2)+abs(Price_VTBR*Amount_VTBR_2); // Суммируем абсолютные произведения цены и количества всех инструментов данной стратегии
Round_2=round(Spread_2/Step_2)*Step_2;
RoundF_2=floor(Spread_2/Step_2)*Step_2;
RoundC_2=ceil(Spread_2/Step_2)*Step_2;

/*
////// Настройки Стратегии_N //////
Amount_XXXX_N = 100; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов
Amount_YYYY_N = -100; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов
Step_N = 100; // Задаем шаг котирования
FairSpread_N = 0; // Задаем значение справедливого спреда
Spread_N=(Price_XXXX*Amount_XXXX_N)+(Price_YYYY*Amount_YYYY_N); // Суммируем произведения цены и количества всех инструментов  данной стратегии
Value_N=abs(Price_XXXX*Amount_XXXX_N)+abs(Price_YYYY*Amount_YYYY_N); // Суммируем абсолютные произведения цены и количества всех инструментов данной стратегии
Round_N=round(Spread_N/Step_N)*Step_N;
RoundF_N=floor(Spread_N/Step_N)*Step_N;
RoundC_N=ceil(Spread_N/Step_N)*Step_N;
*/

////// Алгоритмы //////
for(i=0;i<1;i++)
{
CumMove_1[i]=0;
CumMove_2[i]=0;
// CumMove_N[i]=0; // Добавляем переменную CumMove_N для каждой новой Стратегии_N
}

for(i=1;i{
////// Алгоритм Стратегии_1 //////
if(Spread_1[i]>Round_1[i-1]) Round_1[i]=RoundF_1[i];
else Round_1[i]=RoundC_1[i];
Deviation_1[i]=Round_1[i]-FairSpread_1[i];
CumMove_1[i]=abs(Round_1[i]-Round_1[i-1])+CumMove_1[i-1];
PotentialProfit_1[i]=(CumMove_1[i]-abs(Deviation_1[i])+abs(Round_1[0]-FairSpread_1[0]))/2;
PotentialLoss_1[i]=(Step_1[i]*abs(Deviation_1[i])-(Deviation_1[i])^2)/(2*Step_1[i]);
NetProfit_1[i]=PotentialProfit_1[i]+PotentialLoss_1[i]-PotentialLoss_1[1];
PositionValue_1[i]=Value_1[i]*abs(Deviation_1[i])/Step_1[i];

////// Алгоритм Стратегии_2 //////
if(Spread_2[i]>Round_2[i-1]) Round_2[i]=RoundF_2[i];
else Round_2[i]=RoundC_2[i];
Deviation_2[i]=Round_2[i]-FairSpread_2[i];
CumMove_2[i]=abs(Round_2[i]-Round_2[i-1])+CumMove_2[i-1];
PotentialProfit_2[i]=(CumMove_2[i]-abs(Deviation_2[i])+abs(Round_2[0]-FairSpread_2[0]))/2;
PotentialLoss_2[i]=(Step_2[i]*abs(Deviation_2[i])-(Deviation_2[i])^2)/(2*Step_2[i]);
NetProfit_2[i]=PotentialProfit_2[i]+PotentialLoss_2[i]-PotentialLoss_2[1];
PositionValue_2[i]=Value_2[i]*abs(Deviation_2[i])/Step_2[i];

/*
////// Алгоритм Стратегии_N //////
if(Spread_N[i]>Round_N[i-1]) Round_N[i]=RoundF_N[i];
else Round_N[i]=RoundC_N[i];
Deviation_N[i]=Round_N[i]-FairSpread_N[i];
CumMove_N[i]=abs(Round_N[i]-Round_N[i-1])+CumMove_N[i-1];
PotentialProfit_N[i]=(CumMove_N[i]-abs(Deviation_N[i])+abs(Round_N[0]-FairSpread_N[0]))/2;
PotentialLoss_N[i]=(Step_N[i]*abs(Deviation_N[i])-(Deviation_N[i])^2)/(2*Step_N[i]);
NetProfit_N[i]=PotentialProfit_N[i]+PotentialLoss_N[i]-PotentialLoss_N[1];
PositionValue_N[i]=Value_N[i]*abs(Deviation_N[i])/Step_N[i];
*/

PotentialProfit[i]=PotentialProfit_1[i]+PotentialProfit_2[i]; // Суммируем переменные PotentialProfit_N всех стратегий
PotentialLoss[i]=PotentialLoss_1[i]+PotentialLoss_2[i]; // Суммируем переменные PotentialLoss_N всех стратегий
NetProfit[i]=NetProfit_1[i]+NetProfit_2[i]; // Суммируем переменные NetProfit_N всех стратегий
PositionValue[i]=PositionValue_1[i]+PositionValue_2[i]; // Суммируем переменные PositionValue_N всех стратегий
}

////// Графики //////
if (ChartType=="Net Profit"){
Plot(NetProfit_1,"NetProfit_1",colorBlue,style=1);
Plot(NetProfit_2,"NetProfit_2",colorRed,style=1);
//Plot(NetProfit_N,"NetProfit_N",colorGreen,style=1); // Добавляем график NetProfit_N для каждой новой Стратегии_N
Plot(NetProfit,"NetProfit",colorLightBlue,style=16384);}

if (ChartType=="Potential Profit"){
Plot(PotentialProfit_1,"PotentialProfit_1",colorBlue,style=1);
Plot(PotentialProfit_2,"PotentialProfit_2",colorRed,style=1);
//Plot(PotentialProfit_N,"PotentialProfit_N",colorGreen,style=1); // Добавляем график PotentialProfit_N для каждой новой Стратегии_N
Plot(PotentialProfit,"PotentialProfit",colorLightBlue,style=16384);}

if (ChartType=="Potential Loss"){
Plot(PotentialLoss_1,"PotentialLoss_1",colorBlue,style=1);
Plot(PotentialLoss_2,"PotentialLoss_2",colorRed,style=1);
//Plot(PotentialLoss_N,"PotentialLoss_N",colorGreen,style=1); // Добавляем график PotentialLoss_N для каждой новой Стратегии_N
Plot(PotentialLoss,"PotentialLoss",colorPink,style=16384);}

if (ChartType=="Postion Value"){
Plot(PositionValue_1,"PositionValue_1",colorBlue,style=1);
Plot(PositionValue_2,"PositionValue2",colorRed,style=1);
//Plot(PositionValue_N,"PositionValue_N",colorGreen,style=1); // Добавляем график PositionValue_N для каждой новой Стратегии_N
Plot(PositionValue,"PositionValue",colorLightGrey,style=16384);}

if (ChartType=="Deviation"){ Plot(0,"ZeroLevel",colorBlack,style=1);
Plot(Deviation_1,"Deviation_1",colorBlue,style=1);
Plot(Deviation_2,"Deviation_2",colorRed,style=1);
//Plot(Deviation_N,"Deviation_N",colorGreen,style=1); // Добавляем график Deviation_N для каждой новой стратегии
}

// yDAV (c) 2012, http://y-dav.livejournal.com

Рыночно-нейтральные стратегии, Баскет трейдинг, Парный трейдинг

Previous post Next post
Up