понедельник, 15 ноября 2010 г.

K-Ratio на c#

        ///
        /// K-Ratio by Lars Kestner daily
        ///

        public double KRatio
        {
           get
           {
               if (_KRatio == 0.0)
               {
                   if (PosList.Count == 0)
                       return 0.0;

                   if (Bars == null)
                       Bars = PosList[0].Bars;

                   _TradeDays = 0;
                   double sumX = 0, sumY = 0, sumXY = 0, sumXSqr = 0, dayProfit = 0;

                   // прибыль по дням
                   List DayEquity = new List();

                   DateTime dt = DateTime.MinValue;
                   for (int bar = 0; bar < this.Bars.Count; bar++)
                   {
                       if (dt == this.Bars.Date[bar].Date)
                           continue;

                       dt = this.Bars.Date[bar].Date;
                      
                       // считаем дневную прибыль
                       foreach (Position p in PosList)
                           dayProfit += p.NetProfitAsOfDay(dt);

                       _TradeDays++;
                       Log.Out("Profit: " + dayProfit + " day: " + dt, LogLevel.debug);

                       DayEquity.Add(dayProfit);
                       sumXY += _TradeDays * dayProfit;
                       sumX += _TradeDays;
                       sumY += dayProfit;
                       sumXSqr += _TradeDays * _TradeDays;
                   }
                   _KRatio_B1 = (sumXY * _TradeDays - sumX * sumY) / (sumXSqr * _TradeDays - sumX * sumX);
                   double b0 = (sumY / _TradeDays) - _KRatio_B1 * (sumX / _TradeDays);
                   double YProjected = 0, SumResidSqr = 0, StandardErrB1Denom = 0;
                   for (int i = 1; i <= _TradeDays; i++)
                   {
                       YProjected = b0 + _KRatio_B1 * i;
                       SumResidSqr += Math.Pow(DayEquity[i - 1] - YProjected, 2);
                       StandardErrB1Denom += Math.Pow((double)i - (double)(_TradeDays + 1) / 2, 2);
                   }
                   double SigmaRegress = Math.Sqrt(SumResidSqr / (_TradeDays - 2));
                   _KRatio_StdErrB1 = SigmaRegress / Math.Sqrt(StandardErrB1Denom);
                   _KRatio = _KRatio_B1 / (_KRatio_StdErrB1 * _TradeDays);
               }
               return Math.Round(_KRatio, 3);
           }
        }

Комментариев нет: