summaryrefslogtreecommitdiffstats
path: root/Master/Modellbildung_und_Simulation/Aufgabenblatt2/Aufgabe2und3/src/HistoricSimulation.cpp
blob: 412eac10ab6c34e74b9b10a321316e420eebd3af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
 * HistoricSimulation.cpp
 *
 *  Created on: 27.05.2011
 *      Author: eisenhauer
 */

#include "HistoricSimulation.h"
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <stdio.h>

const double PORTFOLIO[] = {200000.0,150000.0,250000.0,300000.0,200000.0};

HistoricSimulation::HistoricSimulation()
{
}

HistoricSimulation::~HistoricSimulation() {
}

void HistoricSimulation::doSimulation(const Parametrisation& param, const enHoldingTime& nenHoldingTime)
{
	const std::vector<StockPrices>& stockPrices = param.getStockPrices();
	uint8_t u8HoldingTime = static_cast<uint8_t>(nenHoldingTime);
	uint32_t N = stockPrices.size() - u8HoldingTime;
	uint32_t n = 0;
	mData.clear();
	std::vector<double> portfolio(static_cast<uint8_t>(nenEndOfCompanies));
	double portfolioValue = 0.0;

	for (uint8_t c=0; c < nenEndOfCompanies; c++)
	{
		mData.push_back(std::vector<double>(N));
		portfolio.at(c) = param.getLastValue(static_cast<enCompany>(c) ) * PORTFOLIO[c];
		portfolioValue += portfolio.at(c);
	}

	for(uint32_t counter = u8HoldingTime; counter < stockPrices.size() ; counter++)
	{
		for (uint8_t c=0; c < nenEndOfCompanies; c++)
		{
			double compRelChange = 0.0;
			switch(nenHoldingTime)
			{
			case nenOneDay:
				compRelChange = stockPrices.at(counter).mStock.at(c).mValueRelChangeOne;
				break;
			case nenTenDays:
				compRelChange = stockPrices.at(counter).mStock.at(c).mValueRelChangeTen;
				break;
			}
			double actCompValue = portfolio.at(c) + (portfolio.at(c) * compRelChange / 100);
			mData.at(c).at(n) = actCompValue;
		}
		n++;
	}

	std::vector<double> simulatedPortfolioValues(N);
	for (n = 0; n < N; n++) {
		double sum = 0.0;
		for (uint8_t c=0; c < nenEndOfCompanies; c++)
		{
			sum += mData.at(c).at(n);
		}
		simulatedPortfolioValues.at(n) = sum;
	}
	std::vector<double> simulatedPortfolioChanges(N);
	for (n = 0; n < N; n++) {
		simulatedPortfolioChanges.at(n) = portfolioValue - simulatedPortfolioValues.at(n);
	}
	std::sort(simulatedPortfolioChanges.begin(),simulatedPortfolioChanges.end());
	uint32_t quantilIdx = (N / 100) - 1;
	double VaR = simulatedPortfolioChanges.at(quantilIdx);
	std::string strHoldTime = (nenHoldingTime==nenOneDay)?"one day: ":"ten days: ";
	std::cout << "Historic simulation VaR for " + strHoldTime << VaR << " EUR" << std::endl;
//	printf("%u\n",quantilIdx);
//	for (n = 0; n < N; n++) {
//		std::cout << simulatedPortfolioChanges.at(n) << std::endl;
//	}
}