Optimization 微软解决方案基金会-结果不够好(股票投资组合优化)

Optimization 微软解决方案基金会-结果不够好(股票投资组合优化),optimization,ms-solver-foundation,quadratic-programming,Optimization,Ms Solver Foundation,Quadratic Programming,我试图用C#编写一个markowitz优化类,但是优化结果不够好。投资组合权重与matlab和excel的解决方案平均相差0.2%。我检查了我的协方差矩阵计算和其他计算,发现它们是正确的。有没有一种方法可以校准模型的公差或其他方法来获得更好的结果?这是我的密码 public List<OptimalWeight> CalcOptimalWeights(bool isNegativeAllowed,string method) { List<Opt

我试图用C#编写一个markowitz优化类,但是优化结果不够好。投资组合权重与matlab和excel的解决方案平均相差0.2%。我检查了我的协方差矩阵计算和其他计算,发现它们是正确的。有没有一种方法可以校准模型的公差或其他方法来获得更好的结果?这是我的密码

    public List<OptimalWeight> CalcOptimalWeights(bool isNegativeAllowed,string method)
    {
        List<OptimalWeight> weightsResult = new List<OptimalWeight>();

        List<List<CovarItem>> covariances = new List<List<CovarItem>>();

        covariances = CalcCovariances();

        int n = this.AssetReturnList.Count();

        SolverContext solver = SolverContext.GetContext();

        Model model = solver.CreateModel();



        if(isNegativeAllowed == false)
        {                
            Decision[] weights = new Decision[n];
            for (int i = 0; i < n; i++)
            {
                model.AddDecision(weights[i] = new Decision(Domain.RealNonnegative, null));
            }

            model.AddConstraint("SumWeights", Model.Sum(weights) == 1);

            if(this.Constraints.Count() == 0)
            {
                if (method == "MinVar")
                {
                    Term portVar = 0.0;

                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j < n; j++)
                        {
                            portVar += weights[j] * covariances[j][i].Covar * weights[i];
                        }
                    }

                    model.AddGoal("MinVarPort", GoalKind.Minimize, portVar);

                    Solution solution = solver.Solve();

                    var report = solution.GetReport();

                    var decisions = solution.Decisions;
                    List<double> d = decisions.Select(x => x.GetDouble()).ToList();

                    for(int i = 0 ; i < n; i++)
                    {
                        weightsResult.Add(new OptimalWeight {AssetId = AssetReturnList[i].AssetId,
                            Symbol = AssetReturnList[i].Symbol,
                            Weight = d[i] });
                    }

                    double pvar = solution.Goals.First().ToDouble();
                }
            }
        }

        return weightsResult;
    }
public-List-CalcOptimalWeights(bool是negativeallowed,string方法)
{
列表权重结果=新列表();
列表协方差=新列表();
协方差=计算方差();
int n=this.AssetReturnList.Count();
SolverContext solver=SolverContext.GetContext();
Model Model=solver.CreateModel();
如果(isNegativeAllowed==false)
{                
决策[]权重=新决策[n];
对于(int i=0;ix.GetDouble()).ToList();
对于(int i=0;i求解器基金会早就停止了,所以…你认为结果之间的差异是正常的吗?这是一个非常简单的问题,即使在20年前,Sover基金会早就停止了,所以…你认为结果之间的差异是正常的吗?我认为这是一个非常简单的问题,即使在20年前也是如此。