Pair Trade Screener
by @veeramanikandanr48
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 opportunities, statistical arbitrage screening, mean-reversion strategies, or market-neutral portfolio construction. Supports correlation analysis, cointegration testing, and spread backtesting.
clawhub install pair-trade-screenerπ About This Skill
name: pair-trade-screener description: 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 opportunities, statistical arbitrage screening, mean-reversion strategies, or market-neutral portfolio construction. Supports correlation analysis, cointegration testing, and spread backtesting.
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:
Key Advantages:
When to Use This Skill
Use this skill when:
Example user requests:
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:
Option B: Custom Stock List
User provides specific tickers to analyze:
Example: ["AAPL", "MSFT", "GOOGL", "META", "NVDA"]
Option C: Industry-Specific
Narrow focus to specific industry within sector:
Filtering Criteria:
Step 2: Retrieve Historical Price Data
Objective: Fetch price history for correlation and cointegration analysis.
Data Requirements:
FMP API Endpoint:
GET /v3/historical-price-full/{symbol}?apikey=YOUR_API_KEY
Data Validation:
Script Execution:
python scripts/fetch_price_data.py --sector Technology --lookback 730
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:
Beta Calculation:
For each candidate pair (Stock A, Stock B):
Beta = Covariance(A, B) / Variance(B)
Beta indicates the hedge ratio:
Correlation Stability Check:
Step 4: Cointegration Testing
Objective: Statistically validate long-term equilibrium relationship.
Why Cointegration Matters:
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:
Half-Life Calculation:
Estimate mean-reversion speed:
Half-Life = -log(2) / log(mean_reversion_coefficient)
Python Implementation:
from statsmodels.tsa.stattools import adfullerCalculate spread
spread = price_a - (beta * price_b)ADF test
result = adfuller(spread)
adf_stat = result[0]
p_value = result[1]Interpret
is_cointegrated = p_value < 0.05
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)
Spread = Price_A - (Beta Γ Price_B)
Best for: Stocks with similar price levelsMethod 2: Price Ratio (Multiplicative)
Spread = Price_A / Price_B
Best for: Stocks with different price levels, easier interpretationZ-Score Calculation:
Measures how many standard deviations spread is from its mean:
Z-Score = (Current_Spread - Mean_Spread) / Std_Dev_Spread
Z-Score Interpretation:
Historical Spread Analysis:
Step 6: Generate Entry/Exit Recommendations
Objective: Provide actionable trading signals with clear rules.
Entry Conditions:
Conservative Approach (Z β₯ Β±2.0):
LONG Signal:
Z-score < -2.0 (spread 2+ std devs below mean)
Spread is mean-reverting (cointegration p < 0.05)
Half-life < 60 days
β Action: Buy Stock A, Short Stock B (hedge ratio = beta)SHORT Signal:
Z-score > +2.0 (spread 2+ std devs above mean)
Spread is mean-reverting (cointegration p < 0.05)
Half-life < 60 days
β Action: Short Stock A, Buy Stock B (hedge ratio = beta)
Aggressive Approach (Z β₯ Β±1.5):
Exit Conditions:
Primary Exit: Mean Reversion (Z = 0)
Exit when spread returns to mean (z-score crosses 0)
β Close both legs simultaneously
Secondary Exit: Partial Profit Take
Exit 50% when z-score reaches Β±1.0
Exit remaining 50% at z-score = 0
Stop Loss:
Exit if z-score extends beyond Β±3.0 (extreme divergence)
Risk: Possible structural break in relationship
Time-Based Exit:
Exit after 90 days if no mean-reversion
Prevents holding broken pairs indefinitely
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:
If portfolio size = $10,000 allocated to this pair:
Long $5,000 of Stock A
Short $5,000 Γ Ξ² of Stock B Example (Ξ² = 1.2):
Long $5,000 Stock A
Short $6,000 Stock B
β Market neutral, beta = 0
Position Sizing Considerations:
Risk Metrics:
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:
pair_trade_analysis_[SECTOR]_[YYYY-MM-DD].md
Example: pair_trade_analysis_Technology_2025-11-08.md
Quality Standards
Statistical Rigor
Minimum Requirements for Valid Pair:
Red Flags (Exclude Pair):
Practical Considerations
Transaction Costs:
Short Selling:
Execution:
Available Scripts
scripts/find_pairs.py
Purpose: Screen for cointegrated pairs within a sector or custom list.
Usage:
# Sector-based screening
python scripts/find_pairs.py --sector Technology --min-correlation 0.70Custom stock list
python scripts/find_pairs.py --symbols AAPL,MSFT,GOOGL,META --min-correlation 0.75Full options
python scripts/find_pairs.py \
--sector Financials \
--min-correlation 0.70 \
--min-market-cap 2000000000 \
--lookback-days 730 \
--output pairs_analysis.json
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: stdout)--api-key: FMP API key (or set FMP_API_KEY env var)Output:
[
{
"pair": "AAPL/MSFT",
"stock_a": "AAPL",
"stock_b": "MSFT",
"correlation": 0.87,
"beta": 1.15,
"cointegration_pvalue": 0.012,
"adf_statistic": -3.45,
"half_life_days": 42,
"current_zscore": -2.3,
"signal": "LONG",
"strength": "Strong"
}
]
scripts/analyze_spread.py
Purpose: Analyze a specific pair's spread behavior and generate trading signals.
Usage:
# Analyze specific pair
python scripts/analyze_spread.py --stock-a AAPL --stock-b MSFTCustom lookback period
python scripts/analyze_spread.py \
--stock-a JPM \
--stock-b BAC \
--lookback-days 365 \
--entry-zscore 2.0 \
--exit-zscore 0.5
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 keyOutput:
Reference Documentation
references/methodology.md
Comprehensive guide to statistical arbitrage and pair trading:
references/cointegration_guide.md
Deep dive into cointegration testing:
Integration with Other Skills
Sector Analyst Integration:
Technical Analyst Integration:
Backtest Expert Integration:
Market Environment Analysis Integration:
Portfolio Manager Integration:
Important Notes
Common Use Cases
Use Case 1: Technology Sector Pairs
User: "Find pair trading opportunities in tech stocks"Workflow:
1. Screen Technology sector for stocks with market cap > $10B
2. Calculate all pairwise correlations
3. Filter pairs with correlation β₯ 0.75
4. Run cointegration tests
5. Identify current z-score extremes (|z| > 2.0)
6. Generate top 10 pairs report
Use Case 2: Specific Pair Analysis
User: "Analyze AAPL and MSFT as a pair trade"Workflow:
1. Fetch 2-year price history for AAPL and MSFT
2. Calculate correlation and beta
3. Test for cointegration
4. Calculate current spread and z-score
5. Generate entry/exit recommendation
6. Provide position sizing guidance
Use Case 3: Regional Bank Pairs
User: "Screen for pairs among regional banks"Workflow:
1. Filter Financials sector for industry = "Regional Banks"
2. Exclude banks with <$5B market cap
3. Calculate pairwise statistics
4. Rank by cointegration strength
5. Focus on pairs with half-life < 45 days
6. Report top 5 mean-reverting pairs
Troubleshooting
Problem: No cointegrated pairs found
Solutions:
Problem: All z-scores near zero (no trade signals)
Solutions:
Problem: Pair correlation broke down
Solutions:
API Requirements
Resources
Version: 1.0 Last Updated: 2025-11-08 Dependencies: Python 3.8+, pandas, numpy, scipy, statsmodels, requests
π Tips & Best Practices
Problem: No cointegrated pairs found
Solutions:
Problem: All z-scores near zero (no trade signals)
Solutions:
Problem: Pair correlation broke down
Solutions: