Ejemplo n.º 1
0
        /// <summary>
        /// Return current drawdown in percent, as value between 0 and 1.
        /// </summary>
        /// <param name="series">input time series</param>
        /// <param name="n">length of observation window</param>
        /// <param name="parentId">caller cache id, optional</param>
        /// <param name="memberName">caller's member name, optional</param>
        /// <param name="lineNumber">caller line number, optional</param>
        /// <returns>drawdown as time series</returns>
        public static ITimeSeries <double> Drawdown(this ITimeSeries <double> series, int n,
                                                    CacheId parentId = null, [CallerMemberName] string memberName = "", [CallerLineNumber] int lineNumber = 0)
        {
            var cacheId = new CacheId(parentId, memberName, lineNumber,
                                      series.GetHashCode(), n);

            // TODO: rewrite this, using buffered lambda, see MaxDrawdown
            return(IndicatorsBasic.Const(1.0, cacheId)
                   .Subtract(
                       series
                       .Divide(
                           series
                           .Highest(n, cacheId),
                           cacheId),
                       cacheId));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Calculate Sharpe Ratio, as described here:
        /// <see href="https://en.wikipedia.org/wiki/Sharpe_ratio"/>
        /// </summary>
        /// <param name="series"></param>
        /// <param name="riskFreeRate"></param>
        /// <param name="n"></param>
        /// <param name="parentId">caller cache id, optional</param>
        /// <param name="memberName">caller's member name, optional</param>
        /// <param name="lineNumber">caller line number, optional</param>
        /// <returns></returns>
        public static ITimeSeries <double> SharpeRatio(this ITimeSeries <double> series, ITimeSeries <double> riskFreeRate, int n,
                                                       CacheId parentId = null, [CallerMemberName] string memberName = "", [CallerLineNumber] int lineNumber = 0)
        {
            var cacheId = new CacheId(parentId, memberName, lineNumber,
                                      series.GetHashCode(), riskFreeRate.GetHashCode(), n);

            var excessReturn = series
                               .Return(cacheId)
                               .Subtract(riskFreeRate
                                         .Return(cacheId),
                                         cacheId);

            return(excessReturn
                   .EMA(n, cacheId)
                   .Divide(excessReturn
                           .FastStandardDeviation(n, cacheId)
                           .Max(IndicatorsBasic.Const(1e-10, cacheId), cacheId),
                           cacheId));
        }