Привет всем!
В настоящее время я работаю над финансовым проектом на C#, где я необходимо провести оптимизацию портфеля. Моя цель — создать класс или функцию, которая принимает три входных вектора (по одному для рисков, доходности и продолжительности облигаций) вместе с тремя целевыми значениями (по одному для каждого). Цель состоит в том, чтобы оптимизировать вес каждой облигации в портфеле для достижения как можно более точной целевой дюрации с ограничениями, основанными на риске и доходности.
Хотя я знаком с ООП и Python, я новичок в C#, поэтому изо всех сил пытаюсь заставить свой код работать. Я постоянно сталкиваюсь с этой ошибкой:
Код: Выделить всё
Unhandled exception. System.NotImplementedException: The method or operation is not implemented.at Proj.ObjectiveFunction.MathNet.Numerics.Optimization.IObjectiveFunctionEvaluation.get_Gradient() in /Users/ally/Desktop/NewProj/NewProj/ClasseOptimisation.cs:line 57
at MathNet.Numerics.Optimization.MinimizerBase.ValidateGradientAndObjective(IObjectiveFunctionEvaluation eval)
at MathNet.Numerics.Optimization.BfgsMinimizer.FindMinimum(IObjectiveFunction objective, Vector`1 initialGuess)
at Proj.Optimisation.SolverEquation() in /Users/ally/Desktop/NewProj/NewProj/ClasseOptimisation.cs:line 172
at Program.$(String[] args) in /Users/ally/Desktop/NewProj/NewProj/Program.cs:line 34
Код: Выделить всё
void IObjectiveFunction.EvaluateAt(Vector point)
{
throw new NotImplementedException();
}
Интернет-версия документация по пакету мне не очень помогла, поэтому буду признателен за любую помощь.
Вот весь мой класс оптимизации:
Код: Выделить всё
using MathNet.Numerics.Optimization;
using MathNet.Numerics.LinearAlgebra;
using System;
using System.Security.Cryptography.X509Certificates;
namespace Proj
{
public class ObjectiveFunction : IObjectiveFunction
{
private readonly List _durations;
public ObjectiveFunction(List durations)
{
_durations = durations;
}
// Méthode pour calculer la valeur de la fonction objective
public double Value(Vector point)
{
double totalDuration = 0;
for (int i = 0; i < point.Count; i++)
{
totalDuration += point[i] * _durations[i];
}
return totalDuration;
}
// Méthode pour calculer le gradient de la fonction objective
public Vector Gradient(Vector point)
{
var gradient = Vector.Build.Dense(point.Count);
for (int i = 0; i < point.Count; i++)
{
gradient[i] = _durations[i];
}
return gradient;
}
public IObjectiveFunctionPoint Evaluate(Vector point)
{
double value = Value(point);
Vector gradient = Gradient(point);
return new ObjectiveFunctionPoint(point, value, gradient);
}
// Propriétés requises par `IObjectiveFunction`
public bool IsGradientSupported => true;
public bool IsHessianSupported => false;
public Vector Point => throw new NotImplementedException();
double IObjectiveFunctionEvaluation.Value => throw new NotImplementedException();
Vector IObjectiveFunctionEvaluation.Gradient => throw new NotImplementedException();
public Matrix Hessian => throw new NotImplementedException();
public IObjectiveFunction CreateNew()
{
return new ObjectiveFunction(_durations);
}
public IObjectiveFunction Fork()
{
throw new NotImplementedException();
}
void IObjectiveFunction.EvaluateAt(Vector point)
{
throw new NotImplementedException();
}
}
public class ObjectiveFunctionPoint : IObjectiveFunctionPoint
{
public Vector Point { get; private set; }
public double Value { get; private set; }
public Vector Gradient { get; private set; }
public Matrix Hessian => null; // Hessienne non supportée dans cet exemple
public ObjectiveFunctionPoint(Vector point, double value, Vector gradient)
{
Point = point;
Value = value;
Gradient = gradient;
}
}
public interface IObjectiveFunctionPoint
{
}
public class Optimisation
{
// Paramètres cible
public double DurationCible { get; set; }
public double RisqueCible { get; set; }
public double RendCible { get; set; }
// Données
public List DurationsOblig { get; set; }
public List RisquesOblig { get; set; }
public List RendementsOblig { get; set; }
// Taille du portefeuille
public int n => DurationsOblig.Count;
public Optimisation(List durations, List risques, List rendements, double durationCible, double risqueCible, double rendCible)
{
DurationsOblig = durations;
RisquesOblig = risques;
RendementsOblig = rendements;
DurationCible = durationCible;
RisqueCible = risqueCible;
RendCible = rendCible;
}
public List SolverEquation()
{
// Assurez-vous que la taille de `initialWeights` est correcte
if (DurationsOblig.Count != RisquesOblig.Count || DurationsOblig.Count != RendementsOblig.Count)
{
throw new InvalidOperationException("Les listes de durées, risques, et rendements doivent avoir la même taille.");
}
int n = DurationsOblig.Count;
// Initialisation des poids avec un nombre d'éléments égal à `n`
var initialWeights = Vector.Build.Dense(n, 1.0 / n);
// Création de la fonction objective
var objective = new ObjectiveFunction(DurationsOblig);
// Vérifiez la taille du vecteur dans la classe `ObjectiveFunction`
if (objective == null || DurationsOblig.Count != n)
{
throw new InvalidOperationException("La taille du vecteur des durées dans ObjectiveFunction doit correspondre au nombre de poids.");
}
// Créez les contraintes en vérifiant les tailles des vecteurs utilisés
Func RiskConstraint = weights =>
{
double totalRisk = 0;
for (int i = 0; i < n; i++)
{
totalRisk += weights[i] * RisquesOblig[i];
}
return totalRisk - RisqueCible;
};
Func ReturnConstraint = weights =>
{
double totalReturn = 0;
for (int i = 0; i < n; i++)
{
totalReturn += weights[i] * RendementsOblig[i];
}
return totalReturn - RendCible;
};
Func WeightSumConstraint = weights =>
{
double totalWeight = weights.Sum();
return totalWeight - 1;
};
// Utilisation du solveur d'optimisation
var optimizer = new BfgsMinimizer(1e-6, 1e-6, 1e-6, 1000);
var result = optimizer.FindMinimum(objective, initialWeights);
if (result.ReasonForExit == ExitCondition.Converged)
{
Console.WriteLine("Optimisation réussie !");
return result.MinimizingPoint.ToList();
}
else
{
Console.WriteLine("L'optimisation a échoué.");
return Enumerable.Repeat(0.0, n).ToList();
}
}
}
}
Заранее спасибо!!
Подробнее здесь: https://stackoverflow.com/questions/791 ... dexception
Мобильная версия