SAS: Расчет нескольких подразумеваемых волатильностей для набора данных опций - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу ежедневно рассчитывать подразумеваемую волатильность для набора данных цепочек опционов. У меня есть все необходимые данные в наборе данных со столбцами:

OptionID opt_price strike today exp eq_price intrate

Код SAS для IV:

options pageno=1 nodate ls=80 ps=64;

proc fcmp;
   opt_price=5;
   strike=50;
   today='20jul2010'd;
   exp='21oct2010'd;
   eq_price=50;
   intrate=.05;
   time=exp - today;
   array opts[5] initial abconv relconv maxiter status
                 (.5 .001 1.0e-6 100 -1);
   function blksch(strike, time, eq_price, intrate, volty);
      return(blkshclprc(strike, time/365.25,
                        eq_price, intrate, volty));
   endsub;
   bsvolty=solve("blksch", opts, opt_price, strike,
                             time, eq_price, intrate, .);

   put 'Option Implied Volatility:' bsvolty
       'Initial value: ' opts[1]
       'Solve status: ' opts[5];
run;

Источник: https://documentation.sas.com/?docsetId=proc&docsetTarget=p1xoknqns865t7n1wehj6xarwhdb.htm&docsetVersion=9.4&locale=en#p0ymk0vrf7cecfn1kec073rxqm7z

Теперь эта функция почему-то не нуждается sigma . Почему?

Во-вторых, как я могу вводить и выводить набор данных с серией опций в течение нескольких лет? Я попытался с помощью optionID, но я не знаю, как правильно вводить данные, а затем добавить их в набор данных (новая переменная с именем bsvolty .

1 Ответ

1 голос
/ 24 апреля 2020

Используйте опции FCMP DATA= и OUT= для предоставления входов и захвата выходов.

Что касается отсутствующего значения (.) в позиции аргумента сигма, документация SOLVE гласит:

Функция SOLVE находит значение указанного аргумента, который делает выражение следующей формы равным нулю.

  • Ожидаемое значение -
    имя-функции
    (аргумент-1, аргумент-2,
    ..., аргумент-n)

Вы указываете интересующий аргумент с отсутствующим значением (. ), который появляется вместо аргумента в списке параметров, показанном выше. Если функция SOLVE находит значение, то значение, возвращаемое для этой функции, является подразумеваемым значением.

Итак, SOLVE () - для сигмы blkshclpr c (то есть волатильности)

Пример кода:

data have;
input OptionID opt_price strike today: date9. exp: date9. eq_price intrate;
format today exp date9.;
datalines;
1 5 50 20jul2010 21oct2010  50 0.05
2 5 75 21jul2010 22oct2010  50 0.05
3 5 55 22jul2010 23oct2010  50 0.05
4 5 60 23jul2010 24oct2010  50 0.05
;

proc fcmp data=have out=want;

  time = exp - today;

  array opts[5] 
    initial abconv relconv maxiter status
    ( .5    .001   1.0e-6  100     -1)
  ;

  function blksch(strike, time, eq_price, intrate, volty);

    put volty=;  /* show the SOLVE iterations in the OUTPUT window */

    return ( blkshclprc ( 
      strike,       /* E: exercise prices */
      time/365.25,  /* t: time to maturity (years) */
      eq_price,     /* S: share price */
      intrate,      /* r: annualized risk-free interest rate, continuouslycompounded */
      volty         /* sigma: volatility of the underlying asset */
    ));
  endsub;

  bsvolty=solve("blksch", opts, opt_price, strike,
                           time, eq_price, intrate, .);
run;

Набор выходных данных
enter image description here

Окно OUTPUT
enter image description here

...