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;
// }
}
|