American Option Implied Volatility with Discrete Dividends
Summary
This question investigates a mismatch between option values and implied volatilities for American options on SPY around a discrete dividend. The author compares Interactive Brokers analytics with QuantLib using observed option data and checks whether repricing at an implied volatility recovers the original value. Calls show relatively small round-trip differences, while some puts—especially those highlighted at lower strikes—show substantially larger discrepancies. The results are presented as a diagnostic, not as a resolved explanation.
The author raises several possibilities: an error in the test, a misunderstanding of the value–volatility relationship, or an issue in the pricing implementation. The post notes that American exercise and a discrete dividend may complicate pricing, and speculates that volatility behavior could be discontinuous near the ex-date. It does not establish which explanation is correct, so the reported comparison should be read as an open investigation rather than proof of a QuantLib defect.
Key ideas
- Implied volatility and option value can be checked by repricing the option at the inferred volatility.
- The reported QuantLib and broker comparisons show larger round-trip discrepancies for some puts than for calls.
- American exercise and discrete dividends complicate the pricing comparison.
- The post leaves open whether the discrepancy comes from the test, interpretation, or software implementation.
- The observed mismatch does not by itself establish a pricing-library bug.
Tags
Full text
# QuantLib - American put with discrete dividend - inverse fails
# QuantLib - American put with discrete dividend - inverse fails
I'm comparing QL and IBKR analytics (`tickOptionComputation()` message) for American options with a single dividend,
- data collected 9/13/2024;
- SPY 20240920 puts and calls;
- 1.76 USD dividend for SPY shares with ex-date 9/20/2024.
One sanity check is that option value and implied volatility are (at least approximately numerically) invertible. I expect:
$$\begin{aligned} \textrm{option-value} &= f\left(\textrm{implied-volatility}\right) \\ \textrm{implied-volatility} &= f^{-1}\left(\textrm{option-value}\right) \\ \textrm{option-value} &\approx f\left(f^{-1}\left(\textrm{option-value}\right)\right) \end{aligned}$$
For SPY calls, this approximation roughly holds. However, for SPY puts, the discrepancy between input and output option value is too large. See for instance the `SPY 20240920 559 P` difference (bottom right value) in output below.
Things are likely more complex "under the covers" when pricing American options with a discrete dividend. For instance, the volatility might be discontinuous around ex-date.
Question: is the bug in my understanding of the option-value, implied-volatility relationship; a bug in my test code; or, an issue with the QuantLib implementation?
(If this is a software implementation issue, I'll move this discussion to a QuantLib bug report. Thanks.)
Output
```
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< cc.qpm.app:tickOptionComputation >------------------
[INFO] Building tickOptionComputation 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec:3.4.1:java (default-cli) @ tickOptionComputation ---
SLF4J(I): Connected with provider of type [org.slf4j.simple.SimpleServiceProvider]
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - loaded 48 observations
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 532 C 30.896 0.219 562.170
value [ib w/ ib iv, ql w/ ib iv] 30.896 30.921 0.024
iv [ib model iv, ql iv from ib model value] 0.219 0.211 -0.008
value [ib model, ql value from ql iv of ib value] 30.896 30.879 -0.017
...
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 548 C 15.501 0.167 562.160
value [ib w/ ib iv, ql w/ ib iv] 15.501 15.521 0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.165 -0.002
value [ib model, ql value from ql iv of ib value] 15.501 15.493 -0.009
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:18 SPY 20240920 548 C 15.484 0.167 562.140
value [ib w/ ib iv, ql w/ ib iv] 15.484 15.503 0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.165 -0.002
value [ib model, ql value from ql iv of ib value] 15.484 15.475 -0.009
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:08 SPY 20240920 553 C 11.132 0.155 562.190
value [ib w/ ib iv, ql w/ ib iv] 11.132 11.153 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.132 11.125 -0.007
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 553 C 11.116 0.155 562.170
value [ib w/ ib iv, ql w/ ib iv] 11.116 11.137 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.116 11.109 -0.007
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 553 C 11.108 0.155 562.160
value [ib w/ ib iv, ql w/ ib iv] 11.108 11.129 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.108 11.101 -0.007
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 553 C 11.104 0.155 562.155
value [ib w/ ib iv, ql w/ ib iv] 11.104 11.126 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.104 11.097 -0.007
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 553 C 11.108 0.155 562.160
value [ib w/ ib iv, ql w/ ib iv] 11.108 11.129 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.108 11.101 -0.007
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 559 C 6.442 0.140 562.170
value [ib w/ ib iv, ql w/ ib iv] 6.442 6.458 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.442 6.438 -0.004
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 559 C 6.436 0.140 562.160
value [ib w/ ib iv, ql w/ ib iv] 6.436 6.452 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.436 6.432 -0.004
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 559 C 6.433 0.140 562.155
value [ib w/ ib iv, ql w/ ib iv] 6.433 6.449 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.433 6.429 -0.004
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 559 C 6.436 0.140 562.160
value [ib w/ ib iv, ql w/ ib iv] 6.436 6.452 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.436 6.432 -0.004
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:18 SPY 20240920 559 C 6.423 0.140 562.140
value [ib w/ ib iv, ql w/ ib iv] 6.423 6.439 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.423 6.419 -0.004
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 532 P 0.276 0.219 562.170
value [ib w/ ib iv, ql w/ ib iv] 0.276 0.273 -0.003
iv [ib model iv, ql iv from ib model value] 0.219 0.231 0.012
value [ib model, ql value from ql iv of ib value] 0.276 0.356 0.079
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 532 P 0.277 0.219 562.160
value [ib w/ ib iv, ql w/ ib iv] 0.277 0.274 -0.003
iv [ib model iv, ql iv from ib model value] 0.219 0.231 0.012
value [ib model, ql value from ql iv of ib value] 0.277 0.356 0.079
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 532 P 0.277 0.219 562.155
value [ib w/ ib iv, ql w/ ib iv] 0.277 0.274 -0.003
iv [ib model iv, ql iv from ib model value] 0.219 0.231 0.012
value [ib model, ql value from ql iv of ib value] 0.277 0.356 0.079
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 532 P 0.277 0.219 562.160
value [ib w/ ib iv, ql w/ ib iv] 0.277 0.274 -0.003
iv [ib model iv, ql iv from ib model value] 0.219 0.231 0.012
value [ib model, ql value from ql iv of ib value] 0.277 0.356 0.079
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:08 SPY 20240920 541 P 0.544 0.188 562.190
value [ib w/ ib iv, ql w/ ib iv] 0.544 0.539 -0.004
iv [ib model iv, ql iv from ib model value] 0.188 0.201 0.013
value [ib model, ql value from ql iv of ib value] 0.544 0.700 0.157
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 541 P 0.545 0.188 562.170
value [ib w/ ib iv, ql w/ ib iv] 0.545 0.541 -0.004
iv [ib model iv, ql iv from ib model value] 0.188 0.201 0.013
value [ib model, ql value from ql iv of ib value] 0.545 0.702 0.157
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 541 P 0.546 0.188 562.160
value [ib w/ ib iv, ql w/ ib iv] 0.546 0.542 -0.005
iv [ib model iv, ql iv from ib model value] 0.188 0.201 0.013
value [ib model, ql value from ql iv of ib value] 0.546 0.703 0.157
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 541 P 0.547 0.188 562.155
value [ib w/ ib iv, ql w/ ib iv] 0.547 0.542 -0.005
iv [ib model iv, ql iv from ib model value] 0.188 0.201 0.013
value [ib model, ql value from ql iv of ib value] 0.547 0.704 0.157
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 541 P 0.546 0.188 562.160
value [ib w/ ib iv, ql w/ ib iv] 0.546 0.542 -0.005
iv [ib model iv, ql iv from ib model value] 0.188 0.201 0.013
value [ib model, ql value from ql iv of ib value] 0.546 0.703 0.157
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 548 P 1.071 0.167 562.170
value [ib w/ ib iv, ql w/ ib iv] 1.071 1.053 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.183 0.016
value [ib model, ql value from ql iv of ib value] 1.071 1.360 0.289
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 548 P 1.073 0.167 562.160
value [ib w/ ib iv, ql w/ ib iv] 1.073 1.054 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.183 0.016
value [ib model, ql value from ql iv of ib value] 1.073 1.362 0.289
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 548 P 1.074 0.167 562.155
value [ib w/ ib iv, ql w/ ib iv] 1.074 1.055 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.183 0.016
value [ib model, ql value from ql iv of ib value] 1.074 1.363 0.289
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 548 P 1.073 0.167 562.160
value [ib w/ ib iv, ql w/ ib iv] 1.073 1.054 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.183 0.016
value [ib model, ql value from ql iv of ib value] 1.073 1.362 0.289
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:18 SPY 20240920 548 P 1.076 0.167 562.140
value [ib w/ ib iv, ql w/ ib iv] 1.076 1.057 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.183 0.016
value [ib model, ql value from ql iv of ib value] 1.076 1.366 0.290
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:08 SPY 20240920 553 P 1.827 0.155 562.190
value [ib w/ ib iv, ql w/ ib iv] 1.827 1.809 -0.018
iv [ib model iv, ql iv from ib model value] 0.155 0.173 0.018
value [ib model, ql value from ql iv of ib value] 1.827 2.274 0.446
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 553 P 1.832 0.155 562.170
value [ib w/ ib iv, ql w/ ib iv] 1.832 1.814 -0.017
iv [ib model iv, ql iv from ib model value] 0.155 0.173 0.018
value [ib model, ql value from ql iv of ib value] 1.832 2.279 0.447
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 553 P 1.834 0.155 562.160
value [ib w/ ib iv, ql w/ ib iv] 1.834 1.817 -0.017
iv [ib model iv, ql iv from ib model value] 0.155 0.173 0.018
value [ib model, ql value from ql iv of ib value] 1.834 2.281 0.448
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 553 P 1.835 0.155 562.155
value [ib w/ ib iv, ql w/ ib iv] 1.835 1.818 -0.017
iv [ib model iv, ql iv from ib model value] 0.155 0.173 0.018
value [ib model, ql value from ql iv of ib value] 1.835 2.283 0.448
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 553 P 1.834 0.155 562.160
value [ib w/ ib iv, ql w/ ib iv] 1.834 1.817 -0.017
iv [ib model iv, ql iv from ib model value] 0.155 0.173 0.018
value [ib model, ql value from ql iv of ib value] 1.834 2.281 0.448
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 559 P 3.458 0.140 562.170
value [ib w/ ib iv, ql w/ ib iv] 3.458 3.422 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.164 0.024
value [ib model, ql value from ql iv of ib value] 3.458 4.170 0.712
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 559 P 3.463 0.140 562.160
value [ib w/ ib iv, ql w/ ib iv] 3.463 3.427 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.164 0.024
value [ib model, ql value from ql iv of ib value] 3.463 4.175 0.712
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 559 P 3.465 0.140 562.155
value [ib w/ ib iv, ql w/ ib iv] 3.465 3.429 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.164 0.024
value [ib model, ql value from ql iv of ib value] 3.465 4.178 0.713
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 559 P 3.463 0.140 562.160
value [ib w/ ib iv, ql w/ ib iv] 3.463 3.427 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.164 0.024
value [ib model, ql value from ql iv of ib value] 3.463 4.175 0.712
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:18 SPY 20240920 559 P 3.472 0.140 562.140
value [ib w/ ib iv, ql w/ ib iv] 3.472 3.435 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.164 0.024
value [ib model, ql value from ql iv of ib value] 3.472 4.185 0.713
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.721 s
[INFO] Finished at: 2024-09-15T12:47:26-04:00
[INFO] ------------------------------------------------------------------------
```
Main class
```
import java.util.List;
import org.quantlib.Actual365Fixed;
import org.quantlib.AmericanExercise;
import org.quantlib.BlackConstantVol;
import org.quantlib.BlackScholesMertonProcess;
import org.quantlib.BlackVolTermStructureHandle;
import org.quantlib.Calendar;
import org.quantlib.DateParser;
import org.quantlib.DayCounter;
import org.quantlib.DividendSchedule;
import org.quantlib.Exercise;
import org.quantlib.FdBlackScholesVanillaEngine;
import org.quantlib.FixedDividend;
import org.quantlib.FlatForward;
import org.quantlib.PlainVanillaPayoff;
import org.quantlib.QuoteHandle;
import org.quantlib.Settings;
import org.quantlib.SimpleQuote;
import org.quantlib.UnitedStates;
import org.quantlib.VanillaOption;
import org.quantlib.YieldTermStructureHandle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class IVError {
public static void main(String[] args) {
double riskFreeRate = 0.0533;
DayCounter dayCounter = new Actual365Fixed();
Calendar calendar = new UnitedStates(UnitedStates.Market.NYSE);
// data obtained 9/13/2024 for SPY
FixedDividend fixedDividend = new FixedDividend(1.76, DateParser.parseFormatted("20240920", "%Y%m%d"));
DividendSchedule dividendSchedule = new DividendSchedule();
dividendSchedule.add(fixedDividend);
List<Observation> obs = Observation.readData();
logger.info(String.format("loaded %d observations", obs.size()));
for (Observation o : obs) {
PlainVanillaPayoff payoff = new PlainVanillaPayoff(o.optType(), o.strike());
Exercise americanExercise = new AmericanExercise(o.evalDate(), o.expiryDate());
VanillaOption americanOption = new VanillaOption(payoff, americanExercise);
Settings.instance().setEvaluationDate(o.evalDate());
QuoteHandle underlyingH = new QuoteHandle(new SimpleQuote(o.underValue()));
YieldTermStructureHandle flatDividendYield = new YieldTermStructureHandle(
new FlatForward(o.evalDate(), 0, dayCounter));
YieldTermStructureHandle flatTermStructure = new YieldTermStructureHandle(
new FlatForward(o.evalDate(), riskFreeRate, dayCounter));
BlackVolTermStructureHandle flatVolatility = new BlackVolTermStructureHandle(
new BlackConstantVol(o.evalDate(), calendar, o.modelIV(), dayCounter));
BlackScholesMertonProcess stochasticProcess = new BlackScholesMertonProcess(underlyingH, flatDividendYield,
flatTermStructure, flatVolatility);
// price option using IBKR model IV
americanOption.setPricingEngine(new FdBlackScholesVanillaEngine(stochasticProcess, dividendSchedule));
double qlnpv_ibiv = americanOption.NPV();
// obtain implied volatility for IBKR model value
double qliv = americanOption.impliedVolatility(o.modelValue(), stochasticProcess);
// price option using QL implied volatility for IBKR model value
flatVolatility = new BlackVolTermStructureHandle(
new BlackConstantVol(o.evalDate(), calendar, qliv, dayCounter));
stochasticProcess = new BlackScholesMertonProcess(underlyingH, flatDividendYield,
flatTermStructure, flatVolatility);
americanOption.setPricingEngine(new FdBlackScholesVanillaEngine(stochasticProcess, dividendSchedule));
double qlnpv_qliv = americanOption.NPV();
String a = String.format("\t%-50s %8.3f %8.3f %8.3f", "value [ib w/ ib iv, ql w/ ib iv]",o.modelValue(),qlnpv_ibiv,qlnpv_ibiv-o.modelValue());
String b = String.format("\t%-50s %8.3f %8.3f %8.3f", "iv [ib model iv, ql iv from ib model value]",o.modelIV(),qliv,qliv-o.modelIV());
String c = String.format("\t%-50s %8.3f %8.3f %8.3f", "value [ib model, ql value from ql iv of ib value]",o.modelValue(),qlnpv_qliv,qlnpv_qliv-o.modelValue());
logger.info("data: "+o.toString()+"\n" + a + "\n" + b + "\n" + c + "\n");
}
}
private static Logger logger = LoggerFactory.getLogger(IVError.class);
}
```
Data
```
package cc.qpm.app;
import java.util.ArrayList;
import java.util.List;
import org.quantlib.Date;
import org.quantlib.DateParser;
import org.quantlib.Option;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Observation {
public Observation(Object[] d) {
int i = 0;
modelDateTime = (String) d[i++];
symbol = (String) d[i++];
expiry = (String) d[i++];
strike = (double) (int) d[i++];
right = (String) d[i++];
modelValue = (double) d[i++];
modelIV = (double) d[i++];
underValue = (double) d[i++];
}
public static List<Observation> readData() {
List<Observation> obs = new ArrayList<>();
for (Object[] d : data) {
obs.add(new Observation(d));
logger.debug(obs.get(obs.size() - 1).toString());
}
return obs;
}
public String toString() {
return String.format("%s %s %s %d %s %7.3f %.3f %.3f", modelDateTime, symbol, expiry, (int) strike, right,
modelValue, modelIV, underValue);
}
private static Object[][] data = {
{ "20240913 14:05:09", "SPY", "20240920", 532, "C", 30.8963, 0.219, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 532, "C", 30.8867, 0.219, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 532, "C", 30.8819, 0.219, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 532, "C", 30.8867, 0.219, 562.160 },
{ "20240913 14:05:08", "SPY", "20240920", 541, "C", 22.1220, 0.188, 562.190 },
{ "20240913 14:05:09", "SPY", "20240920", 541, "C", 22.1032, 0.188, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 541, "C", 22.0938, 0.188, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 541, "C", 22.0891, 0.188, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 541, "C", 22.0938, 0.188, 562.160 },
{ "20240913 14:05:09", "SPY", "20240920", 548, "C", 15.5102, 0.167, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 548, "C", 15.5014, 0.167, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 548, "C", 15.4970, 0.167, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 548, "C", 15.5014, 0.167, 562.160 },
{ "20240913 14:05:18", "SPY", "20240920", 548, "C", 15.4838, 0.167, 562.140 },
{ "20240913 14:05:08", "SPY", "20240920", 553, "C", 11.1315, 0.155, 562.190 },
{ "20240913 14:05:09", "SPY", "20240920", 553, "C", 11.1157, 0.155, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 553, "C", 11.1078, 0.155, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 553, "C", 11.1038, 0.155, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 553, "C", 11.1078, 0.155, 562.160 },
{ "20240913 14:05:09", "SPY", "20240920", 559, "C", 6.44227, 0.140, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 559, "C", 6.43585, 0.140, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 559, "C", 6.43267, 0.140, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 559, "C", 6.43585, 0.140, 562.160 },
{ "20240913 14:05:18", "SPY", "20240920", 559, "C", 6.42303, 0.140, 562.140 },
{ "20240913 14:05:09", "SPY", "20240920", 532, "P", 0.276421, 0.219, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 532, "P", 0.276821, 0.219, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 532, "P", 0.277018, 0.219, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 532, "P", 0.276821, 0.219, 562.160 },
{ "20240913 14:05:08", "SPY", "20240920", 541, "P", 0.543506, 0.188, 562.190 },
{ "20240913 14:05:09", "SPY", "20240920", 541, "P", 0.545269, 0.188, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 541, "P", 0.546150, 0.188, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 541, "P", 0.546586, 0.188, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 541, "P", 0.546150, 0.188, 562.160 },
{ "20240913 14:05:09", "SPY", "20240920", 548, "P", 1.07105, 0.167, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 548, "P", 1.07274, 0.167, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 548, "P", 1.07358, 0.167, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 548, "P", 1.07274, 0.167, 562.160 },
{ "20240913 14:05:18", "SPY", "20240920", 548, "P", 1.07613, 0.167, 562.140 },
{ "20240913 14:05:08", "SPY", "20240920", 553, "P", 1.82722, 0.155, 562.190 },
{ "20240913 14:05:09", "SPY", "20240920", 553, "P", 1.83171, 0.155, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 553, "P", 1.83396, 0.155, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 553, "P", 1.83507, 0.155, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 553, "P", 1.83396, 0.155, 562.160 },
{ "20240913 14:05:09", "SPY", "20240920", 559, "P", 3.45848, 0.140, 562.170 },
{ "20240913 14:05:13", "SPY", "20240920", 559, "P", 3.46284, 0.140, 562.160 },
{ "20240913 14:05:15", "SPY", "20240920", 559, "P", 3.46500, 0.140, 562.155 },
{ "20240913 14:05:16", "SPY", "20240920", 559, "P", 3.46284, 0.140, 562.160 },
{ "20240913 14:05:18", "SPY", "20240920", 559, "P", 3.47154, 0.140, 562.140 }
};
private String modelDateTime; public Date evalDate() {return DateParser.parseFormatted(modelDateTime.split(" ")[0], "%Y%m%d");}
private String symbol; public String symbol() {return symbol;}
private String expiry; public Date expiryDate() {return DateParser.parseFormatted(expiry, "%Y%m%d");}
private double strike; public double strike() {return strike;}
private String right; public Option.Type optType() {return right.equalsIgnoreCase("C")? Option.Type.Call : Option.Type.Put;}
private double modelValue; public double modelValue() {return modelValue;}
private double modelIV; public double modelIV() {return modelIV;}
private double underValue; public double underValue() {return underValue;}
private static Logger logger = LoggerFactory.getLogger(Observation.class);
}
```
## Answer by krkeane (score 0, accepted)
https://quant.stackexchange.com/a/80623
There was an error in my test code.
`diff` output comparing original-incorrect and updated-revised code is:
```
// obtain implied volatility for IBKR model value
- double qliv = americanOption.impliedVolatility(o.modelValue(), stochasticProcess);
+ double qliv = americanOption.impliedVolatility(o.modelValue(), stochasticProcess, dividendSchedule);
```
Note I needed to provide the `dividendSchedule`.
All test cases now show a zero difference for the sanity-check: $$f\left(f^{-1}\left(\textrm{option-value}\right)\right) - \textrm{option-value}~.$$
Revised output:
```
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< cc.qpm.app:tickOptionComputation >------------------
[INFO] Building tickOptionComputation 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec:3.4.1:java (default-cli) @ tickOptionComputation ---
SLF4J(I): Connected with provider of type [org.slf4j.simple.SimpleServiceProvider]
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - loaded 48 observations
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 532 C 30.896 0.219 562.170
value [ib w/ ib iv, ql w/ ib iv] 30.896 30.921 0.024
iv [ib model iv, ql iv from ib model value] 0.219 0.214 -0.005
value [ib model, ql value from ql iv of ib value] 30.896 30.896 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 532 C 30.887 0.219 562.160
value [ib w/ ib iv, ql w/ ib iv] 30.887 30.911 0.024
iv [ib model iv, ql iv from ib model value] 0.219 0.214 -0.005
value [ib model, ql value from ql iv of ib value] 30.887 30.887 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 532 C 30.882 0.219 562.155
value [ib w/ ib iv, ql w/ ib iv] 30.882 30.906 0.024
iv [ib model iv, ql iv from ib model value] 0.219 0.214 -0.005
value [ib model, ql value from ql iv of ib value] 30.882 30.882 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 532 C 30.887 0.219 562.160
value [ib w/ ib iv, ql w/ ib iv] 30.887 30.911 0.024
iv [ib model iv, ql iv from ib model value] 0.219 0.214 -0.005
value [ib model, ql value from ql iv of ib value] 30.887 30.887 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:08 SPY 20240920 541 C 22.122 0.188 562.190
value [ib w/ ib iv, ql w/ ib iv] 22.122 22.149 0.027
iv [ib model iv, ql iv from ib model value] 0.188 0.185 -0.003
value [ib model, ql value from ql iv of ib value] 22.122 22.122 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 541 C 22.103 0.188 562.170
value [ib w/ ib iv, ql w/ ib iv] 22.103 22.130 0.027
iv [ib model iv, ql iv from ib model value] 0.188 0.185 -0.003
value [ib model, ql value from ql iv of ib value] 22.103 22.103 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 541 C 22.094 0.188 562.160
value [ib w/ ib iv, ql w/ ib iv] 22.094 22.121 0.027
iv [ib model iv, ql iv from ib model value] 0.188 0.185 -0.003
value [ib model, ql value from ql iv of ib value] 22.094 22.094 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 541 C 22.089 0.188 562.155
value [ib w/ ib iv, ql w/ ib iv] 22.089 22.116 0.027
iv [ib model iv, ql iv from ib model value] 0.188 0.185 -0.003
value [ib model, ql value from ql iv of ib value] 22.089 22.089 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 541 C 22.094 0.188 562.160
value [ib w/ ib iv, ql w/ ib iv] 22.094 22.121 0.027
iv [ib model iv, ql iv from ib model value] 0.188 0.185 -0.003
value [ib model, ql value from ql iv of ib value] 22.094 22.094 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 548 C 15.510 0.167 562.170
value [ib w/ ib iv, ql w/ ib iv] 15.510 15.529 0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.166 -0.001
value [ib model, ql value from ql iv of ib value] 15.510 15.510 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 548 C 15.501 0.167 562.160
value [ib w/ ib iv, ql w/ ib iv] 15.501 15.521 0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.166 -0.001
value [ib model, ql value from ql iv of ib value] 15.501 15.501 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 548 C 15.497 0.167 562.155
value [ib w/ ib iv, ql w/ ib iv] 15.497 15.516 0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.166 -0.001
value [ib model, ql value from ql iv of ib value] 15.497 15.497 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 548 C 15.501 0.167 562.160
value [ib w/ ib iv, ql w/ ib iv] 15.501 15.521 0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.166 -0.001
value [ib model, ql value from ql iv of ib value] 15.501 15.501 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:18 SPY 20240920 548 C 15.484 0.167 562.140
value [ib w/ ib iv, ql w/ ib iv] 15.484 15.503 0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.166 -0.001
value [ib model, ql value from ql iv of ib value] 15.484 15.484 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:08 SPY 20240920 553 C 11.132 0.155 562.190
value [ib w/ ib iv, ql w/ ib iv] 11.132 11.153 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.132 11.131 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 553 C 11.116 0.155 562.170
value [ib w/ ib iv, ql w/ ib iv] 11.116 11.137 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.116 11.115 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 553 C 11.108 0.155 562.160
value [ib w/ ib iv, ql w/ ib iv] 11.108 11.129 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.108 11.107 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 553 C 11.104 0.155 562.155
value [ib w/ ib iv, ql w/ ib iv] 11.104 11.126 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.104 11.103 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 553 C 11.108 0.155 562.160
value [ib w/ ib iv, ql w/ ib iv] 11.108 11.129 0.022
iv [ib model iv, ql iv from ib model value] 0.155 0.154 -0.001
value [ib model, ql value from ql iv of ib value] 11.108 11.107 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 559 C 6.442 0.140 562.170
value [ib w/ ib iv, ql w/ ib iv] 6.442 6.458 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.442 6.442 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 559 C 6.436 0.140 562.160
value [ib w/ ib iv, ql w/ ib iv] 6.436 6.452 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.436 6.435 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 559 C 6.433 0.140 562.155
value [ib w/ ib iv, ql w/ ib iv] 6.433 6.449 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.433 6.432 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 559 C 6.436 0.140 562.160
value [ib w/ ib iv, ql w/ ib iv] 6.436 6.452 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.436 6.435 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:18 SPY 20240920 559 C 6.423 0.140 562.140
value [ib w/ ib iv, ql w/ ib iv] 6.423 6.439 0.016
iv [ib model iv, ql iv from ib model value] 0.140 0.139 -0.001
value [ib model, ql value from ql iv of ib value] 6.423 6.423 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 532 P 0.276 0.219 562.170
value [ib w/ ib iv, ql w/ ib iv] 0.276 0.273 -0.003
iv [ib model iv, ql iv from ib model value] 0.219 0.219 0.000
value [ib model, ql value from ql iv of ib value] 0.276 0.276 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 532 P 0.277 0.219 562.160
value [ib w/ ib iv, ql w/ ib iv] 0.277 0.274 -0.003
iv [ib model iv, ql iv from ib model value] 0.219 0.219 0.000
value [ib model, ql value from ql iv of ib value] 0.277 0.277 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 532 P 0.277 0.219 562.155
value [ib w/ ib iv, ql w/ ib iv] 0.277 0.274 -0.003
iv [ib model iv, ql iv from ib model value] 0.219 0.219 0.000
value [ib model, ql value from ql iv of ib value] 0.277 0.277 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 532 P 0.277 0.219 562.160
value [ib w/ ib iv, ql w/ ib iv] 0.277 0.274 -0.003
iv [ib model iv, ql iv from ib model value] 0.219 0.219 0.000
value [ib model, ql value from ql iv of ib value] 0.277 0.277 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:08 SPY 20240920 541 P 0.544 0.188 562.190
value [ib w/ ib iv, ql w/ ib iv] 0.544 0.539 -0.004
iv [ib model iv, ql iv from ib model value] 0.188 0.188 0.000
value [ib model, ql value from ql iv of ib value] 0.544 0.544 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 541 P 0.545 0.188 562.170
value [ib w/ ib iv, ql w/ ib iv] 0.545 0.541 -0.004
iv [ib model iv, ql iv from ib model value] 0.188 0.188 0.000
value [ib model, ql value from ql iv of ib value] 0.545 0.546 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 541 P 0.546 0.188 562.160
value [ib w/ ib iv, ql w/ ib iv] 0.546 0.542 -0.005
iv [ib model iv, ql iv from ib model value] 0.188 0.188 0.000
value [ib model, ql value from ql iv of ib value] 0.546 0.546 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 541 P 0.547 0.188 562.155
value [ib w/ ib iv, ql w/ ib iv] 0.547 0.542 -0.005
iv [ib model iv, ql iv from ib model value] 0.188 0.188 0.000
value [ib model, ql value from ql iv of ib value] 0.547 0.547 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 541 P 0.546 0.188 562.160
value [ib w/ ib iv, ql w/ ib iv] 0.546 0.542 -0.005
iv [ib model iv, ql iv from ib model value] 0.188 0.188 0.000
value [ib model, ql value from ql iv of ib value] 0.546 0.546 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 548 P 1.071 0.167 562.170
value [ib w/ ib iv, ql w/ ib iv] 1.071 1.053 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.168 0.001
value [ib model, ql value from ql iv of ib value] 1.071 1.071 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 548 P 1.073 0.167 562.160
value [ib w/ ib iv, ql w/ ib iv] 1.073 1.054 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.168 0.001
value [ib model, ql value from ql iv of ib value] 1.073 1.073 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 548 P 1.074 0.167 562.155
value [ib w/ ib iv, ql w/ ib iv] 1.074 1.055 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.168 0.001
value [ib model, ql value from ql iv of ib value] 1.074 1.073 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 548 P 1.073 0.167 562.160
value [ib w/ ib iv, ql w/ ib iv] 1.073 1.054 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.168 0.001
value [ib model, ql value from ql iv of ib value] 1.073 1.073 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:18 SPY 20240920 548 P 1.076 0.167 562.140
value [ib w/ ib iv, ql w/ ib iv] 1.076 1.057 -0.019
iv [ib model iv, ql iv from ib model value] 0.167 0.168 0.001
value [ib model, ql value from ql iv of ib value] 1.076 1.076 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:08 SPY 20240920 553 P 1.827 0.155 562.190
value [ib w/ ib iv, ql w/ ib iv] 1.827 1.809 -0.018
iv [ib model iv, ql iv from ib model value] 0.155 0.156 0.001
value [ib model, ql value from ql iv of ib value] 1.827 1.827 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 553 P 1.832 0.155 562.170
value [ib w/ ib iv, ql w/ ib iv] 1.832 1.814 -0.017
iv [ib model iv, ql iv from ib model value] 0.155 0.156 0.001
value [ib model, ql value from ql iv of ib value] 1.832 1.831 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 553 P 1.834 0.155 562.160
value [ib w/ ib iv, ql w/ ib iv] 1.834 1.817 -0.017
iv [ib model iv, ql iv from ib model value] 0.155 0.156 0.001
value [ib model, ql value from ql iv of ib value] 1.834 1.834 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 553 P 1.835 0.155 562.155
value [ib w/ ib iv, ql w/ ib iv] 1.835 1.818 -0.017
iv [ib model iv, ql iv from ib model value] 0.155 0.156 0.001
value [ib model, ql value from ql iv of ib value] 1.835 1.835 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 553 P 1.834 0.155 562.160
value [ib w/ ib iv, ql w/ ib iv] 1.834 1.817 -0.017
iv [ib model iv, ql iv from ib model value] 0.155 0.156 0.001
value [ib model, ql value from ql iv of ib value] 1.834 1.834 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:09 SPY 20240920 559 P 3.458 0.140 562.170
value [ib w/ ib iv, ql w/ ib iv] 3.458 3.422 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.141 0.001
value [ib model, ql value from ql iv of ib value] 3.458 3.458 -0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:13 SPY 20240920 559 P 3.463 0.140 562.160
value [ib w/ ib iv, ql w/ ib iv] 3.463 3.427 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.141 0.001
value [ib model, ql value from ql iv of ib value] 3.463 3.463 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:15 SPY 20240920 559 P 3.465 0.140 562.155
value [ib w/ ib iv, ql w/ ib iv] 3.465 3.429 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.141 0.001
value [ib model, ql value from ql iv of ib value] 3.465 3.465 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:16 SPY 20240920 559 P 3.463 0.140 562.160
value [ib w/ ib iv, ql w/ ib iv] 3.463 3.427 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.141 0.001
value [ib model, ql value from ql iv of ib value] 3.463 3.463 0.000
[cc.qpm.app.IVError.main()] INFO cc.qpm.app.IVError - data: 20240913 14:05:18 SPY 20240920 559 P 3.472 0.140 562.140
value [ib w/ ib iv, ql w/ ib iv] 3.472 3.435 -0.036
iv [ib model iv, ql iv from ib model value] 0.140 0.141 0.001
value [ib model, ql value from ql iv of ib value] 3.472 3.472 0.000
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.692 s
[INFO] Finished at: 2024-09-16T13:13:32-04:00
[INFO] ------------------------------------------------------------------------
```Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.