15 lipca 2009

Tworzenie listy tablic -- SAS

Poniżej zamieszczam kod makra SAS, które służy tworzeniu listy tablic.

Lista tablic jest tworzona w oparciu o dopasowanie nazw biblioteki i tablicy do zadanych wzorców (wyrażenia regularne). Domyślnie makro nie pobiera jedynie nazwę wynikowego zbioru/tablicy. W takim przypadku działanie makra sprowadza się do skopiowania tablicy sashelp.vstable, która zawiera pary biblioteka x tablica. Zawężenie zbioru tablic można uzyskać podając wzorce zapisane za pomocą wyrażeń regularnych, do którego ma pasować nazwa tablicy i/lub nazwa biblioteki, w której znajduje się tablica.

Opis konstrukcji wyrażeń regularnych w SAS można znaleźć w dokumencie An Introduction to Perl Regular Expressions in SAS 9 [pdf, 489 kB].

Korzystając z zamieszczoneg niżej makra należy pamiętać o tym, że wszystkie nazwy bibliotek i tablic dostępne w widoku sashelp.vstable zapisywane są wyłącznie przy użyciu wielkich liter. Oznacza to, że fragmenty nazw zawarte w wyrażeniu regularnym powinny być również pisane wielką literą niezależnie od sposobu ich wyświetlania przez system SAS oraz zapisu w kodzie. Innym rozwiązaniem jest stworzenie wzorca, który jest niewrażliwy na wielkość liter. Wzorce takie tworzy się poprzez dodanie na końcu pojedynczej litery i (por. tekst komentarza w kodzie poniżej).

%macro ListTables(DATASET, LIBRE="/^./", TBLRE="/^./"); data &DATASET; set sashelp.vstable; if _n_ = 1 then do; LibraryPattern = prxparse(&LIBRE); TablePattern = prxparse(&TBLRE); end; retain LibraryPattern; retain TablePattern; fitsLibraryPattern = prxmatch(LibraryPattern, strip(Libname)); fitsTablePattern = prxmatch(TablePattern, strip(Memname)); if fitsLibraryPattern and fitsTablePattern; keep libname memname ; run; %mend;

Słowa kluczowe: sas, 4GL, makra, regexp, wyrażenia regularne


08 lipca 2009

Tworzenie katalogu -- SAS

Poniżej zamieszczam kod makra SAS, które służy tworzeniu katalogów.

/* ==== CREATEDIR(DIRNAME) Tworzy katalog DIRNAME np. %CreateDir("C:\katalog"); ==== */ %macro CreateDir(DIR_NAME); options noxwait; %let DIR_NAME = %sysfunc(compress(&DIR_NAME, '"')); %put "&DIR_NAME"; data _null_; d_name = '"' || "&DIR_NAME" || '"'; rc = filename('f_ref', d_name); if not fexist('f_ref') then call system('md ' || d_name); run; %mend;

Słowa kluczowe: sas, 4GL, makra


02 lipca 2009

Zamiana tenoru na datę zapadalności -- SAS

