Профит из случайного ценового ряда - страница 8

 
avatara:

Тема заслуживает продолжения обсуждения, как по мне. Время прошло - было, что обдумать и узнать.

Тем более преобразование Фишера как бы описано ...

;)

На скору руку наваял два скриптика для генерации тестовых рядов. (для равномерных и нормальных приращений).

Прошу не пинать за некромантию и неряшливость в поспешном коде...

Преобразование Фишера, как и любой другой экспандер, дико усиливает дробовые шумы вблизи верхней и нижней границ интервала, причем в пределе (на самой границе) - с бесконечным коэффициентом. Для рынка это как раз актуально - все цены квантованы по Point, а значит в той или иной степени - и все индикаторы.
 
NorthernWind:

Однако, если играть так как я предлагал по выше приведенной ссылке, то выиграть можно наверняка и на случайном блуждании с мо=0. Но, ещё раз повторяю, это не совсем та игра о которой нам говорят в теоремах. При этом там складывается парадоксальная ситуация, такая что чем больше раз вы неугадали тем больше вы заработаете. Повторяю ещё раз, к реальности эта игра не имеет ни какого отношения и призвана она была продемонстрировать важность аккуратного тестирования. Дело в том, что выигрыш там накапливается за счет недоучета выигранных и проигранных ставок. Так то.

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

ЗЫ. без относительно обсуждаемого, если преобразовать существующее распределение в другое то действительно можно временами иметь преимущество, но очень шаткое.

Если правильно понял идею, набросал код быстрой ее проверки на "ценах" с нормальным распределением приращений:

#property strict

extern int AmountPrices = 10000;
extern int TakeProfit = 100;
extern int StopLoss = 100;
extern double point = 0.0001;
extern int Temp = 0;

#define MAX_RAND 32767.0

double GetRand()
{
  return(2 * MathRand() / MAX_RAND - 1);
}

void GetRandGauss( double& Rand1, double& Rand2 )
{
  double X1, X2, W = 2;
  
  while (W >= 1)
  {
    X1 = GetRand();
    X2 = GetRand();
    
    W = X1 * X1 + X2 * X2;
  }
  
  W = MathSqrt(-2 * MathLog(W) / W);
  
  Rand1 = X1 * W;
  Rand2 = X2 * W;
    
  return;
}

void GetPrices( double &Prices[], int Amount )
{
  static uint Tmp = 0;
  double Rand1, Rand2;
  
  MathSrand((int)TimeLocal() + Tmp);
  
  Amount <<= 1;
  
  ArrayResize(Prices, Amount);
  
  Prices[0] = 0;
  
  for (int i = 2; i < Amount; i += 2)
  {
    GetRandGauss(Rand1, Rand2);
    Prices[i - 1] = Prices[i - 2] + Rand1;
    Prices[i] = Prices[i - 1] + Rand2;    
  }
  
  Tmp += GetTickCount();
  
  return;
}

void NormalizeArray( double &Array[] )
{
  const int Size = ArraySize(Array);
  const double Interval = ArrayMaximum(Array) - ArrayMinimum(Array);  
  
  for (int i = 0; i < Size; i++)
    Array[i] /= Interval;
    
  return;
}

double System( const double &Prices[], const double TP, const double SL )
{
  const int Amount = ArraySize(Prices);
  bool Flag = TRUE;
  double OpenPrice = Prices[0];
  double Balance = 0;
  
  for (int i = 0; i < Amount; i++)
  {
    if (Flag)
    {
      if ((Prices[i] >= OpenPrice + TP) || (Prices[i] <= OpenPrice - SL))
      {
        Balance += Prices[i] - OpenPrice;
        
        Flag = (MathRand() > (SHORT_MAX + 1) / 2 - 1);  
        OpenPrice = Prices[i];
      }
    }
    else if ((Prices[i] <= OpenPrice - TP) || (Prices[i] >= OpenPrice + SL))
    {
      Balance -= Prices[i] - OpenPrice;

      Flag = (MathRand() > (SHORT_MAX + 1) / 2 - 1);  
      OpenPrice = Prices[i];
    }
  }
  
  return(Balance);
}

double GetRandProfit( int Amount, const double TP, const double SL )
{
   double Prices[];
   
   GetPrices(Prices, Amount >> 1);
   NormalizeArray(Prices);
   
   return(System(Prices, TP, SL));  
}


double OnTester( void )
{
  return(GetRandProfit(AmountPrices, TakeProfit * point, StopLoss * point));
}

 

Оптимизация (тэйк и лосс) по кастомному критерию уже наглядно показала ожидаемую несостоятельность древнего мифа (либо мою).

 
hrenfx:

Если правильно понял идею, набросал код быстрой ее проверки на "ценах" с нормальным распределением приращений:

 

Оптимизация (тэйк и лосс) по кастомному критерию уже наглядно показала ожидаемую несостоятельность древнего мифа (либо мою).

Сэр, Ваша дама ушла относительно недавно. 
 
hrenfx:

Если правильно понял идею, набросал код быстрой ее проверки на "ценах" с нормальным распределением приращений:

 

Оптимизация (тэйк и лосс) по кастомному критерию уже наглядно показала ожидаемую несостоятельность древнего мифа (либо мою).

мифа о чём?
 
ZaPutina:
мифа о чём?

Некоторые дяди утверждали о возможности создания прибыльной ТС на сгенерированных СБ-ценах (конкретнее - приращения с нормальным распределением). Формализовали ТС, провели множество исследований...

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

 

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



 
YOUNGA:

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

Гарантированный профит можно выжать на "пушистых" ценах. Определение пушистости и формализацию ТС для этого не дам. Возможно, еще где-то. Все это к реальной торговли имеет малое отношение.

Код можно переделать под любое распределение. Для этого нужно заменить только функцию GetRandGauss на функцию квантиля нужного распределения - пребразовывает равномерно-распределенную (MathRand) случайную величину в соответствующее распределение.

 
hrenfx:

Гарантированный профит можно выжать на "пушистых" ценах. Определение пушистости и формализацию ТС для этого не дам. Возможно, еще где-то. Все это к реальной торговли имеет малое отношение.

Код можно переделать под любое распределение. Для этого нужно заменить только функцию GetRandGauss на функцию квантиля нужного распределения - пребразовывает равномерно-распределенную (MathRand) случайную величину в соответствующее распределение.

Хотите сказать ваш код перебирает ВСЕ возможные варианты, имея не более 100 строк? А раз нет, то какое он имеет отношение к доказательству того что на псевдо СБ(в природе нет чистого СБ) нельзя заработать.
 
ZaPutina:
Хотите сказать ваш код перебирает ВСЕ возможные варианты, имея не более 100 строк? А раз нет, то какое он имеет отношение к доказательству того что на псевдо СБ(в природе нет чистого СБ) нельзя заработать.

Меняйте белый шум на интересующую Вас функцию распределения и проверяйте, если есть охота. Только это - нонсенс: доказывать, что заработать нельзя. Докажите обратное. 

ЗЫ Кстати о случайном характере рынка: текущее его состояние (цена закрытия сегодня) было предопределено 23.03 в 19:00+3:00 мск. 

 
tara:

Меняйте белый шум на интересующую Вас функцию распределения и проверяйте, если есть охота. Только это - нонсенс: доказывать, что заработать нельзя. Докажите обратное. 

ЗЫ Кстати о случайном характере рынка: текущее его состояние (цена закрытия сегодня) было предопределено 23.03 в 19:00+3:00 мск. 

С вами только через зятя...уж не обессудьте.