option-chain-analytics 5.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. option_chain_analytics-5.2.1/CHANGELOG.md +242 -0
  2. option_chain_analytics-5.2.1/CITATION.cff +20 -0
  3. option_chain_analytics-5.2.1/CODE_OF_CONDUCT.md +24 -0
  4. option_chain_analytics-5.2.1/CONTRIBUTING.md +54 -0
  5. option_chain_analytics-5.2.1/LICENSE +21 -0
  6. option_chain_analytics-5.2.1/MANIFEST.in +18 -0
  7. option_chain_analytics-5.2.1/PKG-INFO +581 -0
  8. option_chain_analytics-5.2.1/README.md +515 -0
  9. option_chain_analytics-5.2.1/RELEASING.md +51 -0
  10. option_chain_analytics-5.2.1/SECURITY.md +24 -0
  11. option_chain_analytics-5.2.1/docs/comparison.md +16 -0
  12. option_chain_analytics-5.2.1/docs/conf.py +35 -0
  13. option_chain_analytics-5.2.1/docs/data_sources.md +239 -0
  14. option_chain_analytics-5.2.1/docs/first_success.md +26 -0
  15. option_chain_analytics-5.2.1/docs/index.md +27 -0
  16. option_chain_analytics-5.2.1/docs/point_in_time.md +51 -0
  17. option_chain_analytics-5.2.1/docs/queries.md +46 -0
  18. option_chain_analytics-5.2.1/docs/schema.md +56 -0
  19. option_chain_analytics-5.2.1/examples/README.md +51 -0
  20. option_chain_analytics-5.2.1/examples/build_thetadata_eod_cache.py +146 -0
  21. option_chain_analytics-5.2.1/examples/fetch_thetadata_atm_timeseries.py +309 -0
  22. option_chain_analytics-5.2.1/examples/fetch_thetadata_eod.py +267 -0
  23. option_chain_analytics-5.2.1/examples/first_success.py +68 -0
  24. option_chain_analytics-5.2.1/examples/run_chain_report.py +86 -0
  25. option_chain_analytics-5.2.1/pyproject.toml +162 -0
  26. option_chain_analytics-5.2.1/setup.cfg +4 -0
  27. option_chain_analytics-5.2.1/src/option_chain_analytics/__init__.py +62 -0
  28. option_chain_analytics-5.2.1/src/option_chain_analytics/conventions.py +81 -0
  29. option_chain_analytics-5.2.1/src/option_chain_analytics/data/__init__.py +46 -0
  30. option_chain_analytics-5.2.1/src/option_chain_analytics/data/bloomberg.py +9 -0
  31. option_chain_analytics-5.2.1/src/option_chain_analytics/data/cache.py +171 -0
  32. option_chain_analytics-5.2.1/src/option_chain_analytics/data/cboe.py +887 -0
  33. option_chain_analytics-5.2.1/src/option_chain_analytics/data/deribit.py +339 -0
  34. option_chain_analytics-5.2.1/src/option_chain_analytics/data/loaders.py +92 -0
  35. option_chain_analytics-5.2.1/src/option_chain_analytics/data/simulated.py +182 -0
  36. option_chain_analytics-5.2.1/src/option_chain_analytics/data/tardis.py +499 -0
  37. option_chain_analytics-5.2.1/src/option_chain_analytics/data/thetadata.py +802 -0
  38. option_chain_analytics-5.2.1/src/option_chain_analytics/data/thetadata_cache.py +447 -0
  39. option_chain_analytics-5.2.1/src/option_chain_analytics/local_path.py +61 -0
  40. option_chain_analytics-5.2.1/src/option_chain_analytics/option_chain.py +993 -0
  41. option_chain_analytics-5.2.1/src/option_chain_analytics/option_data.py +271 -0
  42. option_chain_analytics-5.2.1/src/option_chain_analytics/reconstruction.py +148 -0
  43. option_chain_analytics-5.2.1/src/option_chain_analytics/utils/__init__.py +13 -0
  44. option_chain_analytics-5.2.1/src/option_chain_analytics/utils/forward_discount.py +211 -0
  45. option_chain_analytics-5.2.1/src/option_chain_analytics/utils/portfolio_payoff.py +94 -0
  46. option_chain_analytics-5.2.1/src/option_chain_analytics/utils/roll_maturities.py +190 -0
  47. option_chain_analytics-5.2.1/src/option_chain_analytics/visuals/__init__.py +3 -0
  48. option_chain_analytics-5.2.1/src/option_chain_analytics/visuals/chain_report.py +57 -0
  49. option_chain_analytics-5.2.1/src/option_chain_analytics/visuals/plots.py +264 -0
  50. option_chain_analytics-5.2.1/src/option_chain_analytics/visuals/slices.py +130 -0
  51. option_chain_analytics-5.2.1/src/option_chain_analytics.egg-info/PKG-INFO +581 -0
  52. option_chain_analytics-5.2.1/src/option_chain_analytics.egg-info/SOURCES.txt +72 -0
  53. option_chain_analytics-5.2.1/src/option_chain_analytics.egg-info/dependency_links.txt +1 -0
  54. option_chain_analytics-5.2.1/src/option_chain_analytics.egg-info/requires.txt +42 -0
  55. option_chain_analytics-5.2.1/src/option_chain_analytics.egg-info/top_level.txt +1 -0
  56. option_chain_analytics-5.2.1/tests/conftest.py +5 -0
  57. option_chain_analytics-5.2.1/tests/test_cboe_loader.py +318 -0
  58. option_chain_analytics-5.2.1/tests/test_chain_loading.py +135 -0
  59. option_chain_analytics-5.2.1/tests/test_chain_report_example.py +19 -0
  60. option_chain_analytics-5.2.1/tests/test_example_entrypoints.py +50 -0
  61. option_chain_analytics-5.2.1/tests/test_first_success.py +11 -0
  62. option_chain_analytics-5.2.1/tests/test_implied_forwards.py +70 -0
  63. option_chain_analytics-5.2.1/tests/test_local_path_defaults.py +58 -0
  64. option_chain_analytics-5.2.1/tests/test_module_layout.py +199 -0
  65. option_chain_analytics-5.2.1/tests/test_option_chain.py +30 -0
  66. option_chain_analytics-5.2.1/tests/test_project_metadata.py +83 -0
  67. option_chain_analytics-5.2.1/tests/test_public_module_cleanup.py +52 -0
  68. option_chain_analytics-5.2.1/tests/test_simulated_data.py +111 -0
  69. option_chain_analytics-5.2.1/tests/test_thetadata_cache_example.py +196 -0
  70. option_chain_analytics-5.2.1/tests/test_thetadata_example.py +47 -0
  71. option_chain_analytics-5.2.1/tests/test_thetadata_loader.py +267 -0
  72. option_chain_analytics-5.2.1/tests/test_thetadata_timeseries_example.py +89 -0
  73. option_chain_analytics-5.2.1/tools/generate_readme_figures.py +237 -0
  74. option_chain_analytics-5.2.1/tools/verify_distribution.py +163 -0
