Skip to content

Studies 138-157 — twenty varied teardowns: ML (Random Forest, AI ETF)… #17

Studies 138-157 — twenty varied teardowns: ML (Random Forest, AI ETF)…

Studies 138-157 — twenty varied teardowns: ML (Random Forest, AI ETF)… #17

Workflow file for this run

name: tests
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: pip
- name: Install dependencies
run: |
python -m pip install --upgrade pip
# Single dependency source of truth: pyproject.toml, installed through the
# requirements.txt alias (-e .[studies,dev]). That covers the engine, the
# econometrics/ML stack behind the studies (scipy/statsmodels/arch/scikit-learn)
# and pytest. The test-suite itself stays offline: network/real-data tests are
# cache-gated and skip when the cache is absent.
pip install -r requirements.txt
- name: Study-construction gate (every published study, same construction)
run: python tools/check_study_completeness.py
- name: Core engine test-suite (quantlab, offline, deterministic)
run: pytest -q
- name: Study 02 — Falling-Knife test-suite
run: pytest -q studies/02-falling-knife/tests
- name: Study 03 — Fear-Gauge test-suite
run: pytest -q studies/03-fear-gauge/tests
- name: Study 04 — Social-Oracle test-suite
run: pytest -q studies/04-social-oracle/tests
- name: Study 05 — Twin-Spread test-suite
run: pytest -q studies/05-twin-spread/tests
- name: Study 09 — Phantom-Kernel test-suite
run: pytest -q studies/09-phantom-kernel/tests
- name: Study 11 — Vanishing-Penny test-suite
run: pytest -q studies/11-vanishing-penny/tests
- name: Study 16 — Storm-Shy test-suite
run: pytest -q studies/16-storm-shy/tests
- name: Study 06 — Clockwork-Vol test-suite
run: pytest -q studies/06-clockwork-vol/tests
- name: Study 07 — Coiled-Spring test-suite
run: pytest -q studies/07-coiled-spring/tests
- name: Study 08 — True-Strength test-suite
run: pytest -q studies/08-true-strength/tests
- name: Study 10 — Markov-Mint test-suite
run: pytest -q studies/10-markov-mint/tests
- name: Study 12 — Paper-Prophet test-suite
run: pytest -q studies/12-paper-prophet/tests
- name: Study 13 — Crimson-Hour test-suite
run: pytest -q studies/13-crimson-hour/tests
- name: Study 14 — Gamma-Gospel test-suite
run: pytest -q studies/14-gamma-gospel/tests
- name: Study 15 — Sigma-Sleight test-suite
run: pytest -q studies/15-sigma-sleight/tests
- name: Study 17 — Glass-Ceiling test-suite
run: pytest -q studies/17-glass-ceiling/tests
- name: Study 18 — Dull-Roar test-suite
run: pytest -q studies/18-dull-roar/tests
- name: Study 19 — Rubber-Band test-suite
run: pytest -q studies/19-rubber-band/tests
- name: Study 20 — Freight-Train test-suite
run: pytest -q studies/20-freight-train/tests
- name: Study 21 — Fools-Gold test-suite
run: pytest -q studies/21-fools-gold/tests
- name: Study 22 — Crystal-Ball test-suite
run: pytest -q studies/22-crystal-ball/tests
- name: Study 23 — Broken-Tether test-suite
run: pytest -q studies/23-broken-tether/tests
- name: Study 24 — Stampede test-suite
run: pytest -q studies/24-stampede/tests
- name: Study 25 — Clean-Slate test-suite
run: pytest -q studies/25-clean-slate/tests
- name: Study 26 — Sand-Castle test-suite
run: pytest -q studies/26-sand-castle/tests
- name: Study 27 — Steamroller test-suite
run: pytest -q studies/27-steamroller/tests
- name: Study 28 — Carousel test-suite
run: pytest -q studies/28-carousel/tests
- name: Study 29 — Hedgers-Toll test-suite
run: pytest -q studies/29-hedgers-toll/tests
- name: Study 30 — House-Edge test-suite
run: pytest -q studies/30-house-edge/tests
- name: Study 31 — Trade-Winds test-suite
run: pytest -q studies/31-trade-winds/tests
- name: Study 32 — Rip-Tide test-suite
run: pytest -q studies/32-rip-tide/tests
- name: Study 33 — Slingshot test-suite
run: pytest -q studies/33-slingshot/tests
- name: Study 34 — Aftershock test-suite
run: pytest -q studies/34-aftershock/tests
- name: Study 35 — Contango test-suite
run: pytest -q studies/35-contango/tests
- name: Study 36 — Greenback test-suite
run: pytest -q studies/36-greenback/tests
- name: Study 37 — Barometer test-suite
run: pytest -q studies/37-barometer/tests
- name: Study 38 — Chorus test-suite
run: pytest -q studies/38-chorus/tests
- name: Study 39 — Black-Box test-suite
run: pytest -q studies/39-black-box/tests
- name: Study 40 — Paper-Tiger test-suite
run: pytest -q studies/40-paper-tiger/tests
- name: Study 41 — Hangover test-suite
run: pytest -q studies/41-hangover/tests
- name: Study 42 — Last-Call test-suite
run: pytest -q studies/42-last-call/tests
- name: Study 43 — Free-Lunch test-suite
run: pytest -q studies/43-free-lunch/tests
- name: Study 44 — Growth-Spurt test-suite
run: pytest -q studies/44-growth-spurt/tests
- name: Study 45 — Vanishing-Act test-suite
run: pytest -q studies/45-vanishing-act/tests
- name: Study 46 — Bargain-Bin test-suite
run: pytest -q studies/46-bargain-bin/tests
- name: Study 47 — Paper-Moon test-suite
run: pytest -q studies/47-paper-moon/tests
- name: Study 48 — Groundhog test-suite
run: pytest -q studies/48-groundhog/tests
- name: Study 49 — Black-Gold test-suite
run: pytest -q studies/49-black-gold/tests
- name: Study 50 — High-Water test-suite
run: pytest -q studies/50-high-water/tests
- name: Study 51 — Blue-Chip test-suite
run: pytest -q studies/51-blue-chip/tests
- name: Study 52 — Smoke-Screen test-suite
run: pytest -q studies/52-smoke-screen/tests
- name: Study 53 — Jackpot test-suite
run: pytest -q studies/53-jackpot/tests
- name: Study 54 — Static test-suite
run: pytest -q studies/54-static/tests
- name: Study 55 — Summer-Lull test-suite
run: pytest -q studies/55-summer-lull/tests
- name: Study 56 — Tide-Table test-suite
run: pytest -q studies/56-tide-table/tests
- name: Study 57 — Yield-Trap test-suite
run: pytest -q studies/57-yield-trap/tests
- name: Study 58 — Bunker test-suite
run: pytest -q studies/58-bunker/tests
- name: Study 59 — Downhill test-suite
run: pytest -q studies/59-downhill/tests
- name: Study 60 — Long-Shot test-suite
run: pytest -q studies/60-long-shot/tests
- name: Study 61 — Slow-Burn test-suite
run: pytest -q studies/61-slow-burn/tests
- name: Study 62 — Premium-Seller test-suite
run: pytest -q studies/62-premium-seller/tests
- name: Study 63 — Free-Fall test-suite
run: pytest -q studies/63-free-fall/tests
- name: Study 64 — Share-Shuffle test-suite
run: pytest -q studies/64-share-shuffle/tests
- name: Study 65 — Scorecard test-suite
run: pytest -q studies/65-scorecard/tests
- name: Study 66 — Inverted test-suite
run: pytest -q studies/66-inverted/tests
- name: Study 67 — Fed-Drift test-suite
run: pytest -q studies/67-fed-drift/tests
- name: Study 68 — All-Weather test-suite
run: pytest -q studies/68-all-weather/tests
- name: Study 69 — Safe-Haven test-suite
run: pytest -q studies/69-safe-haven/tests
- name: Study 70 — Digital-Gold test-suite
run: pytest -q studies/70-digital-gold/tests
- name: Study 71 — Ambush test-suite
run: pytest -q studies/71-ambush/tests
- name: Study 72 — Loaded-Dice test-suite
run: pytest -q studies/72-loaded-dice/tests
- name: Study 73 — First-Light test-suite
run: pytest -q studies/73-first-light/tests
- name: Study 74 — Mind-the-Gap test-suite
run: pytest -q studies/74-mind-the-gap/tests
- name: Study 75 — Knee-Jerk test-suite
run: pytest -q studies/75-knee-jerk/tests
- name: Study 76 — Rice-Paper test-suite
run: pytest -q studies/76-rice-paper/tests
- name: Study 77 — Golden-Mean test-suite
run: pytest -q studies/77-golden-mean/tests
- name: Study 78 — Crossed-Wires test-suite
run: pytest -q studies/78-crossed-wires/tests
- name: Study 79 — Sleigh-Ride test-suite
run: pytest -q studies/79-sleigh-ride/tests
- name: Study 80 — Cold-Open test-suite
run: pytest -q studies/80-cold-open/tests
- name: Study 81 — Four-Year-Itch test-suite
run: pytest -q studies/81-four-year-itch/tests
- name: Study 82 — Witching-Hour test-suite
run: pytest -q studies/82-witching-hour/tests
- name: Study 83 — Half-Life test-suite
run: pytest -q studies/83-half-life/tests
- name: Study 84 — Moon-Math test-suite
run: pytest -q studies/84-moon-math/tests
- name: Study 85 — Dr-Copper test-suite
run: pytest -q studies/85-dr-copper/tests
- name: Study 86 — Tail-Radar test-suite
run: pytest -q studies/86-tail-radar/tests
- name: Study 87 — Center-Line test-suite
run: pytest -q studies/87-center-line/tests
- name: Study 88 — Dogs-of-the-Dow test-suite
run: pytest -q studies/88-dogs-of-the-dow/tests
- name: Study 89 — Turn-of-the-Month test-suite
run: pytest -q studies/89-turn-of-the-month/tests
- name: Study 90 — Weekend test-suite
run: pytest -q studies/90-weekend/tests
- name: Study 91 — Death-Cross test-suite
run: pytest -q studies/91-death-cross/tests
- name: Study 92 — Easy-Money test-suite
run: pytest -q studies/92-easy-money/tests
- name: Study 93 — Round-Numbers test-suite
run: pytest -q studies/93-round-numbers/tests
- name: Study 94 — Level-Pegging test-suite
run: pytest -q studies/94-level-pegging/tests
- name: Study 95 — Holiday-Cheer test-suite
run: pytest -q studies/95-holiday-cheer/tests
- name: Study 96 — New-Year-Pop test-suite
run: pytest -q studies/96-new-year-pop/tests
- name: Study 97 — Balancing-Act test-suite
run: pytest -q studies/97-balancing-act/tests
- name: Study 98 — High-Noon test-suite
run: pytest -q studies/98-high-noon/tests
- name: Study 99 — Safety-Net test-suite
run: pytest -q studies/99-safety-net/tests
- name: Study 100 — Melting-Ice test-suite
run: pytest -q studies/100-melting-ice/tests
- name: Study 101 — Slow-and-Steady test-suite
run: pytest -q studies/101-slow-and-steady/tests
- name: Study 102 — Free-Rebalance test-suite
run: pytest -q studies/102-free-rebalance/tests
- name: Study 103 — Turtle-Trader test-suite
run: pytest -q studies/103-turtle-trader/tests
- name: Study 104 — Bollinger-Reversion test-suite
run: pytest -q studies/104-bollinger-reversion/tests
- name: Study 105 — Coppock-Curve test-suite
run: pytest -q studies/105-coppock-curve/tests
- name: Study 106 — Supertrend test-suite
run: pytest -q studies/106-supertrend/tests
- name: Study 107 — Stochastic-Oscillator test-suite
run: pytest -q studies/107-stochastic-oscillator/tests
- name: Study 108 — ADX-Filter test-suite
run: pytest -q studies/108-adx-filter/tests
- name: Study 109 — OBV-Divergence test-suite
run: pytest -q studies/109-obv-divergence/tests
- name: Study 110 — Faber-Timing test-suite
run: pytest -q studies/110-faber-timing/tests
- name: Study 111 — VIX-Term-Structure test-suite
run: pytest -q studies/111-vix-term-structure/tests
- name: Study 112 — Move-Index test-suite
run: pytest -q studies/112-move-index/tests
- name: Study 113 — Gold-Silver-Ratio test-suite
run: pytest -q studies/113-gold-silver-ratio/tests
- name: Study 114 — Dollar-Smile test-suite
run: pytest -q studies/114-dollar-smile/tests
- name: Study 115 — Credit-Spreads test-suite
run: pytest -q studies/115-credit-spreads/tests
- name: Study 116 — Power-Hour test-suite
run: pytest -q studies/116-power-hour/tests
- name: Study 117 — Pi-Cycle-Top test-suite
run: pytest -q studies/117-pi-cycle-top/tests
- name: Study 118 — Fed-Model test-suite
run: pytest -q studies/118-fed-model/tests
- name: Study 119 — Real-Rate-Regime test-suite
run: pytest -q studies/119-real-rate-regime/tests
- name: Study 120 — Excess-CAPE-Yield test-suite
run: pytest -q studies/120-excess-cape-yield/tests
- name: Study 121 — Magic-Formula test-suite
run: pytest -q studies/121-magic-formula/tests
- name: Study 122 — Gross-Profitability test-suite
run: pytest -q studies/122-gross-profitability/tests
- name: Study 123 — Altman-Z test-suite
run: pytest -q studies/123-altman-z/tests
- name: Study 124 — Cash-Flow-Yield test-suite
run: pytest -q studies/124-cash-flow-yield/tests
- name: Study 125 — Ichimoku-Cloud test-suite
run: pytest -q studies/125-ichimoku-cloud/tests
- name: Study 126 — Parabolic-SAR test-suite
run: pytest -q studies/126-parabolic-sar/tests
- name: Study 127 — Williams-R test-suite
run: pytest -q studies/127-williams-r/tests
- name: Study 128 — Keltner-Channel test-suite
run: pytest -q studies/128-keltner-channel/tests
- name: Study 129 — Heikin-Ashi test-suite
run: pytest -q studies/129-heikin-ashi/tests
- name: Study 130 — Vol-Risk-Premium test-suite
run: pytest -q studies/130-vol-risk-premium/tests
- name: Study 131 — Utilities-Canary test-suite
run: pytest -q studies/131-utilities-canary/tests
- name: Study 132 — Yield-Curve-Steepener test-suite
run: pytest -q studies/132-yield-curve-steepener/tests
- name: Study 133 — Crypto-Seasonality test-suite
run: pytest -q studies/133-crypto-seasonality/tests
- name: Study 134 — Bitcoin-Dominance test-suite
run: pytest -q studies/134-bitcoin-dominance/tests
- name: Study 135 — FOMC-Cycle test-suite
run: pytest -q studies/135-fomc-cycle/tests
- name: Study 136 — Mark-Twain test-suite
run: pytest -q studies/136-mark-twain/tests
- name: Study 137 — Mansfield-RS test-suite
run: pytest -q studies/137-mansfield-rs/tests
- name: Study 138 — Random-Forest test-suite
run: pytest -q studies/138-random-forest/tests
- name: Study 139 — AI-Powered-ETF test-suite
run: pytest -q studies/139-ai-powered-etf/tests
- name: Study 140 — Amihud-Illiquidity test-suite
run: pytest -q studies/140-amihud-illiquidity/tests
- name: Study 141 — Turnover-Anomaly test-suite
run: pytest -q studies/141-turnover-anomaly/tests
- name: Study 142 — Split-Drift test-suite
run: pytest -q studies/142-split-drift/tests
- name: Study 143 — Dividend-Capture test-suite
run: pytest -q studies/143-dividend-capture/tests
- name: Study 144 — Permanent-Portfolio test-suite
run: pytest -q studies/144-permanent-portfolio/tests
- name: Study 145 — Home-Bias test-suite
run: pytest -q studies/145-home-bias/tests
- name: Study 146 — Country-Momentum test-suite
run: pytest -q studies/146-country-momentum/tests
- name: Study 147 — FX-Momentum test-suite
run: pytest -q studies/147-fx-momentum/tests
- name: Study 148 — Lunar-Effect test-suite
run: pytest -q studies/148-lunar-effect/tests
- name: Study 149 — Daylight-Saving test-suite
run: pytest -q studies/149-daylight-saving/tests
- name: Study 150 — SAD-Effect test-suite
run: pytest -q studies/150-sad-effect/tests
- name: Study 151 — Stocks-For-Long-Run test-suite
run: pytest -q studies/151-stocks-for-long-run/tests
- name: Study 152 — Inflation-Hedge test-suite
run: pytest -q studies/152-inflation-hedge/tests
- name: Study 153 — Net-Operating-Assets test-suite
run: pytest -q studies/153-net-operating-assets/tests
- name: Study 154 — Leverage-Anomaly test-suite
run: pytest -q studies/154-leverage-anomaly/tests
- name: Study 155 — Asset-Turnover test-suite
run: pytest -q studies/155-asset-turnover/tests
- name: Study 156 — Martingale test-suite
run: pytest -q studies/156-martingale/tests
- name: Study 157 — Kelly-Sizing test-suite
run: pytest -q studies/157-kelly-sizing/tests
- name: Smoke-run the offline demos
run: |
python studies/01-overnight-anomaly/examples/run_synthetic_demo.py
python studies/71-ambush/examples/run_synthetic_demo.py
python studies/72-loaded-dice/examples/run_synthetic_demo.py
python studies/03-fear-gauge/examples/run_synthetic_demo.py
python studies/04-social-oracle/examples/run_synthetic_demo.py
python studies/05-twin-spread/examples/run_synthetic_demo.py
python studies/09-phantom-kernel/examples/run_synthetic_demo.py
python studies/11-vanishing-penny/examples/run_synthetic_demo.py
python studies/16-storm-shy/examples/run_synthetic_demo.py
python studies/30-house-edge/examples/run_synthetic_demo.py
python studies/31-trade-winds/examples/run_synthetic_demo.py
python studies/32-rip-tide/examples/run_synthetic_demo.py
python studies/33-slingshot/examples/run_synthetic_demo.py
python studies/34-aftershock/examples/run_synthetic_demo.py
python studies/35-contango/examples/run_synthetic_demo.py
python studies/36-greenback/examples/run_synthetic_demo.py
python studies/37-barometer/examples/run_synthetic_demo.py
python studies/38-chorus/examples/run_synthetic_demo.py
python studies/39-black-box/examples/run_synthetic_demo.py