2

Extreme Optimization ルーチンを使用して、C# でリスク パリティ ポートフォリオを作成しようとしています。

私は主にそれらを購入する前に気に入るかどうかを試しています (私は学生なのでお金が逼迫しています)。

私のアイデアは、リスク・パリティと呼ばれるこの新しい種類のポートフォリオ最適化を実装することでした。基本的に、ポートフォリオを多様化するためには、その各コンポーネントに均等なリスクを与える必要があると言っています.

np1.Solve() を実行すると null エラーが発生しますが、その理由がわかりません。それ以外はエクストリームオプティマイゼーションで計算されていると思っていました。
1. 私は何を間違っていますか?
2. 私が知らないこの最適化を行うためのより高速な方法はありますか?
3. EO ライブラリを知らないが、これを C# の何かで実装できる場合は、これをどのように解決するかについてコメントを残していただけますか?

ちなみに、ポートフォリオ構築の詳細は距離関数のコメントにあるので、興味のある方はどうぞ。

よろしく、
エドゥアルド

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Extreme.Statistics;
using Extreme.Mathematics;
using Extreme.Mathematics.Optimization;

namespace TestingRiskParityOptimization
{
    class Program
    {

        static void Main(string[] args)
        {

            NonlinearProgram np1 = new NonlinearProgram(2);
            Func<Vector, double> distance = DistanceFunction;
            np1.ObjectiveFunction = distance;
            np1.InitialGuess = Vector.CreateConstant(2, 1.0 / ((double)2));

            np1.AddNonlinearConstraint(x => x[0] + x[1], ConstraintType.GreaterThanOrEqual, 0);
            Vector solution = np1.Solve();

            Console.WriteLine("Solution: {0:F6}", solution);
            Console.WriteLine("Optimal value:   {0:F6}", np1.OptimalValue);
            Console.WriteLine("# iterations: {0}", np1.SolutionReport.IterationsNeeded);

            Console.Write("Press Enter key to exit...");
            Console.ReadLine();

        }

        private static double DistanceFunction(Vector Weights)
        {
            Matrix Sigma = Matrix.Create(new double[,] {
                  {0.1, 0.2},
                  {0.2, 0.4}
                });
            // if VarP = Weights' * CovarMatrix * Weights and VolP = sqrt(VarP)
            // Then the marginal contribution to risk of an asset is the i-th number of
            // Sigma*Weights*VolP
            // And thus the contribution to risk of an asset is simply Weights . (Sigma*Weights/VarP)
            // we need to find weights such that Weights (i) * Row(i) of (Sigma*Weights/VarP) = 1/N

            // that is we want to minimize the distance of row vector (Weights (i) * Row(i) of (Sigma*Weights/VarP)) and vector 1/N

            double Variance = Vector.DotProduct(Weights, Sigma * Weights);

            Vector Beta = Sigma * Weights / Variance;

            for (int i = 0; i < Beta.Length; i++)
            {
                // multiplies row of beta by weight to find the percent contribution to risk
                Beta[i] = Weights[i] * Beta[i];
            }

            Vector ObjectiveVector = Vector.CreateConstant(Weights.Length, 1.0 / ((double)Weights.Length));
            Vector Distance = Vector.Subtract(Beta, ObjectiveVector);

            return Math.Sqrt(Vector.DotProduct(Distance, Distance));

        }
    }
}
4

1 に答える 1

1

目的関数の計算がスローされた場合は、デバッガーを介してコードを実行し、スローされたコードの正確な場所を特定することを強くお勧めします。私の最初の賭けは、たとえば行列とベクトルの乗算など、ベクトルサイズの不一致が原因でエラーが発生することです。このエラーの根底に到達した場合、最適化がスムーズに実行される可能性があります。

代わりに代替アルゴリズムを試したい場合は、次のいずれかの解決策を検討することをお勧めします。これらはすべて(非線形)線形制約の指定をサポートしており、目的関数と制約勾配を提供する必要はありません。

  • Microsoft Solver Foundation(msdn.microsoft.com/en-us/devlabs/hh145003.aspx)、数理最適化のためのMicrosoftのプラットフォーム
  • NLPソルバーとしてIpoptを使用するFunclib
  • Cscobyla、COBYLA2アルゴリズムのC#ポート、非線形制約をサポートする直接検索アルゴリズム(Nelder-Meadを参照)
于 2012-07-18T16:48:24.200 に答える