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);
        }