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;
- ListTables.sas -- kod makra do pobrania [1 kB]
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;
- MaturityFromTenor.sas -- plik z kodem źródłowym
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
- recurrence.m -- skrypt do pobrania
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.
- xlBarrierOptions.xla — dodatek xla
- xlBarrierOptions.xls — przykład wykorzystania (arkusz do wyceny opcji barierowych)
Elementy składowe dodatku:
- xlBarrierOptions.bas -- moduł klasy BarrierOptionEngine
- AnalyticBarrierEngine.cls -- moduł zawierający funkcję BarrierPrice
Słowa kluczowe: excel, vba, makra, addin, opcje, opcje barierowe, instrumenty pochodne, Black Scholes, QuantLib, Haug, The Complete Guide to Option Pricing Formulas


![[vim created]](./grafika/vim_created.png)