2012-04-09 2 views
4

У меня есть набор данных в кадре данных со следующей информацией:R с помощью применять/plyr с функцией RQuantlib

> head(rs1) 
     dater adjStkPrice    optSym  expire strike bid ask unadjStkPrice daysLeft pnl 
1 2011-01-03  127.05 SPY 131221P00115000 2013-12-21 115 14.89 15.40  127.05  1083 319.5 
2 2011-01-04  126.98 SPY 131221P00115000 2013-12-21 115 15.00 15.39  126.98  1082 328.4 
3 2011-01-05  127.64 SPY 131221P00115000 2013-12-21 115 14.39 14.86  127.64  1081 287.2 
4 2011-01-06  127.39 SPY 131221P00115000 2013-12-21 115 14.38 14.80  127.39  1080 278.7 
5 2011-01-07  127.14 SPY 131221P00115000 2013-12-21 115 14.67 15.10  127.14  1079 300.2 
6 2011-01-10  126.98 SPY 131221P00115000 2013-12-21 115 14.75 15.19  126.98  1076 303.4 

Я пытаюсь получить подразумеваемой волатильности с помощью функции AmericanOptionImpliedVolatility в RQuantLib пакете. Проблема заключается в том, что он, кажется, принимать только одиночные наборы значений:

> rs1$impVol <- AmericanOptionImpliedVolatility("put", rs1$ask, 
+ rs1$adjStkPrice, rs1$strike, .02, .05, rs1$daysLeft/ 365, .4)$impliedVol 
Error in AmericanOptionImpliedVolatility.default("put", rs1$ask, rs1$adjStkPrice, : 
    expecting a single value 

Я думаю, что это место для функции apply, но я не уверен, если я использую это правильно:

> rs1$impVol <- apply(rs1, 1, AmericanOptionImpliedVolatility("put", rs1$ask, 
+ rs1$adjStkPrice, rs1$strike, .02, .05, rs1$daysLeft/ 365, .4)$impliedVol) 
Error in AmericanOptionImpliedVolatility.default("put", rs1$ask, rs1$adjStkPrice, : 
    expecting a single value 

Любые предложения?

+1

Вы хотите 'rs1 $ daysleft/252', не более 365. –

+0

Спасибо, не был уверен в этом. – screechOwl

ответ

5

Вы можете использовать Vectorize или mapply.

Vectorize(AmericanOptionImpliedVolatility)(
    type="put", value=15:16, underlying=130:131, 
    strike=115, dividendYield=.02, riskFreeRate=.05, maturity=1, 
    volatility=.1 
) 

mapply(
    AmericanOptionImpliedVolatility, 
    type="put", value=15:16, underlying=130:131, 
    strike=115, dividendYield=.02, riskFreeRate=.05, maturity=1, 
    volatility=.1 
) 

Если вы хотите использовать apply, его третий аргумент должен быть функцией. Кроме того, он преобразует каждую строку в вектор, , что является проблематичным, если в некоторых столбцах содержатся строки.

Вы также можете использовать sapply на номера строк, , но это всего лишь замкнутая петля, менее читаемая, чем mapply.

sapply(
    seq_len(nrows(rs1)), 
    function(i) AmericanOptionImpliedVolatility( 
    type="put", 
    value=rs1$ask[i], 
    ... (add the other arguments) 
) 
) 
+0

+1! Есть ли разница в производительности между «mapply» и «Vectorize», или это разница только в синтаксисе. Какой ты предпочитаешь? –

+0

@PaulHiemstra: Поскольку 'Vectorize' является только оберткой вокруг' mapply', производительность должна быть одинаковой. Когда я просто хочу вызвать функцию, я нахожу «mapply» более читабельным, но когда мне нужна векторная функция (обычно как аргумент другой функции, часто «внешний»), я использую 'vectorize'. –

Смежные вопросы