public static IEnumerable <double> GetProfits(IEnumerable <double> returns, IEnumerable <double> signals, double transactionCost) { var calc = new OnlineProfitCalculator(transactionCost); IEnumerator <double> returnsEnumerator = returns.GetEnumerator(); IEnumerator <double> signalsEnumerator = signals.GetEnumerator(); // always move forward both enumerators (do not use short-circuit evaluation!) while (returnsEnumerator.MoveNext() & signalsEnumerator.MoveNext()) { double signal = signalsEnumerator.Current; double @return = returnsEnumerator.Current; double prevTotalProfit = calc.Profit; calc.Add(@return, signal); double curTotalProfit = calc.Profit; yield return(curTotalProfit - prevTotalProfit); } // check if both enumerators are at the end to make sure both enumerations have the same length if (returnsEnumerator.MoveNext() || signalsEnumerator.MoveNext()) { throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); } }
protected void CalculateTradingResults() { double[] trainingSignals = TrainingSignals.ToArray(); // cache values IEnumerable <double> trainingReturns = ProblemData.Dataset.GetDoubleValues(ProblemData.PriceChangeVariable, ProblemData.TrainingIndices); double[] testSignals = TestSignals.ToArray(); // cache values IEnumerable <double> testReturns = ProblemData.Dataset.GetDoubleValues(ProblemData.PriceChangeVariable, ProblemData.TestIndices); OnlineCalculatorError errorState; double trainingSharpeRatio = OnlineSharpeRatioCalculator.Calculate(trainingReturns, trainingSignals, ProblemData.TransactionCosts, out errorState); TrainingSharpeRatio = errorState == OnlineCalculatorError.None ? trainingSharpeRatio : double.NaN; double testSharpeRatio = OnlineSharpeRatioCalculator.Calculate(testReturns, testSignals, ProblemData.TransactionCosts, out errorState); TestSharpeRatio = errorState == OnlineCalculatorError.None ? testSharpeRatio : double.NaN; double trainingProfit = OnlineProfitCalculator.Calculate(trainingReturns, trainingSignals, ProblemData.TransactionCosts, out errorState); TrainingProfit = errorState == OnlineCalculatorError.None ? trainingProfit : double.NaN; double testProfit = OnlineProfitCalculator.Calculate(testReturns, testSignals, ProblemData.TransactionCosts, out errorState); TestProfit = errorState == OnlineCalculatorError.None ? testProfit : double.NaN; }
public static IEnumerable<double> GetProfits(IEnumerable<double> returns, IEnumerable<double> signals, double transactionCost) { var calc = new OnlineProfitCalculator(transactionCost); IEnumerator<double> returnsEnumerator = returns.GetEnumerator(); IEnumerator<double> signalsEnumerator = signals.GetEnumerator(); // always move forward both enumerators (do not use short-circuit evaluation!) while (returnsEnumerator.MoveNext() & signalsEnumerator.MoveNext()) { double signal = signalsEnumerator.Current; double @return = returnsEnumerator.Current; double prevTotalProfit = calc.Profit; calc.Add(@return, signal); double curTotalProfit = calc.Profit; yield return curTotalProfit - prevTotalProfit; } // check if both enumerators are at the end to make sure both enumerations have the same length if (returnsEnumerator.MoveNext() || signalsEnumerator.MoveNext()) { throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); } }
public OnlineSharpeRatioCalculator(double transactionCost) { this.meanAndVarianceCalculator = new OnlineMeanAndVarianceCalculator(); this.profitCalculator = new OnlineProfitCalculator(transactionCost); Reset(); }