Skip to content
All library documents

American Option Implied Volatility with Discrete Dividends

Article Quant Q&A · Author: krkeane

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.