/* * MonteCarloSimulation.cpp * * Created on: 20.05.2011 * Author: sven */ #include "Normaldistribution.h" #include "MonteCarloSimulation.h" #include #include #include #include #include static const unsigned NUMBER_OF_SIMULATIONS = 10000; const double PORTFOLIO[] = {200000.0,150000.0,250000.0,300000.0,200000.0}; MonteCarloSimulation::MonteCarloSimulation() { for (unsigned i=0; i(nenEndOfCompanies)); mTenDaySimulatedCourseChanges.push_back(std::vector(nenEndOfCompanies)); } } MonteCarloSimulation::~MonteCarloSimulation() { } void MonteCarloSimulation::doSimulations(const Parametrisation& param, const CholeskyDecomposition& cholDecomp) { std::vector y(nenEndOfCompanies); std::vector mu(nenEndOfCompanies); Normaldistribution norm; for (int i=0; i<2; i++) { enHoldingTime d = (i==0)?nenOneDay:nenTenDays; const CholeskyMatrix& D = cholDecomp.getMatrix(d); param.getArithAverages(mu,d); for (unsigned i=0; i< NUMBER_OF_SIMULATIONS; i++) { norm.calcRandomVector(D,mu,y); if (d == nenOneDay) { for (unsigned j=0; j portfolio(nenEndOfCompanies); double portfolioValue = 0.0; for (unsigned c=0; c < nenEndOfCompanies; c++) { portfolio.at(c) = param.getLastValue(static_cast(c) ) * PORTFOLIO[c]; portfolioValue += portfolio.at(c); } std::vector< std::vector > simulatedPortfolioOneDay; std::vector< std::vector > simulatedPortfolioTenDays; std::vector simulatedPortfolioValuesOneDay(NUMBER_OF_SIMULATIONS); std::vector simulatedPortfolioValuesTenDays(NUMBER_OF_SIMULATIONS); for (unsigned i=0; i(nenEndOfCompanies)); simulatedPortfolioTenDays.push_back(std::vector(nenEndOfCompanies)); simulatedPortfolioValuesOneDay.at(i) = 0.0; simulatedPortfolioValuesTenDays.at(i) = 0.0; } for (unsigned i=0; i portfolioValueChangesOneDay(NUMBER_OF_SIMULATIONS); std::vector portfolioValueChangesTenDays(NUMBER_OF_SIMULATIONS); std::ofstream of; of.open("VaR.csv",std::ios::out); for (unsigned i=0; i simAverOneDay(nenEndOfCompanies); std::vector simAverTenDays(nenEndOfCompanies); for (unsigned n=0; n < NUMBER_OF_SIMULATIONS ; n++) { for (unsigned c = 0; c < nenEndOfCompanies; c++) { simAverOneDay.at(c) += mOneDaySimulatedCourseChanges.at(n).at(c); simAverTenDays.at(c) += mTenDaySimulatedCourseChanges.at(n).at(c); } } for (unsigned c = 0; c < nenEndOfCompanies; c++) { simAverOneDay.at(c) /= NUMBER_OF_SIMULATIONS; simAverTenDays.at(c) /= NUMBER_OF_SIMULATIONS; } int width = 20; int prec = 6; std::cout << std::setw(width) << "Comp." << std::setw(width) << "sim. one day aver." << std::setw(width) << "sim. ten days aver." << std::endl; for (unsigned c = 0; c < nenEndOfCompanies; c++) { std::cout << std::setw(width) << c << std::setw(width) << std::setprecision(prec) << simAverOneDay.at(c) << std::setw(width) << simAverTenDays.at(c) << std::endl; } // covariance matrices of simulation CovarianceMatrix simOneDayCovMatrix; CovarianceMatrix simTenDaysCovMatrix; double sum,diffI,diffJ; for (unsigned i = static_cast(nenDaimler) ; i < static_cast(nenEndOfCompanies); i++) { simOneDayCovMatrix.push_back(std::vector(nenEndOfCompanies)); simTenDaysCovMatrix.push_back(std::vector(nenEndOfCompanies)); } //one day for (unsigned i = static_cast(nenDaimler) ; i < static_cast(nenEndOfCompanies); i++) { for (unsigned j = static_cast(nenDaimler) ; j < static_cast(nenEndOfCompanies); j++) { if (i <= j) { sum = 0.0; for (unsigned n=0 ; n < NUMBER_OF_SIMULATIONS ; n++) { diffI = mOneDaySimulatedCourseChanges.at(n).at(i) - simAverOneDay.at(i); diffJ = mOneDaySimulatedCourseChanges.at(n).at(j) - simAverOneDay.at(j); sum += (diffI * diffJ) / (NUMBER_OF_SIMULATIONS - 1); } simOneDayCovMatrix.at(i).at(j) = sum; } else { simOneDayCovMatrix.at(i).at(j) = simOneDayCovMatrix.at(j).at(i); } } } // ten days for (unsigned i = static_cast(nenDaimler) ; i < static_cast(nenEndOfCompanies); i++) { for (unsigned j = static_cast(nenDaimler) ; j < static_cast(nenEndOfCompanies); j++) { if (i <= j) { sum = 0.0; for (unsigned n=0 ; n < NUMBER_OF_SIMULATIONS ; n++) { diffI = mTenDaySimulatedCourseChanges.at(n).at(i) - simAverTenDays.at(i); diffJ = mTenDaySimulatedCourseChanges.at(n).at(j) - simAverTenDays.at(j); sum += (diffI * diffJ) / (NUMBER_OF_SIMULATIONS - 1); } simTenDaysCovMatrix.at(i).at(j) = sum; } else { simTenDaysCovMatrix.at(i).at(j) = simTenDaysCovMatrix.at(j).at(i); } } } // dump covariance matrices width = 12; std::cout << "Covariance matrix for simulation for one days" << std::endl; for (unsigned i = static_cast(nenDaimler) ; i < static_cast(nenEndOfCompanies); i++) { for (unsigned j = static_cast(nenDaimler) ; j < static_cast(nenEndOfCompanies); j++) { std::cout << std::setw(width) << std::setprecision(prec) << simOneDayCovMatrix.at(i).at(j); } std::cout << std::endl; } std::cout << "Covariance matrix for simulation for ten days" << std::endl; for (unsigned i = static_cast(nenDaimler) ; i < static_cast(nenEndOfCompanies); i++) { for (unsigned j = static_cast(nenDaimler) ; j < static_cast(nenEndOfCompanies); j++) { std::cout << std::setw(width) << std::setprecision(prec) << simTenDaysCovMatrix.at(i).at(j); } std::cout << std::endl; } }