News Artikel Foren Projekte Links Über Redscope Join List Random Previous Next Startseite Foren Allgemeine Fragen zu SAS Quantile selbst festlegen 2 July, 2009-12:01 risk_operator Hallo Zusammen, wie kann man bei SAS Quantile einer Variable selber festlegen? Z.b. möchte ich das 30% Quantil eines simulierten Verlustportfolios bestimmen. Mit proc univariate kann ich die Quantile ja nicht beeinflussen, wenn ich mich nicht täusche?!? Wäre für einen Hinweis sehr dankbar. Mit freundlichen Grüßen Foren: Allgemeine Fragen zu SAS...bin grad auf die Option 2 July, 2009-12:27 risk_operator...bin grad auf die Option percent der histogram Anweisung gestoßen, jedoch zeigt mir der Log einen Syntaxfehler bei percent bzw. percents an... proc univariate 2 July, 2009-12:46 sgeißler proc univariate data=sashelp.class; var age; output out=percentile PCTLPTS=30 PCTLPRE=PCTL; Wie stellst du dir vor, dass wir Syntaxfehler beurteilen sollen, wenn du nicht schreibst, was du genau abgeschickt hast? Simon Danke Simon für die Antwort 2 July, 2009-15:40 risk_operator Danke Simon für die Antwort und sorry für den nicht hinzugefügten Syntaxfehler! Der lautet wie folgt: 44 Proc univariate;
45 Histogram / Percents=30; -------- 22 76 FEHLER 22-322: Syntaxfehler, erwartet wird eines der folgenden: ;, ANNOKEY, ANNOTATE, BARLABEL, BARWIDTH, BETA, CAXIS, CBARLINE, CFILL, CFRAME, CFRAMESIDE, CFRAMETOP, CGRID, CHREF, CLIPREF, CONTENTS, CPROP, CTEXT, CV, CVREF, DESCRIPTION, ENDPOINTS, EXPONENTIAL, FONT, FRONTREF, GAMMA, GRID, HANGING, HAXIS, HEIGHT, HMINOR, HOFFSET, HREF, HREFLABELS, HREFLABPOS, INFONT, INHEIGHT, INTERBAR, INTERTILE, KERNEL, LGRID, LHREF, LOGNORMAL, LVREF, MAXNBIN, MAXSIGMAS, MIDPERCENTS, MIDPOINTS, NAME, NCOL, NCOLS, NENDPOINTS, NMIDPOINTS, NOBARS, NOCHART, NOFRAME, NOHLABEL, NOPLOT, NORMAL, NOTABCONTENTS, NOVLABEL, NOVTICK, NROW, NROWS, OUTHISTOGRAM, OUTKERNEL, OVERLAY, PFILL, RTINCLUDE, SB, SU, TILELEGLABEL, TURNVLABELS, VAXIS, VAXISLABEL, VMINOR, VOFFSET, VREF, VREFLABELS, VREFLABPOS, VSCALE, WAXIS, WBARLINE, WEIBULL, WGRID. FEHLER 76-322: Syntaxfehler, Anweisung wird ignoriert. 46 Run; Habe Deinen Hinweis auf folgende Wiese versucht umzusetzen: Proc univariate; Histogram; var pdr; Output out=percentile PCTLPTS=30 PCTLPRE=PCTL; Run; Jedoch zeigt mit SAS als Ergebnis das Gleiche an, wenn ich var pdr; Output out=percentile PCTLPTS=30 PCTLPRE=PCTL; weglasse. Im Prinzip erhalte ich alos keine neuen Ergebnisse. Woran kann das liegen? Vielen Danke für die Hilfe!!!! Mit besten Grüßen Gökhan Das "Percents=30" ist eine 2 July, 2009-15:57 sgeißler Das "Percents=30" ist eine Option einer Option und gehört zu einer Verteilung, die an das Histogram angepasst werden soll. Z.B.
proc univariate data=sashelp.class; var age; histogram age /normal(percents=30); Output out=percentile PCTLPTS=30 PCTLPRE=PCTL; Das Ergebnis des Output...-Krams, landet in der Tabelle die mit der "OUT="-Option angegeben wird. Hier also "percentile". Simon Alles klar, vielen Dank. Ich Alles klar, vielen Dank. 3 July, 2009-11:13 risk_operator Ich bin leider noch sehr unerfahren mit SAS, so dass ich bereits an meinem nächsten Problem angekommen bin. Mein bisheriger Code sieht folgendermaßen aus: Data PDR_Default; J = 50000; I = 10000; rho = 0.3; PD = 0.2; RR = 0.475; r = 0.04; c = 0.06; PV_LL = ((1-RR)+c)*exp(-r); PV_PP = (1+c)*exp(-r); Do j = 1 to J; Y = Rannor(0); CPD = Probnorm((Probit(PD)-sqrt(rho)*Y)/(sqrt(1-rho))); * Default = Ranbin(0,I,CPD); PDR = (Default*PV_LL)/(I*PV_PP); Output; End; Drop J I rho PD RR r c PV_LL PV_PP; Proc univariate; Histogram; var pdr; Output out=pdr_percentile PCTLPTS=0,70,80,90,95,98,99 PCTLPRE=PCT Run; Das ganze beschert mir eine Verlustverteilung. Nun will ich diese in w=7 Tranchen einteilen und die jeweiligen Tranchenverlustverteilungen ermitteln. Dafür muss ich folgende Formel implementieren: TLoss_w=(1/(O_Tw-U_Tw))*min[O_Tw-U_Tw,max[0,PDR_j-U_Tw]] O_Tw entspricht dabei der Tranchenobergrenze der Tranche w und U_Tw der Untergrenze. PDR_j ist die Portfolioverlustrate der j-ten Simulation.
Die Ober- und Untergrenzen der Tranchen entsprechen dabei bestimmten Perzentilen der Verlustverteiluing PDR. D.h. z.b. für Tranche 2 ist O_T2=Perzentil99 von PDR und U_T2=Perzentil98 von PDR. (70,80,90,95,98,99 sind alle notwenidgen Perzentile für die jeweiligen Tranchen.) O_T2 ist gleichzeitig die Untergrenze der Tanche 1, also U_T1. Die Obergrenze der Tanche 1 ist O_T1=1. Die Untergenze der Tanche 7 ist U_T7=0. TLoss_w sollte dann eine neue Variable mit 50000 Beobachtungen werden, entsprechend der Anzahl der Beobachtungen von PDR_j bzw. der Anzahl der Simulationen. Wie kann ich das Ganze umsetzen? Mit Excel habe ich es hibekommen, aber ich würde gerne wissen, wie es mit SAS funktioniert. Ich bin für jede Hilfe dankbar!!! Mit besten Grüßen Doppelpost Doppelpost 3 July, 2009-13:05 sgeißler Habe es mal grob überflogen. 3 July, 2009-13:05 sgeißler Habe es mal grob überflogen. In Worten wäre die Lösung: Die Tranchen-Grenzen bestimmen (liegen ja schon in PDR_percentile) und in Makrovariablen speichern. Dann die große Tabelle nochmal einlesen und die PDR-Werte klassifizieren (etwa IF U_Tw1 gt PDR lt O_Tw1 then W=1). Danach lässt sich die Formel ja fast 1 zu 1 übertragen. Du kannst das Ganze auch manuell schreiben, dafür bräuchtest du keine Makro- Kenntnisse. Simon Danke für die raschen 3 July, 2009-14:55 risk_operator Danke für die raschen Antworten, aber leider kann ich das mit meinen SAS Kentnissen nicht umsetzen. Kannst Du bitte konkretere Beispiele dazu schreiben. Mit freundlichen Grüßen Bitteschön: /* Tabelle 3 July, 2009-16:18 sgeißler
Bitteschön: /* Tabelle transponieren */ proc transpose data=pdr_percentile out=perc_trans; /* Percentile in den Makrovariablen PCTL1-PCTL7 speichern proc sql; select col1 into :PCTL1-:PCTL7 from perc_trans ; quit; data pdr_final; set pdr_default; /* Eine Array mit den Grenzen anlegen */ array pctls{8} _TEMPORARY_ (&pctl1. &pctl2. &pctl3. &p /* Die PDR-Werte klassifizieren */ do i=1 to 7; if pctls{i} <= PDR < pctls{i+1} then w=i; end; /* TLoss berechnen */ TLoss=(1/(pctls{w+1}-pctls{w}))*min(pctls{w+1}-pctls{w Danke Simon, mal wieder :-) Danke Simon, mal wieder :-)!!!! 3 July, 2009-17:15 risk_operator Sorry, wenn ich weiter damit nerve, aber ich habe noch Fragen. Den Schritt /* Die PDR-Werte klassifizieren */ do i=1 to 7; if pctls{i} <= PDR < pctls{i+1} then w=i; end; verstehe ich nicht. Die anderen Anweisungen so halb wegs. Mit TLoss_w=(1/(O_Tw-U_Tw))*min[O_Tw-U_Tw,max[0,PDR_j-U_Tw]] wird der Verlust des Portfolios auf die jeweiligen Größen der Tranchen normiert wird. Ich kann nicht nachvollziehen warum die PDR-WErte klassifiziert werden? Darf ich Dir meine Excel Tabelle schicken? Dann wirds vielleicht klarer?? A propos Excel. Da dieses nette Programm auf 65 Tausend und paar zerquetschte Zeilen beschränkt ist, komme ich nicht drum rum das Ganze mit SAS umzusetzen, weil meine eigentliche Simulation 500000 Auspägungen enthält. Das macht mir echt Sorgen, weil ich nicht bei SAS durchsteige :-(.
Wäre Dir sehr dankbar, wenn Du mir weiterhelfen könntest!!!! Mit freundlichen Grüßen Ich habe das ganze nochmal 3 July, 2009-19:10 risk_operator Ich habe das ganze nochmal per Hand in einem Data-Step eingegeben. Hier der Code: Libname Cdo "C:\Users\OEM\Desktop\SAS_CDO"; Data Cdo.PDR_Zerobond_PV_T1; J = 50000; I = 10000; rho = 0.3; PD = 0.2; RR = 0.475; r = 0.04; c = 0.06; PV_LL = ((1-RR)+c)*exp(-r); PV_PP = (1+c)*exp(-r); Do j = 1 to J; Y = Rannor(0); CPD = Probnorm((Probit(PD)-sqrt(rho)*Y)/(sqrt(1- Default = Ranbin(0,I,CPD); PDR = (Default*PV_LL)/(I*PV_PP); Output; End; Drop J I rho PD RR r c PV_LL PV_PP; Proc univariate data=cdo.pdr_zerobond_pv_t1; Histogram Y CPD Default PDR; var PDR Y CPD Default; Output out=pdr_percentile PCTLPTS=0,70,80,90,95,98,9 Data Cdo.Tranched_PDR_Zerobond_PV_T1; set Cdo.PDR_Zerobond_PV_T1; TLoss1 = (1/(1.0000-0.3834))*min(1.0000-0.3834,max(0 TLoss2 = (1/(0.3834-0.3471))*min(0.3834-0.3471,max(0 TLoss3 = (1/(0.3471-0.2908))*min(0.3471-0.2908,max(0 TLoss4 = (1/(0.2908-0.2403))*min(0.2908-0.2403,max(0 TLoss5 = (1/(0.2403-0.1800))*min(0.2403-0.1800,max(0 TLoss6 = (1/(0.1800-0.1409))*min(0.1800-0.1409,max(0 TLoss7 = (1/(0.1409-0.0000))*min(0.1409-0.0000,max(0 TLossMezz = (1/(0.3834-0.1409))*min(0.3834-0.1409,m Proc univariate data=cdo.tranched_pdr_zerobond_pv_t1 Histogram; Run; Die Zahlen in den Nennern der TLoss-Variablen sind Perzentile, die ich irgendeinem Verlustportfolio entnommen habe und entsprechen den Grenzen der Tranchen. Ich würde das ganze gerne so automatisieren, dass es jeweils den Perzentilen des ganz oben im ersten Data-Step erzeugten Verlustportfolios entspricht, um die Werte nicht immer manuell eingeben zu müssen.
Ich BITTE nochmals um Hilfe und bedanke mich für die Mühen!!!! Achso, hatte das falsch 4 July, 2009-10:33 sgeißler Achso, hatte das falsch verstanden. Dann vergiss das Klassifizieren und tausche einfach deine manuell eingetragenen Grenzen durch &PCTL1 bis &PCTL7 aus. Das sind Makrovariablen, die die aus dem Proc-Univariate errechneten Percentile enthalen. Vor den Proc transpose und den proc sql Schritt aus meinem vorherigen Post ausführen. Dann sollte das klappen. Simon Danke Simon!!! Muss jetzt zur Danke Simon!!! 4 July, 2009-10:36 risk_operator Muss jetzt zur Arbeit und kanns schon nicht abwarten es heute Abend auszuprobieren. Wenn es klappt, wäre es für mich ein großer Schritt :-) Vielen Dank und einen schönen Tag noch Mit besten Grüßen Gökhan Ja da habe ich mir gedacht, 5 July, 2009-09:26 risk_operator Ja da habe ich mir gedacht, aber weil Du meintest "Vor den Proc transpose und den proc sql Schritt aus meinem vorherigen Post ausführen." habe ich es so verstanden. Wie auch immer nun sieht meint Code wie folgt aus:
Libname Cdo "C:\Users\OEM\Desktop\SAS_CDO"; Data Cdo.PDR_Zerobond_PV_T1; J = 50000; I = 10000; rho = 0.3; PD = 0.2; RR = 0.475; r = 0.04; c = 0.06; PV_LL = ((1-RR)+c)*exp(-r); PV_PP = (1+c)*exp(-r); Do j = 1 to J; Y = Rannor(0); CPD = Probnorm((Probit(PD)-sqrt(rho)*Y)/( Default = Ranbin(0,I,CPD); PDR = (Default*PV_LL)/(I*PV_PP); Output; End; Drop J I rho PD RR r c PV_LL PV_PP; Proc univariate data=cdo.pdr_zerobond_pv_t1; Histogram Y CPD Default PDR; var PDR Y CPD Default; Output out=pdr_percentile PCTLPTS=70,80,90,95 proc transpose data=pdr_percentile out=perc_t proc sql; select col1 into :PCTL1-:PCTL6 from perc_trans ; quit; Data Cdo.Tranched_PDR_Zerobond_FV; set Cdo.PDR_Zerobond_PV_T1; OT1=1; UT1=&PCTL1; UT2=&PCTL2; UT3=&PCTL3; UT4=&PCTL4; UT5=&PCTL5; UT6=&PCTL6; UT7=0; TLoss1 = (1/(OT1-UT1))*min(OT1-UT1,max(0,PDR- TLoss2 = (1/(UT1-UT2))*min(UT1-UT2,max(0,PDR- TLoss3 = (1/(UT2-UT3))*min(UT2-UT3,max(0,PDR- TLoss4 = (1/(UT3-UT4))*min(UT3-UT4,max(0,PDR- TLoss5 = (1/(UT4-UT5))*min(UT4-UT5,max(0,PDR- TLoss6 = (1/(UT5-UT6))*min(UT5-UT6,max(0,PDR- TLoss7 = (1/(UT6-UT7))*min(UT6-UT7,max(0,PDR- Drop OT1 UT1 UT2 UT3 UT4 UT5 UT6 UT7; Proc univariate data=cdo.tranched_pdr_zerobon Histogram; Aber die Werte der TLoss-Variablen stimmen nicht. Während Tloss1 und 7 falsche Verteilungsmomente aufweisen haben Tloss2-6 jeweils nur 50000 Werte von eins und ich verstehe nicht wie das sein kann?
Oh, ich wollte sagen: "Vorher Oh, ich wollte sagen: "Vorher den Proc...". 5 July, 2009-10:58 sgeißler Du hättest dir vielleicht den Inhalt der UT1-UT6 Variablen erstmal angucken sollen, bevor du sie dropst. Die sind wohl falsch rum. Änder den den Sql-Step in: proc sql; select col1 into :PCTL1-:PCTL6 from perc_trans order by col1 desc ; quit; Zur Funktion: Das Proc Transpose transponiert den Output von Proc Univariate (wo die percentile drin stehen). Das heißt aus Spalten werden Zeilen. Mit dem SQL-Step und dem "INTO:" Statement kann man die Zeilen automatisch in durchnummerierte Makro-Variablen speichern. Durch das neu eingefügte "order by" wird die Reihenfolge getauscht. Jetzt erhalte ich zumindest nicht mehr nur 1en. Kleiner Tipp am Rande: Obwohl syntaktisch korrekt würde ich mir angewöhnen jeden Step mit einem "" abzuschließen und zwischen "PROC...;" und RUN;" einzurücken. Das erhöht die Lesbarkeit ungemein. Finde ich zumindest. So hoffentlich passt es nun. Sonst schick mir mal eine Mail über das Kontaktformular hier. Dann kannst du mir zur Not wirklich die Excel-Datei schicken. Sonst nimmt das ja nie ein Ende hier ;) Simon Simon, 1000 Dank für Simon, 1000 Dank für alles. Jetzt läufts :-). Sie waren falsch rum!!! 5 July, 2009-14:21 risk_operator Und Deinen Tipp habe ich gerne angenommen. Es sieht auf jeden Fall übersichtlicher aus.
Nochmals vielen Dank! Mit besten Grüßen Gökhan Puh, ein Glück :-) Und was 5 July, 2009-14:58 sgeißler Puh, ein Glück :-) Und was ist das Ergebnis? Ist das Finanzsystem noch zu retten? Oder fallen alle Kredite aus? Darf ich fragen was und wo du studierst? Simon Neugierig 6 July, 2009-08:06 HansKneilmann Hallo Ihr beiden, die Antworten zu "Ist das Finanzsystem noch zu retten?" bzw. "fallen alle Kredite aus?" bitte nicht über das Kontakt-Formular oder emails austauschen, das interessiert bestimmt ausser mir noch andere Lser hier im Forum. Das gleiche gilt ganz besonders für die Antwort auf die Frage "was und wo du studierst"... Viele Grüße Hans Kneilmann, Schäfer Shop GmbH (SSI) Guten Tag Herr 6 July, 2009-12:35 risk_operator Guten Tag Herr Kneilmann, über Rettung kann keine Rede sein, wenn man bedenkt wie viel verloren gegangen ist. Indes gehören Verluste scheinbar zu einem Finanzsystem dazu und auch Strafen über hunderte von Jahren für ein paar "Finanzjongleure". Und wenn unser Finanzsystem total kollabiert wird es bestimmt bald ein neues geben. Ich schreibe zurzeit meine Diplomarbeit an der Leibniz Uni Hannover. Dabei befasse ich mich mit der Risikoverteilung im Rahmen von
Collateralized Debt Obligation's und führe mit SAS Simulationen durch. SAS lerne ich erst im Rahmen der Diplomarbeit. Jedoch will ich mich darüber hinaus damit intensiv weiter beschäftigen. Es ist echt einsame Spitze in welcher Form in diesem Forum geholfen wird. An dieser Stelle großen Dank an Simon und auch an Herr Muschik, der mir zu vor bei einem grafischen Problem geholfen hat, auch wenn ich das bisher noch nicht zufriedenstellend lösen konnte :-)... Mit besten Grüßen Gökhan Servus, besteht eigentlich Servus, 12 July, 2009-12:40 risk_operator besteht eigentlich die Möglichkeit sich Perzentile im PDR-Histogramm anzeigen zu lassen, z.b. als senkrechte Trennungslinien der einzelnen Perzentile? Oder sowas in der Art? Vielen Dank und einen schönen Sonntag noch. Gökhan Meintest Du das so? Libname Meintest Du das so? 4 July, 2009-21:00 risk_operator
Libname Cdo "C:\Users\OEM\Desktop\SAS_CDO"; Data Cdo.PDR_Zerobond_PV_T1; J = 50000; I = 10000; rho = 0.3; PD = 0.2; RR = 0.475; r = 0.04; c = 0.06; PV_LL = ((1-RR)+c)*exp(-r); PV_PP = (1+c)*exp(-r); Do j = 1 to J; Y = Rannor(0); CPD = Probnorm((Probit(PD)-sqrt(rho)*Y)/(sq Default = Ranbin(0,I,CPD); PDR = (Default*PV_LL)/(I*PV_PP); Output; End; Drop J I rho PD RR r c PV_LL PV_PP; Proc univariate data=cdo.pdr_zerobond_pv_t1; Histogram Y CPD Default PDR; var PDR Y CPD Default; Output out=pdr_percentile PCTLPTS=70,80,90,95,9 Libname Cdo "C:\Users\OEM\Desktop\SAS_CDO"; Data Cdo.Tranched_PDR_Zerobond_FV; set CDO.PDR_Zerobond_PV_T1; OT1=1; UT1=&PCTL1; UT2=&PCTL2; UT3=&PCTL3; UT4=&PCTL4; UT5=&PCTL5; UT6=&PCTL6; UT7=0; TLoss1 = (1/(OT1-UT1))*min(OT1-UT1,max(0,PDR-UT TLoss2 = (1/(UT1-UT2))*min(UT1-UT2,max(0,PDR-UT TLoss3 = (1/(UT2-UT3))*min(UT2-UT3,max(0,PDR-UT TLoss4 = (1/(UT3-UT4))*min(UT3-UT4,max(0,PDR-UT TLoss5 = (1/(UT4-UT5))*min(UT4-UT5,max(0,PDR-UT TLoss6 = (1/(UT5-UT6))*min(UT5-UT6,max(0,PDR-UT TLoss7 = (1/(UT6-UT7))*min(UT6-UT7,max(0,PDR-UT Drop OT1 UT1 UT2 UT3 UT4 UT5 UT6 UT7; Proc univariate data=cdo.tranched_pdr_zerobond_ Histogram; Run; proc transpose data=pdr_percentile out=perc_tra proc sql; select col1 into :PCTL1-:PCTL7 from perc_trans ; quit; Ich hoffe nicht, denn die Ergebnisse sind nicht richtig und den Fehler kann ich nicht finden.
Das du den SQL-Step vor dem 4 July, 2009-22:03 sgeißler Das du den SQL-Step vor dem 2. Datastep ausführen musst ist klar, oder? Wo ist sonst das Problem? Nicht die erwarteten Werte?