Soontornkit2010.java

  1. package org.drip.sample.blacklitterman;

  2. import org.drip.measure.bayesian.R1MultivariateConvolutionMetrics;
  3. import org.drip.measure.continuous.MultivariateMeta;
  4. import org.drip.measure.gaussian.*;
  5. import org.drip.numerical.common.FormatUtil;
  6. import org.drip.numerical.linearalgebra.Matrix;
  7. import org.drip.portfolioconstruction.allocator.*;
  8. import org.drip.portfolioconstruction.asset.Portfolio;
  9. import org.drip.portfolioconstruction.bayesian.*;
  10. import org.drip.service.env.EnvManager;

  11. /*
  12.  * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  13.  */

  14. /*!
  15.  * Copyright (C) 2020 Lakshmi Krishnamurthy
  16.  * Copyright (C) 2019 Lakshmi Krishnamurthy
  17.  * Copyright (C) 2018 Lakshmi Krishnamurthy
  18.  * Copyright (C) 2017 Lakshmi Krishnamurthy
  19.  * Copyright (C) 2016 Lakshmi Krishnamurthy
  20.  *
  21.  *  This file is part of DROP, an open-source library targeting analytics/risk, transaction cost analytics,
  22.  *      asset liability management analytics, capital, exposure, and margin analytics, valuation adjustment
  23.  *      analytics, and portfolio construction analytics within and across fixed income, credit, commodity,
  24.  *      equity, FX, and structured products. It also includes auxiliary libraries for algorithm support,
  25.  *      numerical analysis, numerical optimization, spline builder, model validation, statistical learning,
  26.  *      and computational support.
  27.  *  
  28.  *      https://lakshmidrip.github.io/DROP/
  29.  *  
  30.  *  DROP is composed of three modules:
  31.  *  
  32.  *  - DROP Product Core - https://lakshmidrip.github.io/DROP-Product-Core/
  33.  *  - DROP Portfolio Core - https://lakshmidrip.github.io/DROP-Portfolio-Core/
  34.  *  - DROP Computational Core - https://lakshmidrip.github.io/DROP-Computational-Core/
  35.  *
  36.  *  DROP Product Core implements libraries for the following:
  37.  *  - Fixed Income Analytics
  38.  *  - Loan Analytics
  39.  *  - Transaction Cost Analytics
  40.  *
  41.  *  DROP Portfolio Core implements libraries for the following:
  42.  *  - Asset Allocation Analytics
  43.  *  - Asset Liability Management Analytics
  44.  *  - Capital Estimation Analytics
  45.  *  - Exposure Analytics
  46.  *  - Margin Analytics
  47.  *  - XVA Analytics
  48.  *
  49.  *  DROP Computational Core implements libraries for the following:
  50.  *  - Algorithm Support
  51.  *  - Computation Support
  52.  *  - Function Analysis
  53.  *  - Model Validation
  54.  *  - Numerical Analysis
  55.  *  - Numerical Optimizer
  56.  *  - Spline Builder
  57.  *  - Statistical Learning
  58.  *
  59.  *  Documentation for DROP is Spread Over:
  60.  *
  61.  *  - Main                     => https://lakshmidrip.github.io/DROP/
  62.  *  - Wiki                     => https://github.com/lakshmiDRIP/DROP/wiki
  63.  *  - GitHub                   => https://github.com/lakshmiDRIP/DROP
  64.  *  - Repo Layout Taxonomy     => https://github.com/lakshmiDRIP/DROP/blob/master/Taxonomy.md
  65.  *  - Javadoc                  => https://lakshmidrip.github.io/DROP/Javadoc/index.html
  66.  *  - Technical Specifications => https://github.com/lakshmiDRIP/DROP/tree/master/Docs/Internal
  67.  *  - Release Versions         => https://lakshmidrip.github.io/DROP/version.html
  68.  *  - Community Credits        => https://lakshmidrip.github.io/DROP/credits.html
  69.  *  - Issues Catalog           => https://github.com/lakshmiDRIP/DROP/issues
  70.  *  - JUnit                    => https://lakshmidrip.github.io/DROP/junit/index.html
  71.  *  - Jacoco                   => https://lakshmidrip.github.io/DROP/jacoco/index.html
  72.  *
  73.  *  Licensed under the Apache License, Version 2.0 (the "License");
  74.  *      you may not use this file except in compliance with the License.
  75.  *  
  76.  *  You may obtain a copy of the License at
  77.  *      http://www.apache.org/licenses/LICENSE-2.0
  78.  *  
  79.  *  Unless required by applicable law or agreed to in writing, software
  80.  *      distributed under the License is distributed on an "AS IS" BASIS,
  81.  *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  82.  *  
  83.  *  See the License for the specific language governing permissions and
  84.  *      limitations under the License.
  85.  */

  86. /**
  87.  * <i>Soontornkit2010</i> reconciles the Outputs of the Black-Litterman Model Process. The References are:
  88.  *  
  89.  * <br><br>
  90.  *  <ul>
  91.  *      <li>
  92.  *          Da, Z., and R. Jagannathan (2005): https://www3.nd.edu/~zda/TeachingNote_Black-Litterman.pdf
  93.  *      </li>
  94.  *      <li>
  95.  *          He. G., and R. Litterman (1999): <i>The Intuition behind the Black-Litterman Model Portfolios</i>
  96.  *              <b>Goldman Sachs Asset Management</b>
  97.  *      </li>
  98.  *      <li>
  99.  *          Soontornkit, S. (2010): The Black-Litterman Approach to Asset Allocation
  100.  *              http://www.bus.tu.ac.th/uploadPR/%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3%209%20%E0%B8%A1%E0%B8%B4.%E0%B8%A2.%2053/Black-Litterman_Supakorn.pdf
  101.  *      </li>
  102.  *  </ul>
  103.  *  
  104.  * <br><br>
  105.  *  <ul>
  106.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/ProductCore.md">Product Core Module</a></li>
  107.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/TransactionCostAnalyticsLibrary.md">Transaction Cost Analytics</a></li>
  108.  *      <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/README.md">DROP API Construction and Usage</a></li>
  109.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/blacklitterman/README.md">Canonical Black Litterman and Extensions</a></li>
  110.  *  </ul>
  111.  * <br><br>
  112.  *
  113.  * @author Lakshmi Krishnamurthy
  114.  */

  115. public class Soontornkit2010 {

  116.     public static final void main (
  117.         final String[] astArgs)
  118.         throws Exception
  119.     {
  120.         EnvManager.InitEnv (
  121.             "",
  122.             true
  123.         );

  124.         double dblTau = 0.3;
  125.         double dblRiskFreeRate = 0.03;
  126.         double adblHistoricalBenchmarkReturn = 0.049;
  127.         double dblHistoricalLongTermVariance = 0.0152;

  128.         String[] astrID1 = new String[] {
  129.             "AGRO & FOOD INDUSTRY    ",
  130.             "CONSUMER PRODUCTS       ",
  131.             "FINANCIALS              ",
  132.             "INDUSTRIALS             ",
  133.             "PROPERTY & CONSTRUCTION ",
  134.             "RESOURCES               ",
  135.             "SERVICES                ",
  136.             "TECHNOLOGY              "
  137.         };

  138.         String[] astrID2 = new String[] {
  139.             "ZRR3Y                   ",
  140.             "AGRO & FOOD INDUSTRY    ",
  141.             "CONSUMER PRODUCTS       ",
  142.             "FINANCIALS              ",
  143.             "INDUSTRIALS             ",
  144.             "PROPERTY & CONSTRUCTION ",
  145.             "RESOURCES               ",
  146.             "SERVICES                ",
  147.             "TECHNOLOGY              "
  148.         };

  149.         double[] adblMarketCapitalizationEstimate = new double[] {
  150.             1118732.,
  151.              143798.,
  152.             3136108.,
  153.             1727804.,
  154.             2096000.,
  155.             4497231.,
  156.              816320.,
  157.             1808058.
  158.         };

  159.         double[][] aadblAssetExcessReturnsCovariance = new double[][] {
  160.             { 0.0013, -0.0010, -0.0005, -0.0009, -0.0019, -0.0004, -0.0014, -0.0008, -0.0006},
  161.             {-0.0010,  0.0391,  0.0158,  0.0398,  0.0496,  0.0462,  0.0454,  0.0370,  0.0265},
  162.             {-0.0005,  0.0158,  0.0118,  0.0150,  0.0203,  0.0204,  0.0191,  0.0161,  0.0111},
  163.             {-0.0009,  0.0398,  0.0150,  0.0683,  0.0696,  0.0667,  0.0623,  0.0489,  0.0403},
  164.             {-0.0019,  0.0496,  0.0203,  0.0696,  0.1029,  0.0809,  0.0829,  0.0629,  0.0471},
  165.             {-0.0004,  0.0462,  0.0204,  0.0667,  0.0809,  0.0791,  0.0699,  0.0566,  0.0453},
  166.             {-0.0014,  0.0454,  0.0191,  0.0623,  0.0829,  0.0699,  0.0943,  0.0557,  0.0481},
  167.             {-0.0008,  0.0370,  0.0161,  0.0489,  0.0629,  0.0566,  0.0557,  0.0500,  0.0384},
  168.             {-0.0006,  0.0265,  0.0111,  0.0403,  0.0471,  0.0453,  0.0481,  0.0384,  0.0473}
  169.         };

  170.         double[][] aadblAssetSpaceViewProjection = new double[][] {
  171.             {  1.00,  0.00,  0.00,  0.00,  0.00,  0.00,  0.00,  0.00,  0.00},
  172.             {  0.00,  0.00, -1.00,  0.00,  0.00,  0.00,  1.00,  0.00,  0.00},
  173.             {  0.00,  0.00,  0.00, -0.41,  0.49,  0.00, -0.59,  0.00,  0.51}
  174.         };

  175.         double[] adblProjectionExpectedExcessReturns = new double[] {
  176.             0.000,
  177.             0.020,
  178.             0.001
  179.         };

  180.         double[][] aadblProjectionExcessReturnsCovariance = new double[][] {
  181.             {0.0013, 0.0000, 0.0000},
  182.             {0.0000, 0.0679, 0.0000},
  183.             {0.0000, 0.0000, 0.0132}
  184.         };

  185.         double[] adblMarketCapitalizationWeight1Reconciler = new double[] {
  186.             0.07,
  187.             0.01,
  188.             0.20,
  189.             0.11,
  190.             0.14,
  191.             0.29,
  192.             0.05,
  193.             0.12
  194.         };

  195.         double[] adblMarketCapitalizationWeight2Reconciler = new double[] {
  196.             0.500,
  197.             0.036,
  198.             0.005,
  199.             0.102,
  200.             0.056,
  201.             0.068,
  202.             0.147,
  203.             0.027,
  204.             0.059
  205.         };

  206.         double[] adblExpectedExcessReturnReconciler = new double[] {
  207.             0.0001,
  208.             0.0221,
  209.             0.0096,
  210.             0.0312,
  211.             0.0397,
  212.             0.0361,
  213.             0.0350,
  214.             0.0280,
  215.             0.0244
  216.         };

  217.         double[] adblAssetSpaceJointReturnsReconciler = new double[] {
  218.             0.0336,
  219.             0.0333,
  220.             0.0315,
  221.             0.0614,
  222.             0.0562,
  223.             0.0568,
  224.             0.0577,
  225.             0.0608
  226.         };

  227.         R1MultivariateNormal viewDistribution = R1MultivariateNormal.Standard (
  228.             new MultivariateMeta (
  229.                 new String[] {
  230.                     "PROJECTION #1",
  231.                     "PROJECTION #2",
  232.                     "PROJECTION #3"
  233.                 }
  234.             ),
  235.             adblProjectionExpectedExcessReturns,
  236.             aadblProjectionExcessReturnsCovariance
  237.         );

  238.         double dblRiskAversion = RiskUtilitySettingsEstimator.EquilibriumRiskAversion (
  239.             adblHistoricalBenchmarkReturn,
  240.             dblRiskFreeRate,
  241.             dblHistoricalLongTermVariance
  242.         );

  243.         double[] adblMarketCapitalizationWeight2 = new double[adblMarketCapitalizationEstimate.length + 1];
  244.         double[] adblMarketCapitalizationWeight1 = new double[adblMarketCapitalizationEstimate.length];
  245.         adblMarketCapitalizationWeight2[0] = 0.50;
  246.         double dblTotalMarketCapitalization = 0.;

  247.         for (int i = 0; i < adblMarketCapitalizationEstimate.length; ++i)
  248.             dblTotalMarketCapitalization += adblMarketCapitalizationEstimate[i];

  249.         for (int i = 0; i < adblMarketCapitalizationEstimate.length; ++i) {
  250.             adblMarketCapitalizationWeight1[i] = adblMarketCapitalizationEstimate[i] / dblTotalMarketCapitalization;
  251.             adblMarketCapitalizationWeight2[i + 1] = 0.5 * adblMarketCapitalizationWeight1[i];
  252.         }

  253.         double[] adblExpectedExcessReturn = Matrix.Product (
  254.             aadblAssetExcessReturnsCovariance,
  255.             adblMarketCapitalizationWeight2
  256.         );

  257.         for (int i = 0; i < adblExpectedExcessReturn.length; ++i)
  258.             adblExpectedExcessReturn[i] *= dblRiskAversion;

  259.         BlackLittermanCombinationEngine blce = new BlackLittermanCombinationEngine (
  260.             ForwardReverseHoldingsAllocation.Reverse (
  261.                 Portfolio.Standard (
  262.                     astrID2,
  263.                     adblMarketCapitalizationWeight2
  264.                 ),
  265.                 aadblAssetExcessReturnsCovariance,
  266.                 dblRiskAversion
  267.             ),
  268.             new PriorControlSpecification (
  269.                 false,
  270.                 dblRiskFreeRate,
  271.                 dblTau
  272.             ),
  273.             new ProjectionSpecification (
  274.                 viewDistribution,
  275.                 aadblAssetSpaceViewProjection
  276.             )
  277.         );

  278.         R1MultivariateConvolutionMetrics jpm = blce.customConfidenceRun().jointPosteriorMetrics();

  279.         R1MultivariateNormal jointDistribution = (R1MultivariateNormal) jpm.joint();

  280.         R1MultivariateNormal posteriorDistribution = (R1MultivariateNormal) jpm.posterior();

  281.         double[] adblAssetSpaceJointReturns = jointDistribution.mean();

  282.         double[][] aadblAssetSpaceJointCovariance = jointDistribution.covariance().covarianceMatrix();

  283.         double[][] aadblAssetSpacePosteriorCovariance = posteriorDistribution.covariance().covarianceMatrix();

  284.         System.out.println ("\n\t|------------------------||");

  285.         System.out.println ("\t| TAU   => " + FormatUtil.FormatDouble (dblTau, 1, 8, 1.) + "   ||");

  286.         System.out.println ("\t| DELTA => " + FormatUtil.FormatDouble (dblRiskAversion, 1, 8, 1.) + "   ||");

  287.         System.out.println ("\t|------------------------||");

  288.         System.out.println ("\n\t||-------------------------------------------||");

  289.         System.out.println ("\t||    MARKET CAPITALIZATION RECONCILER #1    ||");

  290.         System.out.println ("\t||-------------------------------------------||");

  291.         System.out.println ("\t||           SECTOR         =>  WT. |  PAPER ||");

  292.         System.out.println ("\t||-------------------------------------------||");

  293.         for (int i = 0; i < adblMarketCapitalizationEstimate.length; ++i)
  294.             System.out.println (
  295.                 "\t|| " + astrID1[i] + " => " +
  296.                     FormatUtil.FormatDouble (adblMarketCapitalizationWeight1[i], 2, 0, 100.) + "% |  " +
  297.                     FormatUtil.FormatDouble (adblMarketCapitalizationWeight1Reconciler[i], 2, 0, 100.) + "%  ||"
  298.             );

  299.         System.out.println ("\t||-------------------------------------------||\n");

  300.         System.out.println ("\t||----------------------------------------------||");

  301.         System.out.println ("\t||      MARKET CAPITALIZATION RECONCILER #2     ||");

  302.         System.out.println ("\t||----------------------------------------------||");

  303.         System.out.println ("\t||           SECTOR         => WEIGHT |  PAPER  ||");

  304.         System.out.println ("\t||----------------------------------------------||");

  305.         for (int i = 0; i <= adblMarketCapitalizationEstimate.length; ++i)
  306.             System.out.println (
  307.                 "\t|| " + astrID2[i] + " => " +
  308.                     FormatUtil.FormatDouble (adblMarketCapitalizationWeight2[i], 2, 1, 100.) + "% | " +
  309.                     FormatUtil.FormatDouble (adblMarketCapitalizationWeight2Reconciler[i], 2, 1, 100.) + "%  ||"
  310.             );

  311.         System.out.println ("\t||----------------------------------------------||\n");

  312.         System.out.println ("\t||----------------------------------------------||");

  313.         System.out.println ("\t||             IMPLIED EXCESS RETURN            ||");

  314.         System.out.println ("\t||----------------------------------------------||");

  315.         System.out.println ("\t||           SECTOR         => RETURN |  PAPER  ||");

  316.         System.out.println ("\t||----------------------------------------------||");

  317.         for (int i = 0; i < adblExpectedExcessReturn.length; ++i)
  318.             System.out.println (
  319.                 "\t|| " + astrID2[i] + " => " +
  320.                     FormatUtil.FormatDouble (adblExpectedExcessReturn[i], 1, 2, 100.) + "% | " +
  321.                     FormatUtil.FormatDouble (adblExpectedExcessReturnReconciler[i], 1, 2, 100.) + "%  ||"
  322.             );

  323.         System.out.println ("\t||----------------------------------------------||\n");

  324.         System.out.println ("\t||----------------------------------------------||");

  325.         System.out.println ("\t||             IMPLIED MARKET RETURN            ||");

  326.         System.out.println ("\t||----------------------------------------------||");

  327.         System.out.println ("\t||           SECTOR         => RETURN |  PAPER  ||");

  328.         System.out.println ("\t||----------------------------------------------||");

  329.         for (int i = 0; i < adblExpectedExcessReturn.length; ++i)
  330.             System.out.println (
  331.                 "\t|| " + astrID2[i] + " => " +
  332.                     FormatUtil.FormatDouble (adblExpectedExcessReturn[i] + dblRiskFreeRate, 1, 2, 100.) + "% | " +
  333.                     FormatUtil.FormatDouble (adblExpectedExcessReturnReconciler[i] + dblRiskFreeRate, 1, 2, 100.) + "%  ||"
  334.             );

  335.         System.out.println ("\t||----------------------------------------------||\n");

  336.         System.out.println ("\n\t|------------------------------------------------------------------------------------------------||");

  337.         System.out.println ("\t|                           PRIOR CROSS ASSET COVARIANCE MATRIX                                  ||");

  338.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  339.         String strHeader = "\t|     |";

  340.         for (int i = 0; i < astrID2.length; ++i)
  341.             strHeader += "    " + astrID2[i] + "     |";

  342.         System.out.println (strHeader + "|");

  343.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  344.         for (int i = 0; i < astrID2.length; ++i) {
  345.             String strDump = "\t| " + astrID2[i] + " ";

  346.             for (int j = 0; j < astrID2.length; ++j)
  347.                 strDump += "|" + FormatUtil.FormatDouble (aadblAssetExcessReturnsCovariance[i][j], 1, 8, 1.) + " ";

  348.             System.out.println (strDump + "||");
  349.         }

  350.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  351.         System.out.println ("\n\t|------------------------------------------------------------------------------------------------||");

  352.         System.out.println ("\t|                          VIEW SCOPING ASSET PROJECTION LOADING                                 ||");

  353.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  354.         strHeader = "\t|     |";

  355.         for (int i = 0; i < astrID2.length; ++i)
  356.             strHeader += "    " + astrID2[i] + "     |";

  357.         System.out.println (strHeader + "|");

  358.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  359.         for (int i = 0; i < aadblAssetSpaceViewProjection.length; ++i) {
  360.             String strDump = "\t|  #" + i + " ";

  361.             for (int j = 0; j < astrID2.length; ++j)
  362.                 strDump += "|" + FormatUtil.FormatDouble (aadblAssetSpaceViewProjection[i][j], 1, 8, 1.) + " ";

  363.             System.out.println (strDump + "||");
  364.         }

  365.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  366.         System.out.println ("\n\t|------------------------------------------------------------------------------------------------||");

  367.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  368.         for (int i = 0; i < aadblAssetSpaceViewProjection.length; ++i) {
  369.             String strDump = "\t|  #" + i + " ";

  370.             for (int j = 0; j < aadblAssetSpaceViewProjection.length; ++j)
  371.                 strDump += "|" + FormatUtil.FormatDouble (aadblProjectionExcessReturnsCovariance[i][j], 1, 8, 1.) + " ";

  372.             System.out.println (strDump + "|" + FormatUtil.FormatDouble (adblProjectionExpectedExcessReturns[i], 1, 2, 100.) + "%");
  373.         }

  374.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  375.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  376.         System.out.println ("\n\t|------------------------------------------------------------------------------------------------||");

  377.         System.out.println ("\t|                           JOINT CROSS ASSET COVARIANCE MATRIX                                  ||");

  378.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  379.         strHeader = "\t|     |";

  380.         for (int i = 0; i < astrID2.length; ++i)
  381.             strHeader += "    " + astrID2[i] + "     |";

  382.         System.out.println (strHeader + "|");

  383.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  384.         for (int i = 0; i < astrID2.length; ++i) {
  385.             String strDump = "\t| " + astrID2[i] + " ";

  386.             for (int j = 0; j < astrID2.length; ++j)
  387.                 strDump += "|" + FormatUtil.FormatDouble (aadblAssetSpaceJointCovariance[i][j], 1, 8, 1.) + " ";

  388.             System.out.println (strDump + "||");
  389.         }

  390.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  391.         System.out.println ("\n\t|------------------------------------------------------------------------------------------------||");

  392.         System.out.println ("\t|                         POSTERIOR CROSS ASSET COVARIANCE MATRIX                                ||");

  393.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  394.         strHeader = "\t|     |";

  395.         for (int i = 0; i < astrID2.length; ++i)
  396.             strHeader += "    " + astrID2[i] + "     |";

  397.         System.out.println (strHeader + "|");

  398.         System.out.println ("\t|------------------------------------------------------------------------------------------------||");

  399.         for (int i = 0; i < astrID2.length; ++i) {
  400.             String strDump = "\t| " + astrID2[i] + " ";

  401.             for (int j = 0; j < astrID2.length; ++j)
  402.                 strDump += "|" + FormatUtil.FormatDouble (aadblAssetSpacePosteriorCovariance[i][j], 1, 8, 1.) + " ";

  403.             System.out.println (strDump + "||");
  404.         }

  405.         System.out.println ("\t|------------------------------------------------------------------------------------------------||\n");

  406.         System.out.println ("\t|------------------------||");

  407.         System.out.println ("\t| JOINT/POSTERIOR RETURN ||");

  408.         System.out.println ("\t|------------------------||");

  409.         System.out.println ("\t|   ID  => RIOC  | HL99  ||");

  410.         System.out.println ("\t|------------------------||");

  411.         for (int i = 0; i < adblAssetSpaceJointReturnsReconciler.length; ++i) {
  412.             System.out.println (
  413.                 "\t| [" + astrID2[i] + "] =>" +
  414.                 FormatUtil.FormatDouble (adblAssetSpaceJointReturns[i], 2, 2, 100.) + "% |" +
  415.                 FormatUtil.FormatDouble (adblAssetSpaceJointReturnsReconciler[i], 2, 2, 100.) + "% ||"
  416.             );
  417.         }

  418.         System.out.println ("\t|------------------------||");

  419.         EnvManager.TerminateEnv();
  420.     }
  421. }