Table4DetailedBlowout.java
- package org.drip.sample.helitterman;
- import org.drip.numerical.common.FormatUtil;
- import org.drip.numerical.linearalgebra.Matrix;
- import org.drip.service.env.EnvManager;
- /*
- * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- */
- /*!
- * Copyright (C) 2019 Lakshmi Krishnamurthy
- * Copyright (C) 2018 Lakshmi Krishnamurthy
- * Copyright (C) 2017 Lakshmi Krishnamurthy
- * Copyright (C) 2016 Lakshmi Krishnamurthy
- *
- * This file is part of DROP, an open-source library targeting risk, transaction costs, exposure, margin
- * calculations, valuation adjustment, and portfolio construction within and across fixed income,
- * credit, commodity, equity, FX, and structured products.
- *
- * https://lakshmidrip.github.io/DROP/
- *
- * DROP is composed of three modules:
- *
- * - DROP Analytics Core - https://lakshmidrip.github.io/DROP-Analytics-Core/
- * - DROP Portfolio Core - https://lakshmidrip.github.io/DROP-Portfolio-Core/
- * - DROP Numerical Core - https://lakshmidrip.github.io/DROP-Numerical-Core/
- *
- * DROP Analytics Core implements libraries for the following:
- * - Fixed Income Analytics
- * - Asset Backed Analytics
- * - XVA Analytics
- * - Exposure and Margin Analytics
- *
- * DROP Portfolio Core implements libraries for the following:
- * - Asset Allocation Analytics
- * - Transaction Cost Analytics
- *
- * DROP Numerical Core implements libraries for the following:
- * - Statistical Learning
- * - Numerical Optimizer
- * - Spline Builder
- * - Algorithm Support
- *
- * Documentation for DROP is Spread Over:
- *
- * - Main => https://lakshmidrip.github.io/DROP/
- * - Wiki => https://github.com/lakshmiDRIP/DROP/wiki
- * - GitHub => https://github.com/lakshmiDRIP/DROP
- * - Repo Layout Taxonomy => https://github.com/lakshmiDRIP/DROP/blob/master/Taxonomy.md
- * - Javadoc => https://lakshmidrip.github.io/DROP/Javadoc/index.html
- * - Technical Specifications => https://github.com/lakshmiDRIP/DROP/tree/master/Docs/Internal
- * - Release Versions => https://lakshmidrip.github.io/DROP/version.html
- * - Community Credits => https://lakshmidrip.github.io/DROP/credits.html
- * - Issues Catalog => https://github.com/lakshmiDRIP/DROP/issues
- * - JUnit => https://lakshmidrip.github.io/DROP/junit/index.html
- * - Jacoco => https://lakshmidrip.github.io/DROP/jacoco/index.html
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- *
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /**
- * <i>Table4DetailedBlowout</i> replicates the detailed Steps involved in the Black-Litterman Model Process
- * as illustrated in Table #4 the Following Paper:
- *
- * <br><br>
- * <ul>
- * <li>
- * He. G., and R. Litterman (1999): The Intuition behind the Black-Litterman Model Portfolios,
- * Goldman Sachs Asset Management
- * </li>
- * </ul>
- *
- * <br><br>
- * <ul>
- * <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/PortfolioCore.md">Portfolio Core Module</a></li>
- * <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/AssetAllocationAnalyticsLibrary.md">Asset Allocation Analytics Library</a></li>
- * <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/README.md">Sample</a></li>
- * <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/helitterman/README.md">He and Litterman (1999) Reconcilers</a></li>
- * </ul>
- * <br><br>
- *
- * @author Lakshmi Krishnamurthy
- */
- public class Table4DetailedBlowout
- {
- public static void main (
- final String[] argumentArray)
- throws Exception
- {
- EnvManager.InitEnv ("");
- String[] sovereignArray = new String[]
- {
- "AUS",
- "CAD",
- "FRA",
- "GER",
- "JPN",
- "UK ",
- "USA"
- };
- double[][] inputCorrelationMatrix = new double[][]
- {
- {1.000, 0.488, 0.478, 0.515, 0.439, 0.512, 0.491},
- {0.488, 1.000, 0.664, 0.655, 0.310, 0.608, 0.779},
- {0.478, 0.664, 1.000, 0.861, 0.355, 0.783, 0.668},
- {0.515, 0.655, 0.861, 1.000, 0.354, 0.777, 0.653},
- {0.439, 0.310, 0.355, 0.354, 1.000, 0.405, 0.306},
- {0.512, 0.608, 0.783, 0.777, 0.405, 1.000, 0.652},
- {0.491, 0.779, 0.668, 0.653, 0.306, 0.652, 1.000}
- };
- double[] inputVolatilityArray = new double[]
- {
- 0.160,
- 0.203,
- 0.248,
- 0.271,
- 0.210,
- 0.200,
- 0.187
- };
- double[] inputWArray = new double[]
- {
- 0.016,
- 0.022,
- 0.052,
- 0.055,
- 0.116,
- 0.124,
- 0.615
- };
- double inputTAU = 0.05;
- double inputDELTA = 2.5;
- double[][] inputPMatrix = new double[][]
- {
- { 0.000, 0.000, -0.295, 1.000, 0.000, -0.705, 0.000}
- };
- double[][] inputOmegaMatrix = new double[][]
- {
- {0.021}
- };
- double[] inputQArray = new double[]
- {
- 0.05
- };
- int sovereignCount = sovereignArray.length;
- double[][] sigmaMatrix = new double[sovereignCount][sovereignCount];
- for (int sovereignIndexI = 0; sovereignIndexI < sovereignCount; ++sovereignIndexI)
- {
- for (int sovereignIndexJ = 0; sovereignIndexJ < sovereignCount; ++sovereignIndexJ)
- {
- sigmaMatrix[sovereignIndexI][sovereignIndexJ] = inputVolatilityArray[sovereignIndexI] *
- inputVolatilityArray[sovereignIndexJ] *
- inputCorrelationMatrix[sovereignIndexI][sovereignIndexJ];
- }
- }
- double[] piArray = Matrix.Product (
- sigmaMatrix,
- inputWArray
- );
- for (int sovereignIndex = 0; sovereignIndex < sovereignCount; ++sovereignIndex)
- {
- piArray[sovereignIndex] *= inputDELTA;
- }
- System.out.println();
- for (int sovereignIndex = 0; sovereignIndex < sovereignCount; ++sovereignIndex)
- {
- System.out.println (
- "\t{PI}[" + sovereignArray[sovereignIndex] + "] =>" +
- FormatUtil.FormatDouble (piArray[sovereignIndex], 1, 1, 100.) + "%"
- );
- }
- System.out.println();
- double[] pDotPIArray = Matrix.Product (
- inputPMatrix,
- piArray
- );
- for (int pDotPIIndex = 0; pDotPIIndex < pDotPIArray.length; ++pDotPIIndex)
- {
- System.out.println (
- "\t{P.PI}[" + pDotPIIndex + "] =>" +
- FormatUtil.FormatDouble (pDotPIArray[pDotPIIndex], 1, 6, 1.)
- );
- }
- System.out.println();
- double[] qMinus_PdotPI_Array = new double[inputQArray.length];
- for (int qIndex = 0; qIndex < inputQArray.length; ++qIndex)
- {
- qMinus_PdotPI_Array[qIndex] = inputQArray[qIndex] - pDotPIArray[qIndex];
- }
- for (int qMinus_PdotPI_ArrayIndex = 0;
- qMinus_PdotPI_ArrayIndex < qMinus_PdotPI_Array.length;
- ++qMinus_PdotPI_ArrayIndex)
- {
- System.out.println (
- "\t{Q-P.PI}[" + qMinus_PdotPI_ArrayIndex + "] =>" +
- FormatUtil.FormatDouble (qMinus_PdotPI_Array[qMinus_PdotPI_ArrayIndex], 1, 6, 1.)
- );
- }
- System.out.println();
- double[][] pTransposeMatrix = Matrix.Transpose (
- inputPMatrix
- );
- double[][] sigmaDot_PTranspose_Matrix = Matrix.Product (
- sigmaMatrix,
- pTransposeMatrix
- );
- for (int sigmaDot_PTranspose_MatrixRowIndex = 0;
- sigmaDot_PTranspose_MatrixRowIndex < sigmaDot_PTranspose_Matrix.length;
- ++sigmaDot_PTranspose_MatrixRowIndex)
- {
- for (int sigmaDot_PTranspose_MatrixColumnIndex = 0;
- sigmaDot_PTranspose_MatrixColumnIndex < sigmaDot_PTranspose_Matrix[0].length;
- ++sigmaDot_PTranspose_MatrixColumnIndex)
- {
- System.out.println (
- "\t{SIGMA.PTRANSPOSE}[" + sigmaDot_PTranspose_MatrixRowIndex + "][" + sigmaDot_PTranspose_MatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (sigmaDot_PTranspose_Matrix[sigmaDot_PTranspose_MatrixRowIndex][sigmaDot_PTranspose_MatrixColumnIndex], 1, 6, 1.)
- );
- }
- }
- System.out.println();
- double[][] pDotSIGMAdot_PTranspose_Matrix = Matrix.Product (
- inputPMatrix,
- sigmaDot_PTranspose_Matrix
- );
- for (int pDotSIGMAdot_PTranspose_MatrixRowIndex = 0;
- pDotSIGMAdot_PTranspose_MatrixRowIndex < pDotSIGMAdot_PTranspose_Matrix.length;
- ++pDotSIGMAdot_PTranspose_MatrixRowIndex)
- {
- for (int pDotSIGMAdot_PTranspose_MatrixColumnIndex = 0;
- pDotSIGMAdot_PTranspose_MatrixColumnIndex < pDotSIGMAdot_PTranspose_Matrix[0].length;
- ++pDotSIGMAdot_PTranspose_MatrixColumnIndex)
- {
- System.out.println (
- "\t{P.SIGMA.PTRANSPOSE}[" + pDotSIGMAdot_PTranspose_MatrixRowIndex + "][" + pDotSIGMAdot_PTranspose_MatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (pDotSIGMAdot_PTranspose_Matrix[pDotSIGMAdot_PTranspose_MatrixRowIndex][pDotSIGMAdot_PTranspose_MatrixColumnIndex], 1, 6, 1.)
- );
- }
- }
- System.out.println();
- double[][] pDotSIGMAdot_PTranspose_PlusOMEGAMatrix =
- new double[pDotSIGMAdot_PTranspose_Matrix.length][pDotSIGMAdot_PTranspose_Matrix[0].length];
- for (int pDotSIGMAdot_PTranspose_PlusOMEGAMatrixRowIndex = 0;
- pDotSIGMAdot_PTranspose_PlusOMEGAMatrixRowIndex < pDotSIGMAdot_PTranspose_PlusOMEGAMatrix.length;
- ++pDotSIGMAdot_PTranspose_PlusOMEGAMatrixRowIndex)
- {
- for (int pDotSIGMAdot_PTranspose_PlusOMEGAMatrixColumnIndex = 0;
- pDotSIGMAdot_PTranspose_PlusOMEGAMatrixColumnIndex <
- pDotSIGMAdot_PTranspose_PlusOMEGAMatrix[0].length;
- ++pDotSIGMAdot_PTranspose_PlusOMEGAMatrixColumnIndex)
- {
- pDotSIGMAdot_PTranspose_PlusOMEGAMatrix[pDotSIGMAdot_PTranspose_PlusOMEGAMatrixRowIndex][pDotSIGMAdot_PTranspose_PlusOMEGAMatrixColumnIndex] =
- pDotSIGMAdot_PTranspose_Matrix[pDotSIGMAdot_PTranspose_PlusOMEGAMatrixRowIndex][pDotSIGMAdot_PTranspose_PlusOMEGAMatrixColumnIndex] +
- inputOmegaMatrix[pDotSIGMAdot_PTranspose_PlusOMEGAMatrixRowIndex][pDotSIGMAdot_PTranspose_PlusOMEGAMatrixColumnIndex];
- System.out.println (
- "\t{P.SIGMA.PTRANSPOSE+OMEGA}[" + pDotSIGMAdot_PTranspose_PlusOMEGAMatrixRowIndex + "][" + pDotSIGMAdot_PTranspose_PlusOMEGAMatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (
- pDotSIGMAdot_PTranspose_PlusOMEGAMatrix[pDotSIGMAdot_PTranspose_PlusOMEGAMatrixRowIndex][pDotSIGMAdot_PTranspose_PlusOMEGAMatrixColumnIndex],
- 1, 6, 1.
- )
- );
- }
- }
- System.out.println();
- double[][] $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrix = Matrix.InvertUsingGaussianElimination (
- pDotSIGMAdot_PTranspose_PlusOMEGAMatrix
- );
- for (int $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixRowIndex = 0;
- $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixRowIndex <
- $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrix.length;
- ++$PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixRowIndex)
- {
- for (int $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixColumnIndex = 0;
- $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixColumnIndex <
- $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrix[0].length;
- ++$PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixColumnIndex)
- {
- System.out.println (
- "\t{P.SIGMA.PTRANSPOSE+OMEGA}^(-1)[" + $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixRowIndex + "][" + $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble ($PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrix[$PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixRowIndex][$PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrixColumnIndex], 1, 6, 1.)
- );
- }
- }
- System.out.println();
- double[] __$PDotSIGMADot_PTranspose_plusOMEGA$Inverse__Dot_QMinus__PDotPI__Array = Matrix.Product (
- $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrix,
- qMinus_PdotPI_Array
- );
- for (int __$PDotSIGMADot_PTranspose_plusOMEGA$Inverse__Dot_QMinus__PDotPI__ArrayIndex = 0;
- __$PDotSIGMADot_PTranspose_plusOMEGA$Inverse__Dot_QMinus__PDotPI__ArrayIndex <
- __$PDotSIGMADot_PTranspose_plusOMEGA$Inverse__Dot_QMinus__PDotPI__Array.length;
- ++__$PDotSIGMADot_PTranspose_plusOMEGA$Inverse__Dot_QMinus__PDotPI__ArrayIndex)
- {
- System.out.println (
- "\t{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{Q-P.PI}[" + __$PDotSIGMADot_PTranspose_plusOMEGA$Inverse__Dot_QMinus__PDotPI__ArrayIndex + "] =>" +
- FormatUtil.FormatDouble (__$PDotSIGMADot_PTranspose_plusOMEGA$Inverse__Dot_QMinus__PDotPI__Array[__$PDotSIGMADot_PTranspose_plusOMEGA$Inverse__Dot_QMinus__PDotPI__ArrayIndex], 1, 6, 1.)
- );
- }
- System.out.println();
- double[] sigmaDot$PTranspose$__$PDotSIGMADot_PTranspose_PlusOmega$Inverse__Dot_QMinus__PDotPI__Array
- = Matrix.Product (
- sigmaDot_PTranspose_Matrix,
- __$PDotSIGMADot_PTranspose_plusOMEGA$Inverse__Dot_QMinus__PDotPI__Array
- );
- for (int sigmaDot$PTranspose$__$PDotSIGMADot_PTranspose_PlusOmega$Inverse__Dot_QMinus__PDotPI__ArrayIndex = 0;
- sigmaDot$PTranspose$__$PDotSIGMADot_PTranspose_PlusOmega$Inverse__Dot_QMinus__PDotPI__ArrayIndex <
- sigmaDot$PTranspose$__$PDotSIGMADot_PTranspose_PlusOmega$Inverse__Dot_QMinus__PDotPI__Array.length;
- ++sigmaDot$PTranspose$__$PDotSIGMADot_PTranspose_PlusOmega$Inverse__Dot_QMinus__PDotPI__ArrayIndex)
- {
- System.out.println (
- "\t{SIGMA.PTRANSPOSE}{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{Q-P.PI}[" + sigmaDot$PTranspose$__$PDotSIGMADot_PTranspose_PlusOmega$Inverse__Dot_QMinus__PDotPI__ArrayIndex + "] =>" +
- FormatUtil.FormatDouble (sigmaDot$PTranspose$__$PDotSIGMADot_PTranspose_PlusOmega$Inverse__Dot_QMinus__PDotPI__Array[sigmaDot$PTranspose$__$PDotSIGMADot_PTranspose_PlusOmega$Inverse__Dot_QMinus__PDotPI__ArrayIndex], 1, 6, 1.)
- );
- }
- System.out.println();
- double[] piHatArray = new double[piArray.length];
- for (int piHatArrayIndex = 0; piHatArrayIndex < piHatArray.length; ++piHatArrayIndex)
- {
- piHatArray[piHatArrayIndex] = piArray[piHatArrayIndex] +
- sigmaDot$PTranspose$__$PDotSIGMADot_PTranspose_PlusOmega$Inverse__Dot_QMinus__PDotPI__Array[piHatArrayIndex];
- System.out.println (
- "\tPIHAT=PI+{SIGMA.PTRANSPOSE}{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{Q-P.PI}[" + piHatArrayIndex + "] =>" +
- FormatUtil.FormatDouble (piHatArray[piHatArrayIndex], 1, 1, 100.) + "%"
- );
- }
- System.out.println();
- double[][] pDotSigmaMatrix = Matrix.Product (
- inputPMatrix,
- sigmaMatrix
- );
- for (int pDotSigmaMatrixRowIndex = 0;
- pDotSigmaMatrixRowIndex < pDotSigmaMatrix.length;
- ++pDotSigmaMatrixRowIndex)
- {
- for (int pDotSigmaMatrixColumnIndex = 0;
- pDotSigmaMatrixColumnIndex < pDotSigmaMatrix[0].length;
- ++pDotSigmaMatrixColumnIndex)
- {
- System.out.println (
- "\tP.SIGMA[" + pDotSigmaMatrixRowIndex + "][" + pDotSigmaMatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (pDotSigmaMatrix[pDotSigmaMatrixRowIndex][pDotSigmaMatrixColumnIndex], 1, 6, 1.)
- );
- }
- }
- System.out.println();
- double[][] __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix = Matrix.Product (
- $PDotSIGMAdot_PTranspose_PlusOMEGA$InverseMatrix,
- pDotSigmaMatrix
- );
- for (int __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex = 0;
- __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex <
- __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix.length;
- ++__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex)
- {
- for (int __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex = 0;
- __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex <
- __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix[0].length;
- ++__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex)
- {
- System.out.println (
- "\t{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{P.SIGMA}[" + __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex + "][" + __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix[__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex][__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex], 1, 6, 1.)
- );
- }
- }
- System.out.println();
- double[][] sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrix =
- Matrix.Product (
- sigmaDot_PTranspose_Matrix,
- __$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix
- );
- for (int sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixRowIndex = 0;
- sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixRowIndex <
- sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrix.length;
- ++sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixRowIndex)
- {
- for (int sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixColumnIndex = 0;
- sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixColumnIndex <
- sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrix[0].length;
- ++sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixColumnIndex)
- {
- System.out.println (
- "\t{SIGMA.PTRANSPOSE}.{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{P.SIGMA}[" + sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixRowIndex + "][" + sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (
- sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrix[sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixRowIndex][sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrixColumnIndex],
- 1, 6, 1.
- )
- );
- }
- }
- System.out.println();
- double[][]
- sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix
- = new double[sovereignCount][sovereignCount];
- for (int sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex = 0;
- sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex <
- sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix.length;
- ++sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex)
- {
- for (int sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex = 0;
- sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex <
- sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix[0].length;
- ++sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex)
- {
- sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix[sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex][sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex] =
- sigmaMatrix[sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex][sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex] -
- sigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmegaPDotSigmaMatrix[sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex][sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex];
- System.out.println (
- "\tSIGMA-{SIGMA.PTRANSPOSE}.{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{P.SIGMA}[" + sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex + "][" + sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix[sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixRowIndex][sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrixColumnIndex], 1, 6, 1.)
- );
- }
- }
- System.out.println();
- double[][] tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix =
- new double[sovereignCount][sovereignCount];
- for (int tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex = 0;
- tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex <
- tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix.length;
- ++tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex)
- {
- for (int tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex = 0;
- tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex <
- tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix[0].length;
- ++tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex)
- {
- tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix[tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex][tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex] =
- inputTAU * sigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigmaMatrix[tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex][tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex];
- System.out.println (
- "\tTAU.(SIGMA-{SIGMA.PTRANSPOSE}.{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{P.SIGMA})[" + tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex + "][" + tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix[tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex][tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex], 1, 6, 1.)
- );
- }
- }
- System.out.println();
- double[][] sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix =
- new double[sovereignCount][sovereignCount];
- for (int sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex = 0;
- sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex <
- sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix.length;
- ++sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex)
- {
- for (int sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex = 0;
- sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex <
- sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix[0].length;
- ++sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex)
- {
- sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix[sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex][sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex] =
- sigmaMatrix[sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex][sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex] +
- tauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix[sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex][sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex];
- System.out.println (
- "\tSIGMA+TAU.(SIGMA-{SIGMA.PTRANSPOSE}.{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{P.SIGMA})[" + sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex + "][" + sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix[sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixRowIndex][sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$MatrixColumnIndex], 1, 6, 1.)
- );
- }
- }
- System.out.println();
- double[][] sigmaPInverseMatrix = Matrix.InvertUsingGaussianElimination (
- sigmaPlusTauDot$$SigmaMinusSigmaDot_PTranspose_Dot__$PDotSigmaDot_PTranspose_PlusOmega$Inverse__DotPDotSigma$$Matrix
- );
- for (int sigmaPInverseMatrixRowIndex = 0;
- sigmaPInverseMatrixRowIndex< sigmaPInverseMatrix.length;
- ++sigmaPInverseMatrixRowIndex)
- {
- for (int sigmaPInverseMatrixColumnIndex = 0;
- sigmaPInverseMatrixColumnIndex < sigmaPInverseMatrix[0].length;
- ++sigmaPInverseMatrixColumnIndex)
- {
- System.out.println (
- "\t[SIGMA+TAU.(SIGMA-{SIGMA.PTRANSPOSE}.{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{P.SIGMA})]^(-1)[" + sigmaPInverseMatrixRowIndex + "][" + sigmaPInverseMatrixColumnIndex + "] =>" +
- FormatUtil.FormatDouble (sigmaPInverseMatrix[sigmaPInverseMatrixRowIndex][sigmaPInverseMatrixColumnIndex], 1, 6, 1.)
- );
- }
- }
- System.out.println();
- double[] sigmaPInverseDotPiHatArray = Matrix.Product (
- sigmaPInverseMatrix,
- piHatArray
- );
- for (int sigmaPInverseDotPiHatArrayIndex = 0;
- sigmaPInverseDotPiHatArrayIndex < sigmaPInverseDotPiHatArray.length;
- ++sigmaPInverseDotPiHatArrayIndex)
- {
- sigmaPInverseDotPiHatArray[sigmaPInverseDotPiHatArrayIndex] /= inputDELTA;
- System.out.println (
- "\t[SIGMA+TAU.(SIGMA-{SIGMA.PTRANSPOSE}.{P.SIGMA.PTRANSPOSE+OMEGA}^(-1).{P.SIGMA})]^(-1).PIHAT[" + sigmaPInverseDotPiHatArrayIndex + "] =>" +
- FormatUtil.FormatDouble (sigmaPInverseDotPiHatArray[sigmaPInverseDotPiHatArrayIndex], 1, 1, 100.) + "%"
- );
- }
- System.out.println ("\n\n\t|----------------||");
- System.out.println ("\t| EQUILIBRIUM ||");
- System.out.println ("\t| RETURNS ||");
- System.out.println ("\t|----------------||");
- for (int piArrayIndex = 0; piArrayIndex < piArray.length; ++piArrayIndex)
- {
- System.out.println (
- "\t| [" + sovereignArray[piArrayIndex] + "] =>" +
- FormatUtil.FormatDouble (piArray[piArrayIndex], 2, 1, 100.) + "% ||"
- );
- }
- System.out.println ("\n\n\t|----------------||");
- System.out.println ("\t| BLACK LITERMAN ||");
- System.out.println ("\t| RETURNS ||");
- System.out.println ("\t|----------------||");
- for (int piArrayIndex = 0; piArrayIndex < piHatArray.length; ++piArrayIndex)
- {
- System.out.println (
- "\t| [" + sovereignArray[piArrayIndex] + "] =>" +
- FormatUtil.FormatDouble (piHatArray[piArrayIndex], 2, 1, 100.) + "% ||"
- );
- }
- System.out.println ("\t|----------------||");
- System.out.println ("\t|----------------||");
- System.out.println ("\n\n\t|-----------------||");
- System.out.println ("\t| EQUILIBRIUM ||");
- System.out.println ("\t| ALLOCATION ||");
- System.out.println ("\t|-----------------||");
- for (int inputWArrayIndex = 0; inputWArrayIndex < inputWArray.length; ++inputWArrayIndex)
- {
- System.out.println (
- "\t| [" + sovereignArray[inputWArrayIndex] + "] => " +
- FormatUtil.FormatDouble (inputWArray[inputWArrayIndex] / (1. + inputTAU), 2, 1, 100.) + "% ||"
- );
- }
- System.out.println ("\t|-----------------||");
- System.out.println ("\n\n\t|-----------------||");
- System.out.println ("\t| BLACK LITERMAN ||");
- System.out.println ("\t| ALLOCATION ||");
- System.out.println ("\t|-----------------||");
- for (int sigmaPInverseDotPiHatArrayIndex = 0;
- sigmaPInverseDotPiHatArrayIndex < sigmaPInverseDotPiHatArray.length;
- ++sigmaPInverseDotPiHatArrayIndex)
- {
- System.out.println (
- "\t| [" + sovereignArray[sigmaPInverseDotPiHatArrayIndex] + "] => " +
- FormatUtil.FormatDouble (sigmaPInverseDotPiHatArray[sigmaPInverseDotPiHatArrayIndex], 2, 1, 100.) + "% ||"
- );
- }
- System.out.println ("\t|-----------------||");
- System.out.println ("\n\n\t|------------------||");
- System.out.println ("\t| BLACK LITERMAN ||");
- System.out.println ("\t| ALLOCATION SHIFT ||");
- System.out.println ("\t|------------------||");
- for (int sigmaPInverseDotPiHatArrayIndex = 0;
- sigmaPInverseDotPiHatArrayIndex < sigmaPInverseDotPiHatArray.length;
- ++sigmaPInverseDotPiHatArrayIndex)
- {
- System.out.println (
- "\t| [" + sovereignArray[sigmaPInverseDotPiHatArrayIndex] + "] => " +
- FormatUtil.FormatDouble (sigmaPInverseDotPiHatArray[sigmaPInverseDotPiHatArrayIndex] - (inputWArray[sigmaPInverseDotPiHatArrayIndex] / (1. + inputTAU)), 2, 1, 100.) + "% ||"
- );
- }
- System.out.println ("\t|------------------||");
- EnvManager.TerminateEnv();
- }
- }