QuantLearn
Trading Strategies
Awesome Oscillator
Technical momentum indicator measuring market momentum
Backtest Performance Analysis
Comparison testing shows Awesome Oscillator vs MACD performance characteristics and trade execution patterns.

Awesome Oscillator Trading Positions
Long and short position signals generated by both Saucer patterns and moving average crossovers, compared with MACD signals below.

Awesome Oscillator Values
Histogram showing AO values with red/green coloring based on Open vs Close prices, demonstrating momentum shifts.

Moving Average Components
5-period (fast) and 34-period (slow) moving averages of median prices showing crossover points for signal generation.

Portfolio Performance
Asset value comparison between Awesome Oscillator and MACD strategies, showing relative performance and drawdown periods.
Driving Force Theory
Awesome Oscillator measures the driving force of the market by comparing recent momentum to older momentum using the Bill Williams methodology.
Uses 5-period and 34-period simple moving averages of median prices (High+Low)/2, not closing prices.
The oscillator = 5-period SMA - 34-period SMA of median prices, creating a more stable momentum reading.
Positive values indicate bullish momentum; negative values indicate bearish momentum.
The strategy incorporates advanced "Saucer" pattern recognition for early signal detection before traditional moving average crossovers.
Red and green bar coloring based on Open vs Close prices provides additional momentum confirmation.
Mathematical Foundation
1Median Price Calculation
Median price uses the average of High and Low prices instead of Close price for more stable momentum measurement.
2Fast Simple Moving Average (5-period)
Short-term momentum using 5-period simple moving average of median prices.
3Slow Simple Moving Average (34-period)
Long-term momentum using 34-period simple moving average of median prices.
4Awesome Oscillator Value
The core oscillator value representing the difference between fast and slow momentum.
5Bar Color Determination
Bar coloring based on intraday price action for momentum confirmation.
6Saucer Pattern Conditions
Mathematical conditions for bearish saucer pattern: two consecutive green bars followed by red bar below zero line.
Advanced Signal Generation Algorithm
The Awesome Oscillator uses sophisticated pattern recognition beyond simple moving average crossovers, including Saucer patterns for early signal detection.
Moving Average Calculation
def awesome_ma(signals):
signals['awesome ma1'], signals['awesome ma2'] = 0, 0
signals['awesome ma1'] = ((signals['High'] + signals['Low']) / 2).rolling(window=5).mean()
signals['awesome ma2'] = ((signals['High'] + signals['Low']) / 2).rolling(window=34).mean()
return signalsCalculates 5-period and 34-period simple moving averages of median prices (High+Low)/2 instead of closing prices for more stable momentum reading.
Saucer Pattern Recognition
# Bearish Saucer: AO below zero line
if (signals['Open'][i] > signals['Close'][i] and
signals['Open'][i-1] < signals['Close'][i-1] and
signals['Open'][i-2] < signals['Close'][i-2] and
signals['awesome oscillator'][i-1] > signals['awesome oscillator'][i-2] and
signals['awesome oscillator'][i-1] < 0 and
signals['awesome oscillator'][i] < 0):
signals.at[i, 'awesome signals'] = 1
# Bullish Saucer: AO above zero line
if (signals['Open'][i] < signals['Close'][i] and
signals['Open'][i-1] > signals['Close'][i-1] and
signals['Open'][i-2] > signals['Close'][i-2] and
signals['awesome oscillator'][i-1] < signals['awesome oscillator'][i-2] and
signals['awesome oscillator'][i-1] > 0 and
signals['awesome oscillator'][i] > 0):
signals.at[i, 'awesome signals'] = -1Saucer patterns provide early signals before moving average crossovers. Bearish Saucer: two consecutive green bars followed by red bar below zero line. Bullish Saucer: opposite pattern above zero line.
Position Management with Duplicates Prevention
# Standard MA crossover signals with duplicate prevention
if signals['awesome ma1'][i] > signals['awesome ma2'][i]:
signals.at[i, 'awesome signals'] = 1
signals['cumsum'] = signals['awesome signals'].cumsum()
if signals['cumsum'][i] > 1:
signals.at[i, 'awesome signals'] = 0
if signals['awesome ma1'][i] < signals['awesome ma2'][i]:
signals.at[i, 'awesome signals'] = -1
signals['cumsum'] = signals['awesome signals'].cumsum()
if signals['cumsum'][i] < 0:
signals.at[i, 'awesome signals'] = 0Prevents duplicate signals when already in position. Uses cumulative sum to track current position state and avoid overtrading.
Implementation Steps
- 1Calculate median price = (High + Low) / 2 for each period
- 2Compute 5-period SMA of median prices (fast line)
- 3Compute 34-period SMA of median prices (slow line)
- 4Calculate AO = Fast SMA - Slow SMA
- 5Check for Saucer patterns: two consecutive bars of same color followed by opposite color
- 6Verify Saucer conditions: AO below zero for bearish, above zero for bullish saucers
- 7Generate standard MA crossover signals if no early Saucer signal exists
- 8Use cumulative sum to prevent duplicate signals when already in position
- 9Apply bar coloring based on Open vs Close for visual momentum confirmation
Key Metrics
Risk Considerations
Practice Implementation
Prerequisites
Mathematical Background
- • Linear regression and OLS estimation
- • Time series analysis (stationarity, unit roots)
- • Hypothesis testing and p-values
- • Basic econometrics (error correction models)
Technical Skills
- • Python programming (pandas, numpy)
- • Statistical libraries (statsmodels)
- • Data visualization (matplotlib)
- • Financial data handling (yfinance)
Complete Implementation
Access the full Python implementation from the original quantitative trading repository:
# Complete pair trading implementation
git clone https://github.com/je-suis-tm/quant-trading.git
cd quant-trading
python "Pair trading backtest.py"
# Modify tickers and parameters for your own analysisLearning Checkpoints
Understand Cointegration
Can you explain why two assets might be cointegrated and what breaks this relationship?
Interpret Statistical Tests
Practice reading ADF test results and understanding when to accept/reject cointegration.
Signal Generation
Implement Z-score calculations and understand threshold selection (±1σ vs ±2σ).
Risk Management
Understand position sizing, monitoring regime changes, and exit strategies.
Recommended Learning Path
Immediate Actions
- Download and run the Python script
- Test with different asset pairs
- Experiment with threshold parameters
Advanced Studies
- Learn Johansen cointegration test
- Study Vector Error Correction Models
- Explore multiple asset pair trading
Important Disclaimer
This strategy involves significant risk. Historical cointegration relationships can break permanently. Always use proper risk management, position sizing, and never risk more than you can afford to lose. Paper trade extensively before using real capital.