pair-trade-screener
Statistical arbitrage tool for identifying and analyzing pair trading opportunities. Detects cointegrated stock pairs within sectors, analyzes spread behavior, calculates z-scores, and provides entry/exit recommendations for market-neutral strategies. Use when user requests pair trading opportunitie
By tradermonty · 2,220 installs
npx skills add tradermonty/claude-trading-skills --skill pair-trade-screener
Source repository · Upstream listing
Pair Trade Screener
Overview
This skill identifies and analyzes statistical arbitrage opportunities through pair trading. Pair trading is a market neutral strategy that profits from the relative price movements of two correlated securities, regardless of overall market direction. The skill uses rigorous statistical methods including correlation analysis and cointegration testing to find robust trading pairs.
Core Methodology:
Identify pairs of stocks with high correlation and similar sector/industry exposure
Test for cointegration (long term statistical relationship)
Calculate spread z scores to identify mean reversion opportunities
Generate entry/exit signals based on statistical thresholds
Provide position sizing for market neutral exposure
Key Advantages:
Market neutral: Profits in up, down, or sideways markets
Risk management: Limited exposure to broad market movements
Statistical foundation: Data driven, not discretionary
Diversification: Uncorrelated to traditional long only strategies
When to Use This Skill
Use this skill when:
User asks for "pair trading opportunities"
User wants "market neutral strategies"
User requests "statistical arbitrage screening"
User asks "which stocks move together?"
User wants to hedge sector exposure
User requests mean reversion trade ideas
User asks about relative value trading
Example user requests:
"Find pair trading opportunities in the tech sector"
"Which stocks are cointegrated?"
"Screen for statistical arbitrage opportunities"
"Find mean reversion pairs"
"What are good market neutral trades right now?"
Prerequisites
Python 3.9 or newer
An FMP API key with access to the company screener and historical price endpoints
statsmodels =0.14,<0.15 for ADF and autoregression calculations
Set the API key without placing it on the command line or in a committed file:
Run the scripts from the repository root with the statistical dependency isolated
to the command:
Analysis Workflow
Step 1: Define Pair Universe
Objective: Establish the pool of stocks to analyze for pair relationships.
Option A: Sector Based Screening (Recommended)
Select a specific sector to screen:
Technology
Financials
Healthcare
Consumer Discretionary
Industrials
Energy
Materials
Consumer Staples
Utilities
Real Estate
Communication Services
Option B: Custom Stock List
User provides specific tickers to analyze:
Option C: Industry Specific
Narrow focus to specific industry within sector:
Example: "Software" within Technology sector
Example: "Regional Banks" within Financials
Filtering Criteria:
Minimum market cap: $2B (mid cap and above)
Minimum average volume: 1M shares/day (liquidity requirement)
Active trading: No delisted or inactive stocks
Same exchange preference: Avoid cross exchange complications
Step 2: Retrieve Historical Price Data
Objective: Fetch price history for correlation and cointegration analysis.
Data Requirements:
Timeframe: 2 years (minimum 252 trading days)
Frequency: Daily closing prices
Adjustments: Adjusted for splits and dividends
Clean data: No gaps or missing values
FMP API Endpoint:
Data Validation:
Verify consistent date ranges across all symbols
Remove stocks with 10% missing data
Fill minor gaps with forward fill method
Log data quality issues
Script Execution:
Step 3: Calculate Correlation and Beta
Objective: Identify candidate pairs with strong linear relationships.
Correlation Analysis:
For each pair of stocks (i, j) in the universe:
1. Calculate Pearson correlation coefficient (ρ)
2. Calculate rolling correlation (90 day window) for stability check
3. Filter pairs with ρ = 0.70 (strong positive correlation)
Correlation Interpretation:
ρ = 0.90: Very strong correlation (best candidates)
ρ 0.70 0.90: Strong correlation (good candidates)
ρ 0.50 0.70: Moderate correlation (marginal)
ρ < 0.50: Weak correlation (exclude)
Beta Calculation:
For each candidate pair (Stock A, Stock B):
Beta indicates the hedge ratio:
Beta = 1.0: Equal dollar amounts
Beta = 1.5: $1.50 of B for every $1.00 of A
Beta = 0.8: $0.80 of B for every $1.00 of A
Correlation Stability Check:
Calculate correlation over multiple periods (6mo, 1yr, 2yr)
Require correlation to be stable (not deteriorating)
Flag pairs where recent correlation < historical correlation by 0.15
Step 4: Cointegration Testing
Objective: Statistically validate long term equilibrium relationship.
Why Cointegration Matters:
Correlation measures short term co movement
Cointegration proves long term equilibrium relationship
Cointegrated pairs mean revert predictably
Non cointegrated pairs may diverge permanently
Augmented Dickey Fuller (ADF) Test:
For each correlated pair:
1. Calculate spread: Spread = Price A (Beta × Price B)
2. Run ADF test on spread series
3. Check p value: p < 0.05 indicates cointegration (reject null hypothesis of unit root)
4. Extract ADF statistic for strength ranking
Cointegration Interpretation:
p value < 0.01: Very strong cointegration (★★★)
p value 0.01 0.05: Moderate cointegration (★★)
p value 0.05: No cointegration (exclude)
Half Life Calculation:
Estimate mean reversion speed:
Half life < 30 days: Fast mean reversion (good for short term trading)
Half life 30 60 days: Moderate speed (standard)
Half life 60 days: Slow mean reversion (long holding periods)
Python Implementation:
Step 5: Spread Analysis and Z Score Calculation
Objective: Quantify current spread deviation from equilibrium.
Spread Calculation:
Two common methods:
Method 1: Price Difference (Additive)
Best for: Stocks with similar price levels
Method 2: Price Ratio (Multiplicative)
Best for: Stocks with different price levels, easier interpretation
Z Score Calculation:
Measures how many standard deviations spread is from its mean:
Z Score Interpretation:
Z +2.0: Stock A expensive relative to B (short A, long B)
Z +1.5: Moderately expensive (watch for entry)
Z 1.5 to +1.5: Normal range (no trade)
Z < 1.5: Moderately cheap (watch for entry)
Z < 2.0: Stock A cheap relative to B (long A, short B)
Historical Spread Analysis:
Calculate mean and std dev over 90 day rolling window
Plot historical z score distribution
Identify maximum historical z score deviations
Check for structural breaks (spread regime change)
Step 6: Generate Entry/Exit Recommendations
Objective: Provide actionable trading signals with clear rules.
Entry Conditions:
Conservative Approach (Z ≥ ±2.0):
Aggressive Approach (Z ≥ ±1.5):
Lower threshold for more frequent trades
Higher win rate but smaller avg profit per trade
Requires tighter risk management
Exit Conditions:
Primary Exit: Mean Reversion (Z = 0)
Secondary Exit: Partial Profit Take
Stop Loss:
Time Based Exit:
Step 7: Position Sizing and Risk Management
Objective: Determine dollar amounts for market neutral exposure.
Market Neutral Sizing:
For a pair (Stock A, Stock B) with beta = β:
Equal Dollar Exposure:
Position Sizing Considerations:
Total pair allocation: 10 20% of portfolio per pair
Maximum pairs: 5 8 active pairs for diversification
Correlation across pairs: Avoid highly correlated pairs
Risk Metrics:
Maximum loss per pair: 2 3% of total portfolio
Stop loss trigger: Z score ±3.0 or 5% loss on spread
Portfolio level risk: Sum of all pair risks ≤ 10%
Step 8: Generate Pair Analysis Report
Objective: Create structured markdown report with findings and recommendations.
Report Sections:
1. Executive Summary
Total pairs analyzed
Number of cointegrated pairs found
Top 5 opportunities ranked by statistical strength
2. Cointegrated Pairs Table
Pair name (Stock A / Stock B)
Correlation coefficient
Cointegration p value
Current z score
Trade signal (Long/Short/None)
Half life
3. Detailed Analysis (Top 10 Pairs)
Pair description
Statistical metrics
Current spread position
Entry/exit recommendations
Position sizing
Risk assessment
4. Spread Charts (Text Based)
Historical z score plot (ASCII art)
Entry/exit levels marked
Current position indicator
5. Risk Warnings
Pairs with deteriorating correlation
Structural breaks detected
Low liquidity warnings
File Naming Convention:
Example: pair trade analysis Technology 2025 11 08.md
Output
find pairs.py creates the requested parent directory and writes one JSON object
with metadata and pairs keys. Each pair includes the correlation, hedge ratio,
ADF result, half life, current z score, signal, and generation timestamp. Progress
and a ranked summary are written to stdout. File system errors produce a concise
stderr message and a nonzero exit.
analyze spread.py writes a single pair statistical report to stdout and does not
create files. Both commands reject invalid or non finite thresholds, insufficient
lookback windows, and duplicate symbols before making API requests. Missing
statsmodels produces an install command on stderr without a traceback.
Quality Standards
Statistical Rigor
Minimum Requirements for Valid Pair:
✓ Correlation ≥ 0.70 over 2 year period
✓ Cointegration p value < 0.05 (ADF test)
✓ Spread stationarity confirmed
✓ Half life < 90 days
✓ No structural breaks in recent 6 months
Red Flags (Exclude Pair):
Correlation dropped 0.20 in recent 6 months
Cointegration p value 0.05
Half life increasing over time (mean reversion weakening)
Significant corporate events (merger, spin off, bankruptcy risk)
Liquidity concerns (avg volume < 500K shares/day)
Practical Considerations
Transaction Costs:
Assume 0.1% round trip cost per leg
Total cost per pair = 0.4% (entry + exit, both legs)
Minimum z score threshold should exceed transaction costs
Short Selling:
Verify stock is shortable (not hard to borrow)
Factor in short interest costs (borrow fees)
Monitor short squeeze risk
Execution:
Enter/exit both legs simultaneously (avoid leg risk)
Use limit orders to control slippage
Pre locate shorts before entry
Available Scripts
scripts/find pairs.py
Purpose: Screen for cointegrated pairs within a sector or custom list.
Usage:
Parameters:
sector : Sector name (Technology, Financials, etc.)
symbols : Comma separated list of tickers (alternative to sector)
min correlation : Minimum correlation threshold (default: 0.70)
min market cap : Minimum market cap filter (default: $2B)
lookback days : Historical data period (default: 730 days)
output : Output JSON file (default: pair analysis.json )
api key : FMP API key (or set FMP API KEY env var)
Output:
scripts/analyze spread.py
Purpose: Analyze a specific pair's spread behavior and generate trading signals.
Usage:
Parameters:
stock a : First stock ticker
stock b : Second stock ticker
lookback days : Analysis period (default: 365)
entry zscore : Z score threshold for entry (default: 2.0)
exit zscore : Z score threshold for exit (default: 0.0)
api key : FMP API key
Output:
Current spread analysis
Z score calculation
Entry/exit recommendations
Position sizing
Historical z score chart (text)
Reference Documentation
references/methodology.md
Comprehensive guide to statistical arbitrage and pair trading:
Pair Selection Criteria : How to identify good pair candidates
Statistical Tests : Correlation, cointegration, stationarity
Spread Construction : Price difference vs price ratio approaches
Mean Reversion : Half life calculation and interpretation
Risk Management : Position sizing, stop losses, diversification
Common Pitfalls : Survivorship bias, look ahead bias, overfitting
references/coin