News Artikel Foren Join Projekte List Links Random Über Redscope 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 Log in or register to post comments ...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... Log in or register to post comments proc univariate 2 July, 2009 - 12:46 — sgeißler proc univariate data=sashelp.class; var age; output out=percentile PCTLPTS=30 PCTLPRE=PCTL; run; Wie stellst du dir vor, dass wir Syntaxfehler beurteilen sollen, wenn du nicht schreibst, was du genau abgeschickt hast? Gruß Simon Log in or register to post comments 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 Log in or register to post comments 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; run; Das Ergebnis des Output...-Krams, landet in der Tabelle die mit der "OUT="-Option angegeben wird. Hier also "percentile". Gruß Simon Log in or register to post comments Alles klar, vielen Dank. Ich 3 July, 2009 - 11:13 — risk_operator Alles klar, vielen Dank. 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; * Anzahl Simulati I = 10000; * Anzahl Kredite; rho = 0.3; * Assetkorrelatio PD = 0.2; * Probability of RR = 0.475; * Recovery Rate; r = 0.04; * Risikofreier Zi c = 0.06; * Coupon; PV_LL = ((1-RR)+c)*exp(-r); * Present Value L PV_PP = (1+c)*exp(-r); * Present Value P Do j = 1 to J; Y = Rannor(0); * Makrofaktor ~ N CPD = Probnorm((Probit(PD)-sqrt(rho)*Y)/(sqrt(1-rho))); * Bedingte Ausfallwah Default = Ranbin(0,I,CPD); * Summe der Portf PDR = (Default*PV_LL)/(I*PV_PP); * Portfolioverlus 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=PCTL; 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 Log in or register to post comments Doppelpost 3 July, 2009 - 13:05 — sgeißler Doppelpost Log in or register to post comments 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 MakroKenntnisse. Gruß Simon Log in or register to post comments 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 Log in or register to post comments Bitteschön: /* Tabelle 3 July, 2009 - 16:18 — sgeißler Bitteschön: /* Tabelle transponieren */ proc transpose data=pdr_percentile out=perc_trans; run; /* 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. &pctl4. &pctl5. &pctl /* 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},max(0,PDR-pctls{w run; Log in or register to post comments Danke Simon, mal wieder :-) 3 July, 2009 - 17:15 — risk_operator Danke Simon, mal wieder :-) !!!! 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 Log in or register to post comments 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-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 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,99 PCTLPRE=PCTL; 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,PDR-0.3834)); TLoss2 = (1/(0.3834-0.3471))*min(0.3834-0.3471,max(0,PDR-0.3471)); TLoss3 = (1/(0.3471-0.2908))*min(0.3471-0.2908,max(0,PDR-0.2908)); TLoss4 = (1/(0.2908-0.2403))*min(0.2908-0.2403,max(0,PDR-0.2403)); TLoss5 = (1/(0.2403-0.1800))*min(0.2403-0.1800,max(0,PDR-0.1800)); TLoss6 = (1/(0.1800-0.1409))*min(0.1800-0.1409,max(0,PDR-0.1409)); TLoss7 = (1/(0.1409-0.0000))*min(0.1409-0.0000,max(0,PDR-0.0000)); TLossMezz = (1/(0.3834-0.1409))*min(0.3834-0.1409,max(0,PDR-0.1409)); 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!!!! Log in or register to post comments 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. Gruß Simon Log in or register to post comments Danke Simon!!! Muss jetzt zur 4 July, 2009 - 10:36 — risk_operator Danke Simon!!! 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 Log in or register to post comments 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)/(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 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,98,99 PCTLPRE=PCTL proc transpose data=pdr_percentile out=perc_trans; 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-UT1)); TLoss2 = (1/(UT1-UT2))*min(UT1-UT2,max(0,PDR-UT2)); TLoss3 = (1/(UT2-UT3))*min(UT2-UT3,max(0,PDR-UT3)); TLoss4 = (1/(UT3-UT4))*min(UT3-UT4,max(0,PDR-UT4)); TLoss5 = (1/(UT4-UT5))*min(UT4-UT5,max(0,PDR-UT5)); TLoss6 = (1/(UT5-UT6))*min(UT5-UT6,max(0,PDR-UT6)); TLoss7 = (1/(UT6-UT7))*min(UT6-UT7,max(0,PDR-UT7)); Drop OT1 UT1 UT2 UT3 UT4 UT5 UT6 UT7; Proc univariate data=Cdo.Tranched_PDR_Zerobond_FV; Histogram; run; 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? Log in or register to post comments Oh, ich wollte sagen: "Vorher 5 July, 2009 - 10:58 — sgeißler Oh, ich wollte sagen: "Vorher den Proc...". 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 "run;" 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 ;) Gruß Simon Log in or register to post comments Simon, 1000 Dank für 5 July, 2009 - 14:21 — risk_operator Simon, 1000 Dank für alles. Jetzt läufts :-). Sie waren falsch rum!!! Und Deinen Tipp habe ich gerne angenommen. Es sieht auf jeden Fall übersichtlicher aus. Nochmals vielen Dank! Mit besten Grüßen Gökhan Log in or register to post comments 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? Gruß Simon Log in or register to post comments 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) Log in or register to post comments 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 Log in or register to post comments Servus, besteht eigentlich 12 July, 2009 - 12:40 — risk_operator Servus, 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. Gruß Gökhan Log in or register to post comments 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)/(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 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,98,99 PCTLPRE=PCTL; 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-UT1)); TLoss2 = (1/(UT1-UT2))*min(UT1-UT2,max(0,PDR-UT2)); TLoss3 = (1/(UT2-UT3))*min(UT2-UT3,max(0,PDR-UT3)); TLoss4 = (1/(UT3-UT4))*min(UT3-UT4,max(0,PDR-UT4)); TLoss5 = (1/(UT4-UT5))*min(UT4-UT5,max(0,PDR-UT5)); TLoss6 = (1/(UT5-UT6))*min(UT5-UT6,max(0,PDR-UT6)); TLoss7 = (1/(UT6-UT7))*min(UT6-UT7,max(0,PDR-UT7)); Drop OT1 UT1 UT2 UT3 UT4 UT5 UT6 UT7; Proc univariate data=Cdo.Tranched_PDR_Zerobond_FV; Histogram; Run; proc transpose data=pdr_percentile out=perc_trans; run; proc sql; select col1 into :PCTL1-:PCTL7 from perc_trans ; quit; run; Ich hoffe nicht, denn die Ergebnisse sind nicht richtig und den Fehler kann ich nicht finden. Log in or register to post comments 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? Log in or register to post comments