Beispiele für die Funktionen zu VaR
Das Objekt wird nur von einem CalculationObject in der Liste der Risikofaktoren zur Verfügung gestellt. Die Laufzeit in Tagen (Jahr=360 Tage) bezieht sich dabei immer auf das Auswertungsdatum, das im Kontext an ein CalculationObject übergeben wurde.
Einstiegspunkt ist immer ein Risikomodell, momentan immer das DeltaNormalValueAtRiskModel und eine Liste von ValueAtRiskPosition.
Während DeltaNormalValueAtRiskModel keine Parameter erwartet, erfordert ValueAtRiskPosition drei Parameter: Wertpapier oder Konto, Bestand (für Konto 1), Einstand (momentan beliebig, z.B. 0).
Aus diesen beiden Objekten zusammen mit einem Auswertungsdatum und einer Auswertungswährung erhält man mit CalculationObject ein Kalkulationsobjekt.
Beispiel A
$Pos:= Depotbewertung[$Auswertungsdatum.Default[heute]; $Währung].Transaktionen.append[konto.tolist];
{Hilfsfunktion}
$VarPos:=#[](if(is["transaction"];ValueAtRiskPosition(wp;as["transaction"].bestand;1);ValueAtRiskPosition(object;1;1)));
{Risikopositionen zusammenstellen}
$rps:=map(#[]($VarPos.apply[object]);$pos).concatenate.concatenate;
{Kalkulationsobjekt holen}
$CalcObj:=DeltaNormalValueAtRiskModel.CalculationObject[$Auswertungsdatum.Default[heute];$Währung;$rps;$Zeitreihenanalysezeitraum];
Mit den Funktionen ValueAtRisk
, ValueAtRiskOhneWährungsRisiko
und ValueAtRiskWährungsRisiko
kann nun das Risiko berechnet werden. (Rückgabe ist ein Objekt vom Typ "ValueAtRisk", man beachte den gleichen Namen der Funktion und des Objekts!)
Die Funktionen erwarten immer einen Zeitraum und ein Konfidenzintervall (zwischen 0 und 1).
Werden keine weiteren Parameter angegeben, wird das Risiko für das gesamte, an das Kalkulationsobjekt übergebene risikopositionsinduzierte Portfolio berechnet.
Das ValueAtRisk-Objekt liefert nun über ExposureInAuswertungsWährung
bzw. RisikoInAuswertungsWährung
das Exposure (vereinfacht: den risikobehafteten Wert) bzw. das Risiko.
Beispiel B
{Für Gesamtebene verschiedene Risikodekompositionen berechnen}
$GesamtVar:=$CalcObj.ValueAtRisk[$Prognosezeitraum;$Konfidenz;_;_];.RisikoInAuswertungswährung[] ;
Im Rahmen der Risiko-Dekomposition ist nun aber nicht nur das Risiko bezüglich des Gesamtportfolios und bezüglich aller Risikofaktoren interessant, sondern auch die Einschränkung auf gewisse Risikofaktoren bzw. Teilmengen von Instrumenten (und ggf. Teilbestände).
Daher kann mit dem dritten Parameter eine Liste(!) von Risikofaktoren übergeben werden, auf die die Berechnung eingeschränkt wird.
RisikoFaktoren
liefert auf den Kalkulationsobjekten eine Liste aller identifizierten Risikofaktoren.
Beispiel C
$GesamtVarZinsen:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;$calcobj.risikofaktoren.deleteifnot[#[](is["DiskontFactor"])]].RisikoInAuswertungswährung[];
$GesamtVarZinsenKurz:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;$calcobj.risikofaktoren.deleteifnot[#[](is["DiskontFactor"] and laufzeit<=$kurzfristig_bis)]].RisikoInAuswertungswährung[] ;
$GesamtVarZinsenMittel:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;$calcobj.risikofaktoren.deleteifnot[#[](is["DiskontFactor"] and laufzeit> $Kurzfristig_bis and laufzeit<=$mittelfristig_bis)]].RisikoInAuswertungswährung[] ;
$GesamtVarZinsenLang:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;$calcobj.risikofaktoren.deleteifnot[#[](is["DiskontFactor"] and laufzeit>$mittelfristig_bis)]].RisikoInAuswertungswährung[] ;
Zu beachten ist, dass aufgrund der Beschaffenheit die Währungsrisiken speziell behandelt werden (also Währungen nicht unter die Risikofaktoren im hier behandelten Sinn zählen sind).
ValueAtRisk
liefert dabei das Gesamtrisiko inklusive Währungsrisiko, ggf. eingeschränkt auf die Teilmengen an Risikofaktoren und Instrumente.
ValueAtRiskOhneWährungsrisiko
liefert dabei das Risiko exklusive Währungsrisiko, ggf. eingeschränkt auf die Teilmengen an Risikofaktoren und Instrumente.
ValueAtRiskWährungsrisiko
liefert nun das Währungsrisiko, ggf. eingeschränkt auf die Teilmengen an Risikofaktoren und Instrumente, für eine Liste von Währungen, die als 5. Parameter übergeben wird.
Beispiel D
$GesamtWährungEURVar:=$CalcObj.ValueAtRiskWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;_;$Calcobj.währungen.deleteifnot[#[](kürzel="EUR")]].RisikoInAuswertungswährung[] ;
$GesamtWährungCHFVar:=$CalcObj.ValueAtRiskWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;_;$Calcobj.währungen.deleteifnot[#[](kürzel="CHF")]].RisikoInAuswertungswährung[] ;
$GesamtWährungUSDVar:=$CalcObj.ValueAtRiskWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;_;$Calcobj.währungen.deleteifnot[#[](kürzel="USD")]].RisikoInAuswertungswährung[] ;
$GesamtWährungRestVar:=$CalcObj.ValueAtRiskWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;_;$Calcobj.währungen.deleteif[#[]
(kürzel="USD" or kürzel="EUR" or kürzel="CHF")]]
.RisikoInAuswertungswährung[] ;
Neben der Einschränkung auf eine Menge von Risikofaktoren ist nun noch die Einschränkung auf Instrumente bzw. auf Instrumente und geänderte Bestände interessant.
Hierzu kann dem 4. Parameter eine Liste von Risikopositionen (vgl. Erstellung des Kalkulationsobjektes oben) oder aber eine Liste, die Wertpapiere und/oder Konten enthält, übergeben werden, auf die dann eingeschränkt wird.
Damit ist es möglich, die aufwändigen und zeitintensiven Bootstrappingberechnungen nur einmal für ein Depot, einen Inhaber oder eine Gruppe durchzuführen und effizient Teilrisiken zu berechnen. Dazu ist die exzessive Nutzung von MM-Talk Listenfunktionen erforderlich.
Beispiel E
(vgl. Report Assetklassenanalyse)
{Kurswertberechnung}
$KW:=#[](If(Is["Transaction"];
(as["Transaction"].TA_KurswertVerkauf+as["Transaction"].TA_Stückzinsen + as["Transaction"].TA_Zwischengewinn)*as["Transaction"].TA_WechselkursVerkauf;
If(Is["specialasset"];
(as["specialasset"].TA_KurswertVerkauf + as["specialasset"].TA_Stückzinsen) * as["specialasset"].TA_WechselkursVerkauf;
(Saldo[$Auswertungsdatum.Default[heute]] * Währung.Wechselkurs[$Währung; $Auswertungsdatum.Default[heute]]))));
$Konsolidierungsstufe:=$Konsolidierungsstufe.Default["Klassen"];
{Klassengruppierungsfilter}
$PartAK:=#[](If(Is["Transaction"];
WP.UserField["Assetklasse"];
If(Is["specialasset"];
"Zzgl. "+Typ;
"Liquidität")));
$w:= if(Währung.Kürzel="USD";"USD";
if(Währung.Kürzel="EUR";"EUR";
if(Währung.Kürzel="JPY";"JPY";
if(Währung.Kürzel="GBP";"GBP";
if(Währung.Kürzel="CHF";"CHF";
if(Währung.Kürzel="CAD";"CAD";
if(Währung.Kürzel="HKD";"HKD";
"Sonstige Währungen")))))));
{entsprechend UserField["Währungsklasse"] definieren}
$PartWK:=#[](If(Is["Transaction"];
WP.UserField["Währungsklasse"];
If(Is["specialasset"];
$w;
UserField["Währungsklasse"])));
$PartSK:=#[](If(Is["Transaction"];
WP.UserField["Segment"];
If(Is["specialasset"];
"Zzgl. "+Typ;
"Zusätzl. Liquidität")));
$PartBK:=#[](If(Is["Transaction"];
WP.UserField["Region"];
If(Is["specialasset"];
"Zzgl. "+Typ;
"Zusätzl. Liquidität")));
{Hilfsfunktion}
$VarPos:=#[](if(is["transaction"];ValueAtRiskPosition(wp;as["transaction"].bestand;1);ValueAtRiskPosition(object;1;1)));
{Auswahl der Klassengruppierung}
$PartKlas:=if($Klasse="Assetklassen";$PartAk;if($Klasse="Segmente";$PartSK;if($Klasse="Währungen";$PartWK;$PartBK)));
{Depotgruppierung}
$PartDep:=#[](if(is["transaction"];depot.name;if(is["Konto"];"Konten";"")));
{Inhabergruppierung}
$PartInh:=#[](Inhaber.Name) ;
{Wertpapiergruppierung}
$PartWert:=#[](if(is["transaction"];wp.name;name)) ;
$Part:=if($Konsolidierungsstufe="Inhaber";$PartInh;if($Konsolidierungsstufe="Depots";$PartDep;if($Konsolidierungsstufe="Klassen";$PartKlas;$PartWert))) ;
$igroups:=$pos.groupby[_;$GruppierungNachDepot];
map(#[](
{Gruppierung nach Depot}
$kg:=object;
$depot:=$GruppierungNachDepot.apply[$kg.tolist.nth[0]] ;
$kgroups:=$kg.groupby[_;$Part] ;
$kg2:=map(#[]($VarPos.apply[object]);$kg.deleteifnot[#[](is["transaction"])].append[$kg.deleteif[#[](is["transaction"])]]);
$Vari:=$calcobj.ValueAtRisk[$Perioden;$Konfidenz;_;$kg2];
map(#[](
{Berechnungen für die Klasse}
$il:=object;
$il2:=map(#[]($VarPos.apply[object]);$il.deleteifnot[#[](is["transaction"])].append[$il.deleteif[#[](is["transaction"])]]);
$Vark:=$calcobj.ValueAtRisk[$Perioden;$Konfidenz;_;$il2];
$gr:=$Part.apply[$il.tolist.nth [0]];
map(#[](
{Berechnungen für die Position}
$P:=if(is["transaction"] or is["Konto"];true;false);
$D:=if(is["transaction"];wp;if(is["Konto"];object;0));
$filter:=if($P;$calcobj.Instrumente.deleteifnot[#[](id=$D.id)]; 0.MakeList);
$varo:=$calcobj.ValueAtRisk[$Perioden;$Konfidenz;_;$Filter];
{Zusammenstellung der Ergebnisse}
makeCollection
{Instrumentebene}
.add["instr";object]
.add["instrrisk";if($P;$Varo.risikoinauswertungswährung;0) ]
.add["instrexp";if($P;$Varo.exposureinauswertungswährung;0) ]
.add["Kurswert";$KW.apply[object]]
{Inhabergruppierung}
.add["Depot";$depot]
.add["DepotVar";$vari.RisikoInAuswertungswährung[]]
{Klassengruppierung (Assetklasse, Währungsklasse, Branche..)}
.add["Gruppierung";$gr]
.add["GruppenVar";$vark.RisikoInAuswertungswährung[]]
.add["GruppenExp";$vark.ExposureInAuswertungswährung[]]
{Gesamt}
.add["gesamtexp";$Vark.ExposureInauswertungswährung]
.add["gesamtvarow";$gesamtohnewährungvar]
.add["gesamtvarw";$gesamtwährungvar]
.add["gesamtvarrestw";$gesamtwährungrestvar]
.add["gesamtvareurw";$gesamtwährungeurvar]
.add["gesamtvarusdw";$gesamtwährungusdvar]
.add["GesamtVar";$GesamtVaR]
.add["GesamtVarZinsen";$GesamtVaRZinsen]
.add["GesamtVarEigenkap";$GesamtVaREigenkap]
.add["GesamtVarZinsenKurz";$GesamtVaRZinsenKurz]
.add["GesamtVarZinsenLang";$GesamtVaRZinsenLang]
);$il)
);$kgroups)
);$Igroups)
.concatenate.concatenate
$klgroups:=$pos.groupby[_;$Part];
map(#[](
{Berechnungen für die Klasse}
$il:=object;
$VermKlasse:=map(#[]($KW.apply[$il.nth[object]]);$il.length.makelist);
$il2:=map(#[]($VarPos.apply[object]);$il).concatenate;
$gr:=$Part.apply[$il.tolist.nth [0]].tolist.nth[0];
$KlaGesamtVar:=$calcobj.ValueAtRisk[$Prognosezeitraum;$Konfidenz;_;$il2];
$KlaGesamtVarEigenkap:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;$calcobj.risikofaktoren.deleteifnot[#[](is["Wp"])];$il2].RisikoInAuswertungswährung[];
$KlaGesamtVarZinsen:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;$calcobj.risikofaktoren.deleteifnot[#[](is["DiskontFactor"])];$il2].RisikoInAuswertungswährung[];
$KlaGesamtVarZinsenKurz:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;$calcobj.risikofaktoren.deleteifnot[#[](is["DiskontFactor"] and laufzeit<=$kurzfristig_bis)];$il2].RisikoInAuswertungswährung[];
$KlaGesamtVarZinsenMittel:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;$calcobj.risikofaktoren.deleteifnot[#[](is["DiskontFactor"] and laufzeit>$kurzfristig_bis and laufzeit<=$mittelfristig_bis)];$il2]
.RisikoInAuswertungswährung[];
$KlaGesamtVarZinsenLang:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;$calcobj.risikofaktoren.deleteifnot[#[](is["DiskontFactor"] and laufzeit>$mittelfristig_bis)];$il2].RisikoInAuswertungswährung[];
$KlaGesamtWährungVar:=$CalcObj.ValueAtRiskWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;$il2].RisikoInAuswertungswährung[];
$KlaGesamtWährungEURVar:=$CalcObj.ValueAtRiskWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;$il2;$Calcobj.währungen.deleteifnot[#[](kürzel="EUR")]].RisikoInAuswertungswährung[];
$KlaGesamtWährungCHFVar:=$CalcObj.ValueAtRiskWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;$il2;$Calcobj.währungen.deleteifnot[#[](kürzel="CHF")]].RisikoInAuswertungswährung[];
$KlaGesamtWährungUSDVar:=$CalcObj.ValueAtRiskWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;$il2;$Calcobj.währungen.deleteifnot[#[](kürzel="USD")]].RisikoInAuswertungswährung[];
$KlaGesamtWährungRestVar:=$CalcObj.ValueAtRiskWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;$il2;$Calcobj.währungen.deleteif[#[](kürzel="USD" or kürzel="CHF" or kürzel="EUR")]]
.RisikoInAuswertungswährung[];
$KlaGesamtOhneWährungVar:=$CalcObj.ValueAtRiskOhneWährungsrisiko[$Prognosezeitraum;$Konfidenz;_;$il2].RisikoInAuswertungswährung[];
{Zusammenstellung der Ergebnisse}
_.makeCollection
{Klassenebene}
.add["Gruppierung";$gr]
.add["Klagesamtvarow";$Klagesamtohnewährungvar]
.add["Klagesamtvarw";$Klagesamtwährungvar]
.add["Klagesamtvarrestw";$Klagesamtwährungrestvar]
.add["Klagesamtvareurw";$Klagesamtwährungeurvar]
.add["Klagesamtvarchfw";$Klagesamtwährungchfvar]
.add["Klagesamtvarusdw";$Klagesamtwährungusdvar]
.add["KlaGesamtVar";$KlaGesamtVaR]
.add["KlaGesamtVarZinsen";$KlaGesamtVaRZinsen]
.add["KlaGesamtVarEigenkap";$KlaGesamtVaREigenkap]
.add["KlaGesamtVarZinsenKurz";$KlaGesamtVaRZinsenKurz]
.add["KlaGesamtVarZinsenMittel";$KlaGesamtVaRZinsenMittel]
.add["KlaGesamtVarZinsenLang";$KlaGesamtVaRZinsenLang]
{Gesamt}
.add["gesamtvarow";$gesamtohnewährungvar]
.add["gesamtvarw";$gesamtwährungvar]
.add["gesamtvarrestw";$gesamtwährungrestvar]
.add["gesamtvareurw";$gesamtwährungeurvar]
.add["gesamtvarchfw";$gesamtwährungchfvar]
.add["gesamtvarusdw";$gesamtwährungusdvar]
.add["GesamtVar";$GesamtVar]
.add["GesamtVarZinsen";$GesamtVaRZinsen]
.add["GesamtVarEigenkap";$GesamtVaREigenkap]
.add["GesamtVarZinsenKurz";$GesamtVaRZinsenKurz]
.add["GesamtVarZinsenMittel";$GesamtVaRZinsenMittel]
.add["GesamtVarZinsenLang";$GesamtVaRZinsenLang]
);$klgroups)
.concatenate