private parameterPair getBestParameters(stockInfo stock) { double max = -10; parameterPair bestPara = new parameterPair(); double k1Max = 0; double k2Max = 0; double trailingParameterMax = 0; var myTradeDays = dateRepo.GetStockTransactionDate(stock.startDate, stock.endDate); Dictionary <DateTime, parameterPair> parameters = new Dictionary <DateTime, parameterPair>(); for (double k1 = 1; k1 <= 3; k1 = k1 + 0.2) { for (double k2 = 1; k2 <= 3; k2 = k2 + 0.2) { for (double trailingParameter = 0.004; trailingParameter <= 0.03; trailingParameter = trailingParameter + 0.002) { parameters = new Dictionary <DateTime, parameterPair>(); foreach (var date in myTradeDays) { parameterPair para = new parameterPair(); para.parameter1 = k1; para.parameter2 = k2; para.parameter3 = trailingParameter; para.date = date; para.strategy = "DualTrust"; para.code = stock.code; para.existGoodParameter = true; parameters.Add(date, para); } List <netvalueDaily> nv = new List <netvalueDaily>(); List <OneByOneTransaction> transactionData = new List <OneByOneTransaction>(); dualTrust(stock, parameters, ref nv, ref transactionData); double sharpe = Utilities.strategyPerformance.sharpeRatioByDailyNetValue(nv.Select(s => s.netvalue).ToList()); if (sharpe > max) { max = sharpe; k1Max = k1; k2Max = k2; trailingParameterMax = trailingParameter; //Console.WriteLine("sharpe:{0}, k1:{1}, k2:{2}, trailing:{3}", max, k1Max, k2Max, trailingParameterMax); } } } } bestPara.parameter1 = k1Max; bestPara.parameter2 = k2Max; bestPara.parameter3 = trailingParameterMax; bestPara.strategy = "DualTrust"; bestPara.code = stock.code; bestPara.bestSharpe = max; if (max > 0) { bestPara.existGoodParameter = true; } else { bestPara.existGoodParameter = false; } return(bestPara); }
//算出一年的最优参数,给后面N天使用 private double rollingByTime(stockInfo stock, int trainingSetDuration = 120, int testSetDuration = 10) { stockInfo stockRollInfo = new stockInfo(); Dictionary <DateTime, parameterPair> parameters = new Dictionary <DateTime, parameterPair>(); DateTime startDate = stock.startDate; DateTime endDate = stock.endDate; var myTradeDays = dateRepo.GetStockTransactionDate(stock.startDate, stock.endDate); int length = tradedays.Count(); for (int i = 0; i < length - trainingSetDuration; i = i + testSetDuration) { DateTime trainStart = tradedays[i]; DateTime trainEnd = tradedays[i + trainingSetDuration]; int testStartIndex = i + trainingSetDuration + 1; int testEndIndex = i + trainingSetDuration + testSetDuration; if (i == 0) { testStartIndex = 0; } if (testEndIndex >= length) { testEndIndex = length - 1; } stockRollInfo.code = stock.code; stockRollInfo.startDate = trainStart; stockRollInfo.endDate = trainEnd; var bestPara = getBestParameters(stockRollInfo); Console.WriteLine("start:{0}, end:{1}, bestSharpe:{2}, para1:{3}, para2:{4}, para3:{5}", trainStart, trainEnd, bestPara.bestSharpe, bestPara.parameter1, bestPara.parameter2, bestPara.parameter3); for (int j = testStartIndex; j <= testEndIndex; j++) { parameterPair para = new parameterPair(); para.code = stock.code; para.date = tradedays[j]; para.parameter1 = bestPara.parameter1; para.parameter2 = bestPara.parameter2; para.parameter3 = bestPara.parameter3; para.strategy = bestPara.strategy; para.existGoodParameter = bestPara.existGoodParameter; parameters.Add(para.date, para); } } List <netvalueDaily> nv = new List <netvalueDaily>(); List <OneByOneTransaction> transactionData = new List <OneByOneTransaction>(); dualTrust(stock, parameters, ref nv, ref transactionData); double sharpe = Utilities.strategyPerformance.sharpeRatioByDailyNetValue(nv.Select(s => s.netvalue).ToList()); return(sharpe); }