|
| 1 | +# Issue #237: Asian Option Pricing Model |
| 2 | + |
| 3 | +## Overview |
| 4 | + |
| 5 | +Asian options are path-dependent options where the payoff depends on the average price of the underlying asset over a specified period. This implementation will support both geometric and arithmetic averaging, with fixed and floating strike variants. |
| 6 | + |
| 7 | +## Implementation Phases |
| 8 | + |
| 9 | +### Phase 1: Core Data Model Verification |
| 10 | +- Verify `OptionType::Asian { averaging_type: AsianAveragingType }` exists |
| 11 | +- Ensure `AsianAveragingType` enum has Arithmetic and Geometric variants |
| 12 | +- Add any missing fields for fixed/floating strike distinction |
| 13 | + |
| 14 | +### Phase 2: Geometric Average Asian Option (Closed-Form) |
| 15 | +- Implement `geometric_asian_black_scholes()` in new `src/pricing/asian.rs` |
| 16 | +- Use adjusted Black-Scholes formula: |
| 17 | + - Adjusted volatility: `σ_adj = σ / √3` |
| 18 | + - Adjusted rate: `r_adj = (r + σ²/6) / 2` for the cost-of-carry adjustment |
| 19 | +- Support both call and put options |
| 20 | + |
| 21 | +### Phase 3: Arithmetic Average Asian Option |
| 22 | +- Implement Turnbull-Wakeman approximation for closed-form pricing |
| 23 | +- Match first two moments of arithmetic average to lognormal distribution |
| 24 | +- Fallback to Monte Carlo for higher accuracy if needed |
| 25 | + |
| 26 | +### Phase 4: Fixed vs Floating Strike |
| 27 | +- Fixed strike: payoff = max(Average - K, 0) for calls |
| 28 | +- Floating strike: payoff = max(S_T - Average, 0) for calls |
| 29 | +- Handle both variants in pricing functions |
| 30 | + |
| 31 | +### Phase 5: Integration |
| 32 | +- Route `OptionType::Asian` to new pricing functions in `black_scholes_model.rs` |
| 33 | +- Integrate with unified pricing API |
| 34 | + |
| 35 | +### Phase 6: Greeks |
| 36 | +- Use numerical Greeks from existing `src/greeks/numerical.rs` module |
| 37 | +- Route Asian options to numerical implementations in `equations.rs` |
| 38 | + |
| 39 | +### Phase 7: Testing |
| 40 | +- Test geometric average closed-form against known values |
| 41 | +- Test arithmetic approximation accuracy |
| 42 | +- Verify put-call parity relationships |
| 43 | +- Edge cases: zero volatility, zero time, extreme averaging periods |
| 44 | + |
| 45 | +### Phase 8: Documentation |
| 46 | +- Add docstrings and examples |
| 47 | +- Document formula sources and limitations |
| 48 | + |
| 49 | +## Technical Notes |
| 50 | + |
| 51 | +### Geometric Average Closed-Form |
| 52 | +For a geometric average Asian call: |
| 53 | +``` |
| 54 | +C = S * e^((b_adj - r) * T) * N(d1) - K * e^(-r * T) * N(d2) |
| 55 | +``` |
| 56 | +where: |
| 57 | +- `σ_adj = σ / √3` |
| 58 | +- `b_adj = 0.5 * (r - q - σ²/6)` |
| 59 | + |
| 60 | +### Turnbull-Wakeman Approximation |
| 61 | +Matches moments of the arithmetic average to a lognormal distribution. |
| 62 | + |
| 63 | +## Dependencies |
| 64 | + |
| 65 | +- Existing Black-Scholes infrastructure |
| 66 | +- Numerical Greeks module |
| 67 | + |
| 68 | +## Files to Modify/Create |
| 69 | + |
| 70 | +- `src/pricing/asian.rs` - NEW: Asian option pricing functions |
| 71 | +- `src/pricing/mod.rs` - Export new module |
| 72 | +- `src/pricing/black_scholes_model.rs` - Route Asian to new functions |
| 73 | +- `src/greeks/equations.rs` - Route to numerical Greeks |
| 74 | + |
| 75 | +## Estimated Effort |
| 76 | + |
| 77 | +8-12 hours |
0 commit comments