Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- matrix z has not been set to a value
- no data set is currently open for output
- File WORK.MYDATA2.DATA does not exist
- DATA allsamp0;
- SET sample;
- RUN;
- %macro loop;
- DATA test;
- SET sample1;
- IF ext_opt = 0 THEN ext_opt = .0001;
- ylow = LOG(debt_face);
- KEEP csho t_debt va siga debt_face exp_rf rf_net exp_divex exp_rfex x lambda ext_opt ylow;
- RUN;
- DATA test;
- RETAIN csho t_debt va siga debt_face exp_rf rf_net exp_divex exp_rfex x lambda ext_opt ylow;
- SET test;
- KEEP csho t_debt va siga debt_face exp_rf rf_net exp_divex exp_rfex x lambda ext_opt ylow;
- RUN;
- * Read data into IML ;
- PROC IML;
- USE test;
- READ all var _ALL_ into B;
- CLOSE close test;
- csho = B[1,1];
- t_debt = B[1,2];
- va = B[1,3];
- siga = B[1,4];
- debt_face = B[1,5];
- exp_rf = B[1,6];
- rf_net = B[1,7];
- exp_divex= B[1,8];
- exp_rfex = B[1,9];
- x = B[1,10];
- lambda = B[1,11];
- ext_opt = B[1,12];
- ylow = B[1,13];
- /* Define the integr/
- START FUN(y) GLOBAL (va, rf_net, siga, t_debt, debt_face, csho, x, exp_divex, exp_rf, exp_rfex, lambda, ext_opt, vd, ylow);
- IF ext_opt = 0 THEN ext_opt = .0001;
- f1d = (y - LOG((debt_face + csho * x)) + (rf_net + 0.5 * siga**2) * ext_opt) / (siga * SQRT(ext_opt));
- f2d = f1d - (siga * SQRT(ext_opt)) ;
- opt = (EXP(y) * exp_divex * PROBNORM(f1d) - (debt_face + csho * x) * exp_rfex * PROBNORM(f2d)) ;
- mu = LOG(va) + (rf_net - 0.5 * siga**2) * t_debt;
- sigma = siga * SQRT(t_debt);
- a0 = (LOG(debt_face + csho * x) -mu) / sigma;
- pdf = EXP(-((y - mu)**2/(2 * sigma**2))) / (SQRT (2 * CONSTANT('PI')) * sigma);
- pre = lambda * exp_rf;
- int = pre * opt* pdf;
- return(int);
- finish;
- /*
- SAS does not like very low lower bounds. no value if 2 std below face?
- */
- mu = LOG(va) + (rf_net - 0.5 * siga**2) * t_debt;
- sigma = siga * SQRT(t_debt);
- yhigh = mu + 5 * sigma;
- mid = (yhigh + ylow) / 2;
- call quad(z, "fun", ylow || yhigh) peak= mid;
- create MyData2 from z;
- append from z;
- close MyData2;
- quit ;
- DATA MyData2;
- SET MyData2;
- RENAME COL1 = w_later;
- RUN;
- DATA new;
- SET MyData2;
- RUN;
- %mend loop;
- %macro bigloop ;
- %DO i=1 %TO &nobs;
- DATA sample;
- SET allsamp0;
- IF observ = &i;
- PROC SORT;
- BY co_per_rol year;
- RUN;
- DATA allsamp;
- SET sample;
- RUN;
- /*
- solve for va, siga numerically
- */
- %macro newton ;
- %LET tol = 0.00000001;
- %LET absg = 1;
- %DO iter = 1 %TO 100;
- %IF &absg <= &tol %THEN %GOTO leave;
- DATA sample1;
- SET sample;
- ext_opt = t_opt - t_debt;
- KEEP va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt;
- RUN;
- %loop;
- DATA new;
- SET new;
- w_later = w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- RUN;
- PROC DATASETS NOLIST;
- DELETE new MYDATA2 test;
- QUIT;
- RUN;
- /*
- solving for derivatives in va
- */
- DATA sample;
- SET sample;
- inc = 0.0000001;
- RUN;
- DATA sample1;
- SET sample;
- va = va + inc;
- ext_opt = t_opt - t_debt;
- KEEP va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt ;
- RUN;
- PROC DATASETS NOLIST;
- DELETE new MYDATA2 test;
- QUIT;
- RUN;
- %loop ;
- DATA new;
- SET new;
- w_later_up = w_later;
- DROP w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- warr_delta = optosey * (w_later_up - w_later) / inc;
- dd = (LOG(va / debt_face) + (rf_net + 0.5 * siga**2) * t_debt) / (siga * SQRT(t_debt));
- dd1 = dd - (siga * SQRT(t_debt));
- debt_bs = debt_face * EXP(-r_debt * t_debt) * (1 - PROBNORM(-dd + siga * SQRT(t_debt)) ) + va * exp_div * PROBNORM(-dd);
- eqcall = (va * exp_div * PROBNORM(dd) - debt_face * exp_rf * PROBNORM(dd1)) + va * (1 - exp_div);
- tva = va + inc;
- dd = (LOG(tva / debt_face) + (rf_net + 0.5 * siga**2) * t_debt) / (siga * SQRT(t_debt));
- dd1 = dd - (siga * SQRT(t_debt));
- debt_bs_up = debt_face * EXP(-r_debt*t_debt) * (1 - PROBNORM(-dd + siga * SQRT(t_debt)) ) + tva * exp_div * PROBNORM(-dd);
- debt_delta = (debt_bs_up - debt_bs) / inc;
- stk_delta = 1 - debt_delta - warr_delta;
- eqcall1 = tva * exp_div * PROBNORM(dd) - debt_face * exp_rf * PROBNORM(dd1) + tva * (1 - exp_div);
- eq_delta=(eqcall1 - eqcall)/inc ;
- RUN;
- DATA sample;
- SET sample;
- g1 = mve + optosey * w_later - eqcall;
- g2 = siga * (va / mve) * stk_delta - sige;
- dg1a = warr_delta - eq_delta;
- dg2a = siga * (1 / mve) * stk_delta;
- dg2b = (va / mve) * stk_delta;
- DROP tva debt_bs_up w_later_up inc;
- RUN;
- /*
- now derivatives wrt siga
- */
- DATA sample;
- SET sample;
- inc = 0.0000001;
- RUN;
- DATA sample1;
- SET sample;
- siga = siga + inc;
- ext_opt=t_opt - t_debt;
- KEEP va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt eqcall;
- RUN;
- PROC DATASETS NOLIST;
- DELETE new MYDATA2 test ;
- QUIT;
- RUN;
- %loop;
- DATA new;
- SET new ;
- w_later_up = w_later;
- DROP w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- warr_dsig = optosey * (w_later_up - w_later) / inc;
- dd =(LOG( va / debt_face) + (rf_net + 0.5 * siga**2) * t_debt) / (siga * SQRT(t_debt));
- dd1 = dd - (siga * SQRT(t_debt));
- eqcall = (va * exp_div * PROBNORM(dd) - debt_face * exp_rf * PROBNORM(dd1) + va * (1 - exp_div));
- tsiga = siga + inc;
- dd =(LOG( va / debt_face) + (rf_net + 0.5 * tsiga**2) * t_debt) / (tsiga * SQRT(t_debt));
- dd1 = dd - (tsiga * SQRT(t_debt));
- eqcall1 = (va * exp_div * PROBNORM(dd) - debt_face * exp_rf * PROBNORM(dd1) + va * (1 - exp_div));
- call_dsig = (eqcall1 - eqcall) / inc;
- RUN;
- DATA sample ;
- SET sample ;
- old_va = va;
- old_siga = siga;
- dg1b = warr_dsig - call_dsig;
- det = 1 / ((dg1a * dg2b) - (dg1b * dg2a));
- va = va - det * ((dg2b*g1) - (dg1b * g2));
- IF va < 0 THEN va = old_va;
- siga = siga - det * ( -(dg2a*g1) + (dg1a * g2));
- IF siga < 0 THEN siga = old_siga;
- gtg = g1 * g1 + g2 * g2;
- absg = sqrt(gtg);
- j = &iter ;
- RUN;
- DATA _null_;
- SET sample;
- call symput('absg', strip(put(absg,8.)) );
- RUN;
- %end;
- %leave:
- DATA sample;
- SET sample;
- absg = &absg;
- j = j + 1;
- RUN;
- %mend newton;
- %newton;
- /*
- now have va and siga -- solve warrant value and vega
- */
- DATA allsamp;
- SET allsamp;
- DROP va siga;
- RUN;
- PROC SQL;
- CREATE TABLE sample AS
- SELECT DISTINCT a.*, b.va, b.siga, b.absg, b.j
- FROM allsamp AS a LEFT JOIN sample AS b
- ON (a.co_per_rol = b.co_per_rol) AND
- (a.year = b.year);
- QUIT;
- DATA sample1;
- SET sample;
- ext_opt = t_opt - t_debt;
- KEEP va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt;
- RUN;
- %loop ;
- /*
- DATA sample;
- SET sample;
- DROP w_later;
- RUN;
- */
- DATA new;
- SET new;
- KEEP w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- RUN;
- PROC DATASETS NOLIST;
- DELETE new MYDATA2 test;
- QUIT;
- RUN;
- DATA sample1;
- SET sample ;
- * for ceo -- see AN p.1203 ;
- csho = -optosey + ex2un / (lambda * x);
- x = x;
- ext_opt = t_opt - t_debt;
- KEEP va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt;
- RUN;
- %loop ;
- DATA new;
- SET new;
- unceo_later = w_later;
- DROP w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- RUN;
- PROC DATASETS NOLIST;
- DELETE new MYDATA2 test;
- QUIT;
- RUN;
- DATA sample1;
- SET sample ;
- * for ceo -- see AN p.1203 ;
- csho = -optosey + ex2ex / (lambda * x);
- x = x;
- ext_opt = t_opt - t_debt;
- keep va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt;
- RUN;
- %loop;
- DATA new;
- SET new;
- exceo_later = w_later;
- DROP w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- RUN;
- PROC DATASETS NOLIST;
- DELETE new MYDATA2 test;
- QUIT;
- RUN;
- DATA sample;
- SET sample;
- dd = (LOG( va / debt_face) + (rf_net + 0.5 * siga**2) * t_debt) / (siga * SQRT(t_debt));
- dd1 = dd - (siga * SQRT(t_debt));
- eqcall = va * exp_div * PROBNORM(dd) - debt_face * exp_rf * PROBNORM(dd1) + va * (1 - exp_div);
- checkmv = eqcall - w_later * optosey;
- DATA sample;
- SET sample;
- siga1 = 1.01 * siga;
- RUN;
- DATA sample1;
- SET sample;
- siga = siga1;
- ext_opt = t_opt - t_debt;
- KEEP va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt;
- RUN;
- %loop ;
- DATA new;
- SET new;
- w_later1 = w_later ;
- DROP w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- RUN;
- PROC DATASETS NOLIST;
- DELETE new MYDATA2 test;
- QUIT;
- RUN;
- DATA sample1;
- SET sample;
- siga = siga1;
- * for ceo AN p.1203;
- x = x;
- csho = -optosey + ex2ex / (lambda * x);
- ext_opt = t_opt - t_debt;
- KEEP va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt;
- RUN;
- %loop ;
- DATA new;
- SET new;
- exceo_later1 = w_later;
- DROP w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- RUN;
- PROC DATASETS NOLIST;
- DELETE new MYDATA2 test;
- QUIT;
- RUN;
- DATA sample1;
- SET sample;
- siga = siga1;
- * for ceo AN p.1203;
- x = x;
- csho = -optosey + ex2un / (lambda * x);
- ext_opt = t_opt - t_debt;
- KEEP va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt;
- RUN;
- %loop ;
- DATA new;
- SET new;
- unceo_later1 = w_later ;
- DROP w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- RUN;
- PROC DATASETS NOLIST;
- DELETE new MYDATA2 test;
- QUIT;
- RUN;
- /*
- solving for delta derivatives in va
- */
- DATA sample;
- SET sample;
- inc = 0.0000001;
- RUN;
- DATA sample1;
- SET sample;
- va = va + inc;
- ext_opt = t_opt - t_debt;
- KEEP va rf_net siga t_debt debt_face csho x exp_divex exp_rf exp_rfex lambda observ ext_opt t_opt t_debt;
- RUN;
- %loop ;
- DATA new;
- SET new;
- w_later_up = w_later ;
- DROP w_later;
- RUN;
- DATA sample;
- MERGE sample new;
- warr_delta = optosey * (w_later_up - w_later) / inc;
- dd = (LOG(va / debt_face) + (rf_net + 0.5 * siga**2) * t_debt) / (siga * SQRT(t_debt));
- dd1 = dd - (siga * SQRT(t_debt));
- debt_bs = debt_face * EXP(-r_debt * t_debt) * (1 - PROBNORM(-dd + siga * SQRT(t_debt)) ) + va * exp_div * PROBNORM(-dd);
- eqcall = (va * exp_div * PROBNORM(dd) - debt_face * exp_rf * PROBNORM(dd1)) + va * (1 - exp_div);
- tva = va+inc ;
- dd = (LOG(tva / debt_face) + (rf_net + 0.5 * siga**2) * t_debt) / (siga * SQRT(t_debt));
- dd1 = dd - (siga * SQRT(t_debt));
- debt_bs_up = debt_face * EXP(-r_debt * t_debt) * (1 - PROBNORM(-dd + siga * SQRT(t_debt)) ) + tva * exp_div * PROBNORM(-dd);
- debt_delta = (debt_bs_up - debt_bs) / inc;
- /*
- Estimate stk_delta using old volatility
- */
- stk_delta = 1 - debt_delta - warr_delta;
- /*
- estimate sige using new volatility
- */
- sige = siga * (va / mve) * stk_delta;
- /*
- estimate sige1 using new vola.
- */
- dd = (LOG( va / debt_face) + (rf_net + 0.5 * siga1**2) * t_debt) / (siga1 * SQRT(t_debt));
- dd1 = dd - (siga1 * SQRT(t_debt));
- eqcall1 = va * exp_div * PROBNORM(dd) - debt_face * exp_rf * PROBNORM(dd1) + va * (1 - exp_div);
- debt_bs1 = debt_face * EXP(-r_debt * t_debt) * (1 - PROBNORM(-dd + siga1 * SQRT(t_debt)) ) + va * exp_div * PROBNORM(-dd);
- mve1 = eqcall1 - optosey * w_later1;
- prc1 = mve1 /csho;
- firm_stock_sens = csho * (prc1 - prcc_f);
- sige1 = siga1 * (va / mve1) * stk_delta;
- firm_debt_sens = debt_bs1 - debt_bs;
- RUN;
- DATA sample;
- SET sample;
- r_ex = r_opt;
- r_un = r_opt;
- mat_ex = t_opt;
- mat_un = t_opt;
- mgr_stock_sens = shrown_excl_opts * (prc1 - prcc_f);
- mgr_option_sens = (exceo_later1 - exceo_later) * opt_unex_exer_num * 1000 + (unceo_later1 - unceo_later) * opt_unex_unexer_num * 1000;
- mgr_debt_sens = . ;
- IF inside_debt >= 0 THEN mgr_debt_sens = (inside_debt / debt_contract) * firm_debt_sens;
- mgr_total_sens = mgr_debt_sens + mgr_stock_sens + mgr_option_sens;
- mgr_equity_sens = mgr_stock_sens + mgr_option_sens;
- IF opt_unex_exer_num > 0 THEN DO;
- dd_ex_simp = (LOG(prcc_f / ex2ex) + (r_ex -divrate_crsp + 0.5*sige**2) * mat_ex) / (sige * SQRT(mat_ex));
- exbsval_simp = opt_unex_exer_num * (prcc_f * EXP(-1 * divrate_crsp * mat_ex) * PROBNORM(dd_ex_simp) - ex2ex * EXP(-1*r_ex*mat_ex) * PROBNORM(dd_ex_simp - sige*SQRT(mat_ex)) );
- dd_ex_simp = (LOG(prcc_f / ex2ex) + (r_ex - divrate_crsp + 0.5 * sige1**2) * mat_ex) / (sige1 * SQRT(mat_ex));
- exbsval_simp1 = opt_unex_exer_num * (prcc_f * EXP(-1 * divrate_crsp * mat_ex) * PROBNORM(dd_ex_simp) - ex2ex * EXP(-1 * r_ex * mat_ex) * PROBNORM(dd_ex_simp - sige1 * SQRT(mat_ex)));
- END;
- ELSE IF opt_unex_exer_num = 0 THEN DO;
- exbsval_simp = 0;
- exbsval_simp1 = 0;
- END;
- IF opt_unex_unexer_num > 0 THEN DO;
- dd_un_simp = (LOG(prcc_f / ex2un) + (r_un - divrate_crsp + 0.5 * sige**2) * mat_un) / (sige * SQRT(mat_un));
- unbsval_simp = opt_unex_unexer_num * (prcc_f * EXP(-1 * divrate_crsp * mat_un) * PROBNORM(dd_un_simp) - ex2un * EXP(-1 * r_un * mat_un) * PROBNORM(dd_un_simp - sige*SQRT(mat_un)) );
- dd_un_simp = (LOG(prcc_f / ex2un) + (r_un - divrate_crsp + 0.5 * sige1**2) * mat_un) / (sige1 * SQRT(mat_un));
- unbsval_simp1 = opt_unex_unexer_num * (prcc_f * EXP(-1 * divrate_crsp * mat_un) * PROBNORM(dd_un_simp) - ex2un * EXP(-1 * r_un*mat_un) * PROBNORM(dd_un_simp - sige1*SQRT(mat_un)) );
- END;
- ELSE IF opt_unex_unexer_num = 0 THEN DO;
- unbsval_simp = 0;
- unbsval_simp1 = 0;
- END;
- ELSE IF optosey = 0 THEN DO;
- unbsval_simp = 0;
- END;
- totvega = ((exbsval_simp1 - exbsval_simp) + (unbsval_simp1 - unbsval_simp)) * 1000;
- IF ceo_opt = 0 THEN DO;
- mgr_option_sens = 0;
- totvega = 0;
- END;
- mgr_total_sens = mgr_debt_sens + mgr_stock_sens + mgr_option_sens;
- mgr_equity_sens = mgr_stock_sens + mgr_option_sens;
- RUN;
- %IF &i=1 %THEN %DO;
- DATA finsamp;
- SET sample;
- RUN;
- %END;
- %IF &i>1 %THEN %DO;
- DATA finsamp;
- SET finsamp sample;
- RUN;
- %END;
- %END;
- %mend bigloop ;
- OPTIONS NONOTES;
- %bigloop;
- OPTIONS NOTES;
- PROC MEANS DATA = finsamp;
- RUN;
- PROC MEANS DATA = equal;
- RUN;
- PROC SQL;
- CREATE TABLE finsamp AS
- SELECT DISTINCT a.*, b.war_val_eq
- FROM finsamp AS a LEFT JOIN equal AS b
- ON a.co_per_rol = b.co_per_rol and a.year = b.year;
- QUIT;
- PROC SORT DATA = finsamp;
- BY co_per_rol year;
- RUN;
- PROC MEANS DATA = finsamp;
- VAR co_per_rol year mgr_option_sens va siga war_val_eq exbsval_simp totvega stk_delta debt_delta warr_delta sige1 sige siga1 siga siga_eq;
- RUN;
- DATA &output_ds;
- SET finsamp;
- RUN;
- %winsor(dsetin=finsamp, dsetout=finsamp, vars=mgr_debt_sens mgr_stock_sens mgr_option_sens mgr_equity_sens mgr_total_sens, type=winsor, pctl=1 99);
- PROC MEANS DATA=finsamp;
- VAR mgr_debt_sens mgr_stock_sens mgr_option_sens mgr_equity_sens mgr_total_sens;
- RUN;
- PROC MEANS DATA=finsamp (WHERE=(mgr_total_sens ^= .));
- VAR mgr_debt_sens mgr_stock_sens mgr_option_sens mgr_equity_sens mgr_total_sens;
- RUN;
Add Comment
Please, Sign In to add comment