/* ==== MATURITYFROMTENOR(DATASET, REFDATE) w tablicy DATASET tworzy kolumne MaturityDate na podstawie danych w kolumnach Tenor i REFDATE np. %MaturityFromTenor(tName, refDate); MATURITYFROMTENOR(DATASET, REFDATE, TCOL=T_COL) w tablicy DATASET tworzy kolumne MaturityDate na podstawie danych w kolumnach "T_COL" i REFDATE np. %MaturityFromTenor(tName, refDate, TCOL=Tenor); MATURITYFROMTENOR(DATASET, REFDATE, TCOL=T_COL, MCOL=M_COL) w tablicy DATASET tworzy kolumne "M_COL" na podstawie danych w kolumnach "T_COL" i REFDATE np. %MaturityFromTenor(tName, rDate, TCOL=tnr, MCOL=mDate); REFDATE moze byc zarowno nazwa kolumny z data referencyjna jak i sama data referencyjna np. %MaturityFromTenor(Maturity, ReferenceDate); - data referencyjna w kolumnie ReferenceDate %MaturityFromTenor(Maturity, "26mar2008"d); - data referencyjna 26/03/2008 ==== */ %macro MaturityFromTenor(DATASET, REFDATE, TCOL=Tenor, MCOL=MaturityDate); %let TCOL = %sysfunc(compress(&TCOL, '"')); %let MCOL = %sysfunc(compress(&MCOL, '"')); %let DATASET = %sysfunc(compress(&DATASET, '"')); %let REFDATE = &REFDATE; data &DATASET; set &DATASET; if _n_ = 1 then isTenorPattern = prxparse("/^\d+[ ]*((D(|ay(|s)))|(W(|eek(|s)))| (M(|onth(|s)))|(Y(|ear(|s))))$/i"); if _n_ = 1 then tUnitPattern = prxparse("/((D(|ay(|s)))|(W(|eek(|s)))|(M(|onth(|s)))| (Y(|ear(|s))))$/i"); if _n_ = 1 then nUnitPattern = prxparse("/^\d+/"); retain isTenorPattern; retain tUnitPattern; retain nUnitPattern; &TCOL = upcase(&TCOL); isTenor = prxmatch(isTenorPattern, strip(&TCOL)); if %left(Tenor, 2) = "ON" then &MCOL = &REFDATE + 1; if %left(Tenor, 2) = "SW" then &MCOL = &REFDATE + 7; if isTenor then do; call prxsubstr(tUnitPattern, strip(&TCOL), tUnitStart, tUnitLength); call prxsubstr(nUnitPattern, strip(&TCOL), nUnitStart, nUnitLength); /* implicit string to number conversion */ nUnits = substr(&TCOL, nUnitStart, nUnitLength) * 1; if substr(&TCOL, tUnitStart, 1) = "D" then &MCOL = &REFDATE + nUnits; else if substr(&TCOL, tUnitStart, 1) = "W" then &MCOL = &REFDATE + 7*nUnits; else do; referenceDay = day(&REFDATE); referenceMonth = month(&REFDATE); referenceYear = year(&REFDATE); if substr(Tenor, tUnitStart, 1) = "M" then referenceMonth = referenceMonth + nUnits; if substr(Tenor, tUnitStart, 1) = "Y" then referenceYear = referenceYear + nUnits; if referenceMonth > 12 then do; referenceYear = referenceYear + (referenceMonth - mod(referenceMonth - 1, 12) - 1) / 12; referenceMonth = mod(referenceMonth - 1, 12) + 1; end; &MCOL = mdy(referenceMonth, referenceDay, referenceYear); end; end; drop referenceDay referenceMonth referenceYear isTenorPattern tUnitPattern nUnitPattern isTenor tUnitStart tUnitLength nUnitStart nUnitLength nUnits ; run; %mend;

Słowa kluczowe: makra, sas, 4GL


27 czerwca 2009

Równania rekurencyjne w Matlabie

function x = recurrence(x0, a, b, n) % x = recurrence(a, x0, n) % x0 wektor wartosci poczatkowych [kx1] lub [1xk] % a wektor parametrow [kx1] lub [1xk] % b wyraz wolny [1x1] % n dlugosc ciagu x [1x1] % % np. % y(n) = 7 - y(n-1) + 3*y(n-2) % y(0) = 0 % y(1) = 1 % % a = [3, -1] % x0 = [0, 1] % b = 7 k = numel(x0); % stopien rownania rekurencji [x0, a] = deal(x0(:), a(:)); assert(n>=k); assert(k == numel(a)); x = NaN(n, 1); % prealokacja pamieci dla ciagu wynikowego x(1:k) = x0; % przypisanie wart. pocz. do c. wynikowego for i = (k+1):n x(i) = sum(x0.*a) + b; x0 = x((i-k+1):i); end

Słowa kluczowe: matlab, równanie różnicowe


13 czerwca 2009

Opcje barierowe -- Excel VBA

W ramach swoich zainteresowań stworzyłem dodatek xla (Excel Addin) z funkcją do wyceny opcji barierowych. Jest to prosta implementacja formuł zamieszczonych przez Espena Hauga w The Complete Guide to Option Pricing Formulas wzorowana na implementacji zastosowanej w bibliotece QuantLib.

Elementy składowe dodatku:

Słowa kluczowe: excel, vba, makra, addin, opcje, opcje barierowe, instrumenty pochodne, Black Scholes, QuantLib, Haug, The Complete Guide to Option Pricing Formulas