@@ -0,0 +1,242 @@
1
+ # Changelog
2
+
3
+ All notable public changes to OptionChainAnalytics are recorded here.
4
+
5
+ ## [Unreleased]
6
+
7
+ ## [5.2.1] - 2026-09-08
8
+
9
+ ### Added
10
+
11
+ - Added explicit stack dependency and optional-import boundary checks, including
12
+ isolated maintainer adapters, plus a fresh Python 3.10 lowest-direct dependency CI lane.
13
+
14
+ - Added tag-driven PyPI Trusted Publishing with release-identity and distribution
15
+ validation; creating a GitHub Release remains optional.
16
+
17
+ - Added a lowest-dependency CI variant for the optional `bloomberg` extra, with
18
+ core-import isolation checks that do not require live Bloomberg access.
19
+
20
+ ### Changed
21
+
22
+ - Aligned package summaries, software citations, README navigation, and documentation
23
+ landing pages with the canonical package identity and Read the Docs documentation.
24
+
25
+ - Pointed package documentation metadata to the Read the Docs root and replaced
26
+ the legacy GitHub Pages documentation build with redirects.
27
+
28
+ ## [5.2.0] - 2026-08-24
29
+
30
+ ### Added
31
+
32
+ - `ChainTs.load_price_data` returns a selected and optionally resampled underlying series from
33
+ the `spot_data` panel linked to the same option-chain history.
34
+
35
+ ### Removed
36
+
37
+ - Retired the contributor-facing `dev` extra in favor of PEP 735 dependency groups:
38
+ `test` for pytest and Python 3.10 TOML support, and `lint` for Ruff. The user-facing
39
+ provider, documentation, and aggregate extras remain available.
40
+
41
+ ## [5.1.0] - 2026-08-22
42
+
43
+ ### Changed
44
+
45
+ - Component development diagnostics now live beside their owning modules in source-only
46
+ `run_local/*_run.py` namespace folders and use the `Locals` / `run_local(local=...)` contract.
47
+ - Runnable examples use the same dispatcher names while remaining broader repository workflows;
48
+ automated pytest modules remain centralized under `tests/`.
49
+ - Wheel and source-distribution verification reject development runners.
50
+
51
+ ## [5.0.0] - 2026-08-20
52
+
53
+ ### Added
54
+
55
+ - `create_chain_at_time` is the canonical exact/previous point-in-time reconstruction function.
56
+ - `option_chain_analytics.option_data`, `.conventions`, and `.reconstruction` provide explicit
57
+ homes for normalized containers, shared conventions, and chain reconstruction.
58
+ - `examples/build_thetadata_eod_cache.py` now exposes `create_thetadata_options_data`, which builds
59
+ or resumes monthly ThetaData partitions and returns the complete history as one `OptionsDataDFs`.
60
+
61
+ ### Changed
62
+
63
+ - `create_chain_timeseries` now accepts the clearly named `options_data` input and delegates each
64
+ scheduled observation to `create_chain_at_time` without changing the no-look-ahead policy.
65
+ - Provider-independent call-put parity forward/discount inference moved from the one-file
66
+ `fitters` package to `option_chain_analytics.utils.forward_discount`.
67
+ - Provider loading is split by responsibility across `data.cache`, `data.cboe`, `data.tardis`,
68
+ `data.deribit`, and `data.loaders`; package-root `DataSource` and `ts_data_loader_wrapper` remain
69
+ unchanged.
70
+ - The provider modules now document their data ownership, timestamp, quote-unit, cache, and
71
+ optional-dependency boundaries in detail. The README includes an installed-package ThetaData
72
+ workflow from resumable cache construction through rolling ATM/skew plots and an exact-date
73
+ multi-expiry chain report.
74
+ - All tracked runnable examples now use the maintainer-standard `LocalTests` enum and
75
+ `run_local_test(local_test=...)` dispatcher entry point.
76
+ - Normalized CBOE, Tardis EOD, and ThetaData caches now resolve through `OCA_CACHE_PATH`, defaulting
77
+ to the ignored repository `resources/` directory. `OCA_DATA_PATH` remains the separate root for
78
+ raw provider archives, while custom CBOE/Tardis directories retain co-located caches.
79
+ - The root and examples READMEs now provide the authoritative six-example inventory, including
80
+ each workflow's data prerequisite, network behavior, output, and cache-first command sequence.
81
+
82
+ ### Fixed
83
+
84
+ - ATM call/put and volatility queries now fall back to the nearest valid quote on each option side
85
+ when a provider reports asymmetric strike grids, avoiding failures in otherwise valid ThetaData
86
+ histories.
87
+
88
+ ### Removed
89
+
90
+ - Removed the canonical and historical compatibility module paths named `chain_loader_from_ts.py`,
91
+ `chain_ts.py`, and `config.py`.
92
+ - Removed `create_chain_from_from_options_dfs` and its doubled-`from` public name.
93
+ - Removed the research helpers `generate_atm_vols_skew` and `generate_vol_delta_ts`; rolled
94
+ empirical analytics now live in their downstream SVM examples and SigmaStrats research code.
95
+ - Removed the CCXT exchange adapter and integration surface; exchange-specific spot and funding
96
+ retrieval now belongs to downstream research applications rather than OCA.
97
+ - Removed the maintainer-only combined local-cache CLI from tracked public examples; the ignored
98
+ `prop/` copy remains available for private CBOE and Tardis archives.
99
+ - Removed the now-empty `option_chain_analytics.fitters` module path without a compatibility shim.
100
+ - Removed the monolithic `option_chain_analytics.ts_loaders` module path; provider-specific imports
101
+ now use their owning `option_chain_analytics.data` modules.
102
+ - Removed the legacy approximate LogSV smile fitter and its embedded OCA report/demo module after
103
+ migrating the provider-independent analytics to `stochvolmodels.fitters` and updating
104
+ SigmaStrats to import the synthetic grid-price helper from SVM.
105
+ - Removed obsolete Bloomberg-surface, legacy crypto-volatility/funding, option-portfolio bump, and
106
+ duplicate CBOE-cache examples. The retained examples now use deterministic data, standardized
107
+ local caches, or explicit provider access.
108
+
109
+ ## [4.0.0] - 2026-08-19
110
+
111
+ ### Added
112
+
113
+ - `build_thetadata_eod_cache` and `load_thetadata_eod_cache` provide resumable monthly ThetaData
114
+ EOD Parquet partitions in OCA's canonical schema, including bounded report-date loading for
115
+ research workflows.
116
+ - ThetaData EOD loaders now retrieve the provider's `SOFR` history by default and use the latest
117
+ point-in-time rate as a flat continuously compounded discount anchor. Pass `rate_symbol=None`
118
+ to retain parity-only estimation, or select another supported ThetaData rate symbol.
119
+ - `DataSource.TARDIS_EOD_LOCAL`, `build_local_tardis_eod_options_cache`, and
120
+ `load_local_tardis_eod_options_data` provide exact 08:00 UTC BTC/ETH daily caches from local
121
+ hourly Tardis archives, including exact-time Deribit index prices and source fingerprints.
122
+ - `examples/build_local_options_caches.py` builds SPX, VIX, BTC, and ETH caches in one command.
123
+ - `DataSource.THETADATA_EOD`, `load_thetadata_eod_options_data`,
124
+ `load_thetadata_eod_options_timeseries`, and `map_thetadata_eod_options_data` provide point-in-time
125
+ normalization of ThetaData national EOD equity and ETF option reports.
126
+ - The optional `thetadata` integration extra and a credential-free deterministic example provide
127
+ an opt-in authenticated live mode and selectable ATM-volatility or delta-skew output.
128
+ - A callable ThetaData EOD time-series example builds `OptionsDataDFs`, reconstructs exact
129
+ point-in-time chains, extracts rolling ATM volatility and delta skew, and produces Matplotlib
130
+ plots for either metric.
131
+
132
+ ### Changed
133
+
134
+ - The ThetaData ATM/skew and chain-report examples now default to the local SPY cache; authenticated
135
+ live history remains an explicit opt-in path.
136
+ - CBOE SPX and VIX cache conversion now replaces legacy fitted terms with robust parity forwards
137
+ and discounts plus `vanilla-option-pricers` implied volatilities, delta, and vega. SPX is treated
138
+ as PM-settled SPXW at 16:00 New York; VIX uses its 09:30 morning SOQ convention.
139
+ - Normalized local caches now use schema version 3 and one physical `SliceColumn` schema across
140
+ SPX, VIX, BTC, and ETH: UTC timestamps, Arrow strings, and `float64` numerics. CBOE schema-2
141
+ caches must be rebuilt explicitly; metadata records the shared dtype policy and provider-specific
142
+ observation, settlement, analytics, price, and source-fingerprint policies.
143
+ - Call-put parity fitting now uses inverse-spread weights, Huber reweighting, enforced discount
144
+ bounds, and an optional externally supplied discount factor. The provider-neutral implementation
145
+ now lives in `option_chain_analytics.fitters.forward_discount`.
146
+ - ThetaData keeps provider policy in its adapter: SOFR selection, point-in-time report alignment,
147
+ rate staleness, US-equity/ETF scope, expiry timestamp, and provider-level discount bounds.
148
+ - ThetaData implied volatilities and Greeks continue to use `vanilla-option-pricers` exclusively;
149
+ provider IVs are not mixed into OCA's normalized analytics.
150
+ - ThetaData option reports preserve call/put contracts and raw bid/ask quotes while deriving
151
+ forwards and discounts from call-put parity and implied volatilities and Greeks through
152
+ `vanilla-option-pricers`.
153
+ - The optional ThetaData extra installs `python-dotenv`, which ThetaData 1.0.10 imports but does
154
+ not declare in its wheel metadata.
155
+
156
+ ### Fixed
157
+
158
+ - Chain reports now use current Matplotlib primitives for ATM annotations and open-interest
159
+ legends instead of removed `qis` helpers, and support filtered single-strike slices.
160
+
161
+ ### Removed
162
+
163
+ - Removed the unused and untested CVXPY quote fitter, the `fitters` optional extra, and CVXPY from
164
+ the `all` extra. Generic parity fitting remains part of the core installation.
165
+ - Removed the incomplete Yahoo snapshot adapter, its public lazy export, the `yahoo` extra, and the
166
+ `yfinance` dependency from `all`. The deterministic simulated-data and injected ThetaData-client
167
+ examples remain the credential-free workflows.
168
+
169
+ ## [3.0.0] - 2026-08-16
170
+
171
+ ### Changed
172
+
173
+ - Renamed the complete local SPX/VIX integration to CBOE terminology: the optional extra is now
174
+ `cboe`, the provider enum is `DataSource.CBOE_LOCAL`, and the loader and mapper are
175
+ `load_local_cboe_options_data` and `map_cboe_options_data`.
176
+ - Local files now resolve under `cboe_options/`, normalized caches identify themselves as
177
+ `option_chain_analytics.cboe.normalized`, and source attributes use `cboe_options`.
178
+
179
+ ### Removed
180
+
181
+ - Removed the pre-3.0 source-label API, extra, constants, cache identifier, and directory name.
182
+ Existing normalized SPX/VIX caches must be rebuilt once to receive the CBOE cache metadata.
183
+
184
+ ## [2.0.1] - 2026-08-16
185
+
186
+ ### Added
187
+
188
+ - `build_local_cboe_options_cache`, which streams source Feather batches into one validated,
189
+ compressed normalized Parquet cache per SPX/VIX underlying.
190
+ - Root `AGENTS.md` guidance covering point-in-time, provider, cache, licensing, dependency, and
191
+ release invariants for automated coding agents.
192
+
193
+ ### Changed
194
+
195
+ - Restored support for Python 3.10 and newer, with CI across Python 3.10-3.14 and Python 3.10
196
+ fallbacks in project and distribution metadata checks.
197
+ - CBOE normalisation now always derives bid/ask implied volatilities from source row prices using
198
+ the contemporaneous forward, discount factor, and time to maturity.
199
+ - `load_local_cboe_options_data` now prefers validated per-underlying Parquet caches while retaining
200
+ source parsing as the fallback and supporting filtered point-in-time loads.
201
+ - Point-in-time reconstruction now supports an explicit `previous` observation policy that can
202
+ only select data at or before the requested timestamp; exact selection remains the default.
203
+
204
+ ### Fixed
205
+
206
+ - Scheduled chain construction now records the actual selected observation time and cannot borrow
207
+ a later observation when the requested schedule timestamp is absent.
208
+ - Non-invertible CBOE quotes now produce `NaN` bid/ask IV rather than aborting normalization of a
209
+ complete cache build.
210
+
211
+ ## [2.0.0] - 2026-08-16
212
+
213
+ ### Added
214
+
215
+ - `generate_simulated_options_data`, a deterministic offline `OptionsDataDFs` fixture for tests,
216
+ examples, and documentation.
217
+ - A release-gating `examples/first_success.py` workflow and task-oriented Sphinx documentation.
218
+ - SPX/VIX CBOE fitted-chain mapping to the native option-panel schema.
219
+
220
+ ### Changed
221
+
222
+ - Adopted a `src/` package layout and moved repository-only scripts to root `examples/`.
223
+ - Raised the minimum supported Python version to 3.14.
224
+ - Consolidated package metadata in `pyproject.toml` and moved provider integrations to optional
225
+ extras so the offline data-container workflow does not install unrelated feeds.
226
+ - Made the MIT licence explicit and added `CITATION.cff`.
227
+ - Made provider modules lazy under `option_chain_analytics.data` so optional feeds are not imported
228
+ merely to use simulated data.
229
+ - Preserved the historical `option_chain_analytics.data.chain_ts`, `.config`, and
230
+ `.chain_loader_from_ts` import paths as compatibility modules for downstream research code.
231
+ - Local data and output paths now default to ignored repository directories and support
232
+ `OCA_DATA_PATH` and `OCA_OUTPUT_PATH` overrides.
233
+ - Corrected `NearestStrikeOnGrid.BELOW` and `ABOVE` to select the lower and upper grid values,
234
+ respectively; downstream SigmaStrats usage was updated to retain intended behavior.
235
+
236
+ ### Fixed
237
+
238
+ - Removed obsolete AWS PostgreSQL trial-account configuration and machine-specific settings.
239
+
240
+ ### Removed
241
+
242
+ - Legacy `setup.py` and `requirements.txt` metadata duplicated by `pyproject.toml`.
@@ -0,0 +1,20 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use this software, please cite it using the metadata from this file."
3
+ type: software
4
+ title: "option-chain-analytics: Point-in-time option-chain containers, feed normalisation, reconstruction, and queries for quantitative research"
5
+ version: 5.2.1
6
+ date-released: "2026-09-08"
7
+ authors:
8
+ - family-names: Sepp
9
+ given-names: Artur
10
+ orcid: "https://orcid.org/0000-0002-7038-1748"
11
+ repository-code: "https://github.com/ArturSepp/OptionChainAnalytics"
12
+ url: "https://pypi.org/project/option-chain-analytics/"
13
+ license: MIT
14
+ keywords:
15
+ - option-chains
16
+ - options-data
17
+ - implied-volatility
18
+ - quantitative-finance
19
+ - point-in-time-data
20
+ - python
@@ -0,0 +1,24 @@
1
+ # Code of Conduct
2
+
3
+ ## Our commitment
4
+
5
+ We are committed to a professional, welcoming, and harassment-free project for everyone,
6
+ regardless of background, identity, experience, or viewpoint.
7
+
8
+ Constructive participation includes being respectful, giving specific technical feedback,
9
+ acknowledging mistakes, protecting private information, and focusing disagreement on evidence and
10
+ the work. Harassment, threats, discriminatory language, personal attacks, sexualized conduct,
11
+ trolling, and publishing another person's private information are unacceptable.
12
+
13
+ ## Scope and enforcement
14
+
15
+ This policy applies in repository issues, pull requests, reviews, discussions, and other spaces
16
+ where someone represents the OptionChainAnalytics project. Maintainers may edit or remove content,
17
+ reject contributions, issue warnings, or temporarily or permanently restrict participation when
18
+ behavior violates this policy.
19
+
20
+ Report conduct concerns privately to `artursepp@gmail.com`. Reports will be reviewed fairly and the
21
+ privacy and safety of reporters will be respected. Do not use public issues for conduct reports.
22
+
23
+ This policy is informed by the [Contributor Covenant](https://www.contributor-covenant.org/),
24
+ version 2.1.
@@ -0,0 +1,54 @@
1
+ # Contributing to OptionChainAnalytics
2
+
3
+ Thank you for considering a contribution. OCA is intentionally focused on point-in-time
4
+ option-chain containers, feed normalisation, reconstruction, and queries. Pricing belongs in
5
+ `vanilla-option-pricers`; generic analytics and plotting belong in `qis`; strategy backtests and
6
+ paper-specific portfolio logic belong in their research repositories.
7
+
8
+ ## Before opening an issue
9
+
10
+ - Search existing issues and state the smallest reproducible task or defect.
11
+ - Do not attach proprietary, licensed, credentialed, or personally identifying data.
12
+ - For a data adapter, document the provider, access/licensing boundary, timezone, spot/forward
13
+ convention, quote units, multiplier, and missing-data behavior.
14
+ - Report security concerns privately as described in [SECURITY.md](SECURITY.md).
15
+
16
+ ## Development setup
17
+
18
+ OCA requires Python 3.10 or newer. The full test matrix covers Python 3.10 through 3.14.
19
+
20
+ ```bash
21
+ python -m venv .venv
22
+ python -m pip install -e ".[dev,docs]"
23
+ pytest -q
24
+ ruff check src tests examples tools docs/conf.py
25
+ sphinx-build -W -b html docs docs/_build/html
26
+ ```
27
+
28
+ Run `python examples/first_success.py` to verify the credential-free public path. Before submitting
29
+ a packaging change, also run:
30
+
31
+ ```bash
32
+ python -m build
33
+ python tools/verify_distribution.py dist
34
+ ```
35
+
36
+ Keep automated checks in `tests/test_*.py`. Put a component development diagnostic beside its
37
+ implementation in the nearest `src/option_chain_analytics/**/run_local/<subject>_run.py`, using
38
+ `Locals` and `run_local(local=...)`. These implicit namespace folders intentionally omit
39
+ `__init__.py` and are excluded from built distributions. Broader public workflows stay in
40
+ `examples/`.
41
+
42
+ ## Change requirements
43
+
44
+ - Preserve point-in-time behavior: code at observation time `t` must not use later observations.
45
+ - State volatility, rate, dividend, timezone, multiplier, and price conventions explicitly.
46
+ - Add focused tests for defects and public behavior. Numerical changes need an independent
47
+ reference or invariant, not merely a snapshot update.
48
+ - Update `CHANGELOG.md` for user-visible behavior and documentation.
49
+ - Keep local datasets, generated outputs, credentials, and agent reports in the ignored `data/`,
50
+ `outputs/`, and `agents/` directories.
51
+ - Keep pull requests focused; do not combine provider, schema, and strategy changes without a
52
+ clear reason.
53
+
54
+ By participating, you agree to follow the [Code of Conduct](CODE_OF_CONDUCT.md).
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Artur Sepp
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,18 @@
1
+ include CHANGELOG.md
2
+ include CITATION.cff
3
+ include CODE_OF_CONDUCT.md
4
+ include CONTRIBUTING.md
5
+ include LICENSE
6
+ include README.md
7
+ include RELEASING.md
8
+ include SECURITY.md
9
+ recursive-include docs *.md *.py
10
+ recursive-include docs *.txt *.xml
11
+ prune docs/_build
12
+ recursive-include examples *.md *.py
13
+ recursive-include tests *.py
14
+ recursive-include tools *.py
15
+ prune src/option_chain_analytics/run_local
16
+ prune src/option_chain_analytics/*/run_local
17
+ prune src/option_chain_analytics/*/*/run_local
18
+ prune src/option_chain_analytics/*/*/*/run_local