From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../Aufgabe2und3/src/MonteCarloSimulation.cpp | 195 +++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 Master/Modellbildung_und_Simulation/Aufgabenblatt2/Aufgabe2und3/src/MonteCarloSimulation.cpp (limited to 'Master/Modellbildung_und_Simulation/Aufgabenblatt2/Aufgabe2und3/src/MonteCarloSimulation.cpp') diff --git a/Master/Modellbildung_und_Simulation/Aufgabenblatt2/Aufgabe2und3/src/MonteCarloSimulation.cpp b/Master/Modellbildung_und_Simulation/Aufgabenblatt2/Aufgabe2und3/src/MonteCarloSimulation.cpp new file mode 100644 index 0000000..3ca5beb --- /dev/null +++ b/Master/Modellbildung_und_Simulation/Aufgabenblatt2/Aufgabe2und3/src/MonteCarloSimulation.cpp @@ -0,0 +1,195 @@ +/* + * 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; + } +} -- cgit v1.2.3