RuntimeError: root not bracketed
RuntimeError: root not bracketed
class ComputeIV
{
public:
typedef std::pair<SimpleQuote,SimpleQuote> BidAsk;
static Volatility ComputeImpliedVol(const Date evalDate, const Date expiration, ptime quoteTime, const Option::Type optionType,
const Real underlyingPrice, const Real optionPrice, const Real strike, const Rate riskFree)
{
ActualActual actualActual;
Settings::instance().evaluationDate() = evalDate;
Time timeToMaturity = actualActual.yearFraction(Settings::instance().evaluationDate(), expiration);
time_duration timeOfDayDuration = quoteTime.time_of_day();
timeToMaturity += (timeOfDayDuration.hours() + timeOfDayDuration.minutes()/60.0)/(24.0 * 365.0);
DiscountFactor discount = std::exp(-riskFree * timeToMaturity);
Bisection bisection;
Real accuracy = 0.000001, guess = .20;
Real min = .05, max = .40;
Volatility sigma = bisection.solve([&](const Volatility & sigma) {
Real stdDev = sigma * std::sqrt(timeToMaturity);
BlackCalculator blackCalculator(optionType, strike, underlyingPrice, stdDev, discount);
return blackCalculator.value() - optionPrice;
}, accuracy, guess, min, max);
return sigma;
}
static const double& pTest(const std::string evalDateStr, const std::string expirationStr, const std::string quoteTimeStr,
const int optType, const Real forwardBid, const Real forwardAsk, const Rate riskFree, const Real strike,
const Real oBid, const Real oAsk)
{
std::cout << "Computing IV" << std::endl << std::flush;
ActualActual actualActual;
std::cout << evalDateStr << " " << expirationStr << " " << quoteTimeStr << std::endl << std::flush;
std::cout << optType << " " << riskFree << " " << forwardBid << " " << forwardAsk << " " << strike
<< " " << oBid << " " << oAsk << std::endl << std::flush;
Date evalDate = DateParser::parseFormatted(evalDateStr.c_str(), "%d/%m/%Y");
Settings::instance().evaluationDate() = evalDate;
Date expiration = DateParser::parseFormatted(expirationStr.c_str(), "%d/%m/%Y");
ptime quoteTime(from_iso_string(quoteTimeStr));
time_duration timeOfDayDuration = quoteTime.time_of_day();
Real price = (oBid + oAsk) / 2.0;
Option::Type oType = (optType > 0 ? Option::Call : Option::Put);
Volatility *sigma = new Volatility();
*sigma = ComputeIV::ComputeImpliedVol(evalDate, expiration, quoteTime, oType,
forwardAsk, price, strike, riskFree);
return *sigma;
}
private:
};
当我用这些参数调用时,
from options import ComputeIV
PUT = -1
Call = 1
evalDate = "03/01/2017"
expiration = "07/07/2017";
quoteTime = "20170103T210000"
forwardBid = 84.19
forwardAsk = 84.20
riskFree = .015
strike = 45.0
oBid = 0.10
oAsk = 0.17
oType = PUT
sigma = ComputeIV.pTest(evalDate, expiration, quoteTime, oType, forwardBid, forwardAsk, riskFree, strike, oBid, oAsk)
print "from python sigma = %f" % sigma
我收到运行时错误:
Traceback (most recent call last):
File "cboelivedata.py", line 575, in <module>
main()
File "cboelivedata.py", line 400, in main
sigma = ComputeIV.pTest(evalDate, expiration, quoteTime, oType, forwardBid, forwardAsk, riskFree, strike, oBid, oAsk)
RuntimeError: root not bracketed: f[0.05,0.4] -> [-1.350000e-01,-2.434993e-02]
[idf@node3 python]$
是不是我做的不对?
您正在使用黑色配方。在欧式期权的 Black-Scholes 框架中,期权价格是波动率的增函数。
平分波动率的最小和最大范围是 0.05
和 0.40
。他们够好吗?您的看跌期权很深 out-of-money,因此需要高波动率。
让我们检查一下您的射程。转到 http://www.erieri.com/blackscholes,然后像我一样输入信息:
您的求解器可以给您的最高看跌期权价格约为 0.0797,但您的报价为 0.135。因此,没有解,你的二分根求解器告诉你是正确的。
您将需要增加波动范围。尝试:
Real min = .05, max = 1.00;
您可能不需要 1.00(这太大了),但您明白了 - 您需要调整 root-solving 范围。
试试吧,你会得到你的隐含波动率。
class ComputeIV
{
public:
typedef std::pair<SimpleQuote,SimpleQuote> BidAsk;
static Volatility ComputeImpliedVol(const Date evalDate, const Date expiration, ptime quoteTime, const Option::Type optionType,
const Real underlyingPrice, const Real optionPrice, const Real strike, const Rate riskFree)
{
ActualActual actualActual;
Settings::instance().evaluationDate() = evalDate;
Time timeToMaturity = actualActual.yearFraction(Settings::instance().evaluationDate(), expiration);
time_duration timeOfDayDuration = quoteTime.time_of_day();
timeToMaturity += (timeOfDayDuration.hours() + timeOfDayDuration.minutes()/60.0)/(24.0 * 365.0);
DiscountFactor discount = std::exp(-riskFree * timeToMaturity);
Bisection bisection;
Real accuracy = 0.000001, guess = .20;
Real min = .05, max = .40;
Volatility sigma = bisection.solve([&](const Volatility & sigma) {
Real stdDev = sigma * std::sqrt(timeToMaturity);
BlackCalculator blackCalculator(optionType, strike, underlyingPrice, stdDev, discount);
return blackCalculator.value() - optionPrice;
}, accuracy, guess, min, max);
return sigma;
}
static const double& pTest(const std::string evalDateStr, const std::string expirationStr, const std::string quoteTimeStr,
const int optType, const Real forwardBid, const Real forwardAsk, const Rate riskFree, const Real strike,
const Real oBid, const Real oAsk)
{
std::cout << "Computing IV" << std::endl << std::flush;
ActualActual actualActual;
std::cout << evalDateStr << " " << expirationStr << " " << quoteTimeStr << std::endl << std::flush;
std::cout << optType << " " << riskFree << " " << forwardBid << " " << forwardAsk << " " << strike
<< " " << oBid << " " << oAsk << std::endl << std::flush;
Date evalDate = DateParser::parseFormatted(evalDateStr.c_str(), "%d/%m/%Y");
Settings::instance().evaluationDate() = evalDate;
Date expiration = DateParser::parseFormatted(expirationStr.c_str(), "%d/%m/%Y");
ptime quoteTime(from_iso_string(quoteTimeStr));
time_duration timeOfDayDuration = quoteTime.time_of_day();
Real price = (oBid + oAsk) / 2.0;
Option::Type oType = (optType > 0 ? Option::Call : Option::Put);
Volatility *sigma = new Volatility();
*sigma = ComputeIV::ComputeImpliedVol(evalDate, expiration, quoteTime, oType,
forwardAsk, price, strike, riskFree);
return *sigma;
}
private:
};
当我用这些参数调用时,
from options import ComputeIV
PUT = -1
Call = 1
evalDate = "03/01/2017"
expiration = "07/07/2017";
quoteTime = "20170103T210000"
forwardBid = 84.19
forwardAsk = 84.20
riskFree = .015
strike = 45.0
oBid = 0.10
oAsk = 0.17
oType = PUT
sigma = ComputeIV.pTest(evalDate, expiration, quoteTime, oType, forwardBid, forwardAsk, riskFree, strike, oBid, oAsk)
print "from python sigma = %f" % sigma
我收到运行时错误:
Traceback (most recent call last):
File "cboelivedata.py", line 575, in <module>
main()
File "cboelivedata.py", line 400, in main
sigma = ComputeIV.pTest(evalDate, expiration, quoteTime, oType, forwardBid, forwardAsk, riskFree, strike, oBid, oAsk)
RuntimeError: root not bracketed: f[0.05,0.4] -> [-1.350000e-01,-2.434993e-02]
[idf@node3 python]$
是不是我做的不对?
您正在使用黑色配方。在欧式期权的 Black-Scholes 框架中,期权价格是波动率的增函数。
平分波动率的最小和最大范围是 0.05
和 0.40
。他们够好吗?您的看跌期权很深 out-of-money,因此需要高波动率。
让我们检查一下您的射程。转到 http://www.erieri.com/blackscholes,然后像我一样输入信息:
您的求解器可以给您的最高看跌期权价格约为 0.0797,但您的报价为 0.135。因此,没有解,你的二分根求解器告诉你是正确的。
您将需要增加波动范围。尝试:
Real min = .05, max = 1.00;
您可能不需要 1.00(这太大了),但您明白了 - 您需要调整 root-solving 范围。
试试吧,你会得到你的隐含波动率。