首页 > 解决方案 > 坚持使用线性优化函数优化投资组合权重

问题描述

语境

我目前正在寻求建立一个优化功能来建立投资组合权重。它类似于 excel 求解器或 google 表格求解器功能(尽管有问题)。虽然它的工作方式与 excel VBA 不同。这是我第一次玩它。下面是脚本:

function PortfolioOptimisation() {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    var assets = ['AssetOne','AssetTwo','AssetThree','AssetFour','AssetFive',
                  'AssetSix','AssetSeven','AssetEight']; //What I using to optimise variables
    var weights = ss.getRangeByName(assets); 
    // The variables to optimise
    var factors = ['OptimisationExpectedReturn','OptimisationExpectedVol','OptimisationNegativeReturn',
                   'OptimisationPositiveReturns','OptimisationPositiveRisk','OptimisationNegativeRisk',
                   'OptimisationSortinoRatio','OptimisationSharpeRatio']; //Store it in a variable as I do not want to keep typing up the named ranges. 
    var sumWeights = ss.getRangeByName('OptimisationWeightsSum')
    var optimalPortfolios = ss.getRangeByName(factors);


    // Call the optimiser engine
    var engine = LinearOptimizationService.createEngine();
    engine.addVariable(optimalPortfolios[0]);// Add first variable,
    // Add constraints: weights =1, Sum of weights =1, weights = greater than 0, less than or equal to 1.
    var constraint = engine.addConstraints([0.0],[1.0],[weights,sumWeights],[weights]);
    

这就是我试图将其应用于: 电子表格

它包含将使用优化函数计算的每个单元格中的公式。

问题

如何执行优化功能以根据电子表格中的“投资组合部分/列”找到最佳值?我该如何改进上面的代码?

例如,在电子表格的第二个选项卡/工作表中,在第一个投资组合名称上,我想通过最大化 Sortino 比率并将其最小化来优化资产的权重。那么使用优化引擎,可以帮助我实现这一目标的资产的最佳权重是多少?我想对投资组合列中列出的其他投资组合做同样的事情。

标签: javascriptoptimizationgoogle-sheetssolverquantitative-finance

解决方案


正如文档中解释的那样,找到您应该运行的最佳值engine.solve()。这将返回值,因此您需要将它们存储在一个变量中,然后在您想要的任何地方使用它们。

...
var constraint = engine.addConstraints([0.0],[1.0],[weights,sumWeights],[weights]);

// Get the result of the optimization engine
var solution = engine.solve()

另请记住,solve()的默认截止日期为 30 秒。如果您想修改默认截止时间,只需将您想要的秒数作为参数传递,就像这样engine.solve(300)。此外,检查可应用于您的解决方案的这些方法,例如,确定它是可行的还是最优的。


推荐阅读