Hi Sergey
Please help me.
I am trying to use your quadratic program optimiser.
I have attached a very simple Visual Basic.NET module that shows what I am trying to do. (I changed the extension to .txt, to get through firewalls. Change it to .VB before you open it.)
The procedure "TestNoBudget" works.
The procedure "TestWithBudgetConstraint" does not. It returns a TerminationType of -5, which means that I shouldn't use the Cholesky algorithm or something.
I've also attached an Excel workbook that shows the correct solution for the "TestWithBudgetConstraint" example.
Here's the code:
Public Class AlglibTest
''' <summary> ''' Standard mean-variance portfolio optimisation: A quadratic problem. ''' Minimise: -aWeight' aExpReturn + .5 aWeight' matCov aWeight ''' Input the linear term as the negative of the expected returns ''' </summary> Public Sub TestNoBudget()
Dim matCov(,) As Double 'The quadratic term Dim aNegativeExpReturn() As Double 'The linear term (the negative of expected returns) Dim aBoundLower(), aBoundUpper() As Double Dim aStartingWeight(), aOptimalWeight() As Double Dim TerminationType As Integer
matCov = New Double(,) _ {{0.142, 0.056, 0.061}, _ {0.056, 0.181, 0.031}, _ {0.061, 0.031, 0.08}} aNegativeExpReturn = New Double() {-0.1, -0.1, -0.1} aBoundLower = New Double() {0, 0, 0} aBoundUpper = New Double() {Double.PositiveInfinity, Double.PositiveInfinity, Double.PositiveInfinity} aStartingWeight = New Double() {1 / 3, 1 / 3, 1 / 3}
aOptimalWeight = GetOptWeight(matCov, aNegativeExpReturn, aBoundLower, aBoundUpper, aStartingWeight, TerminationType)
End Sub
''' <summary> ''' As above, but including a constraint that the weights add to 1. ''' This is done using a Lagrangian multiplier ''' augmented into the input vector and matrix. ''' </summary> Public Sub TestWithBudgetConstraint()
Dim matCov(,) As Double Dim aNegativeExpReturn() As Double Dim aBoundLower(), aBoundUpper() As Double Dim aStartingWeight(), aOptimalWeight() As Double Dim TerminationType As Integer
matCov = New Double(,) _ {{0.142, 0.056, 0.061, 1}, _ {0.056, 0.181, 0.031, 1}, _ {0.061, 0.031, 0.08, 1}, _ {1, 1, 1, 0}} aNegativeExpReturn = New Double() {-0.1, -0.1, -0.1, -1} aBoundLower = New Double() {0, 0, 0, Double.NegativeInfinity} aBoundUpper = New Double() {Double.PositiveInfinity, Double.PositiveInfinity, Double.PositiveInfinity, Double.PositiveInfinity} aStartingWeight = New Double() {0.25, 0.25, 0.25, 0.25}
aOptimalWeight = GetOptWeight(matCov, aNegativeExpReturn, aBoundLower, aBoundUpper, aStartingWeight, TerminationType)
TerminationType = TerminationType
End Sub
''' <summary> ''' Using Alglib's quadratic program minimiser ''' </summary> Public Function GetOptWeight _ (ByVal matCov(,) As Double, ByVal aNegativeExpReturn() As Double, _ ByVal aBoundLower() As Double, ByVal aBoundUpper() As Double, _ ByVal aStartingWeight() As Double, _ ByRef TerminationType As Integer) _ As Double()
Try
Dim AlglibState As minqpstate = New XAlglib.minqpstate() Dim AlglibReport As minqpreport = New XAlglib.minqpreport() Dim aOptWeight() As Double Dim NumDimensions As Integer
NumDimensions = aNegativeExpReturn.GetLength(0)
'Set-up the problem and solve for this RA and Starting weights XAlglib.minqpcreate(NumDimensions, AlglibState) XAlglib.minqpsetquadraticterm(AlglibState, matCov) XAlglib.minqpsetlinearterm(AlglibState, aNegativeExpReturn) XAlglib.minqpsetstartingpoint(AlglibState, aStartingWeight) XAlglib.minqpsetbc(AlglibState, aBoundLower, aBoundUpper) XAlglib.minqpoptimize(AlglibState) XAlglib.minqpresults(AlglibState, aOptWeight, AlglibReport)
TerminationType = AlglibReport.terminationtype
'Return optimal weights Return aOptWeight
Catch ex As System.Exception Dim mEx As New ExceptionIMapsControl(GetCurrentMethod, ex) Throw mEx
End Try
End Function
End Class
_________________ Thank you, Regards Reg Bust
|