How to Write a Quant Strategy? From Idea to Code
Core Keywords: Quantitative Strategy, Strategy Development, Code Examples, Technical Indicators, Trading Logic
Hook: Good Strategy vs. Bad Strategy
You spent three months building the "perfect" strategy with 300% backtest returns, excited to go live—only to lose 20% in the first month. What went wrong?
Characteristics of Bad Strategies:
- Overfitted to historical data with no resilience to future market conditions
- Only entry logic without clear exits or risk management
- Arbitrary parameter settings without statistical validation
- Ignoring trading costs like fees and slippage
Characteristics of Good Strategies:
- Clean logic that survives across different market environments
- Integrated entry, exit, filters, and position sizing
- Validated through out-of-sample and stress testing
- Controllable risk with limited per-trade losses
Key Insight: A good quantitative strategy doesn't predict the future—it manages risk and expected value.
👉 Start Building Strategies with Sentinel — Free 14-day trial, no credit card required!
The 4 Core Elements of a Strategy
A complete trading strategy must include these four essential components:
| Element | Purpose | Examples | Criticality |
|---------|---------|----------|-------------|
| Entry Conditions | When to open a position | RSI < 30, MA crossover, breakout | Essential |
| Exit Conditions | When to close a position | Take-profit, stop-loss, time exit | Essential |
| Filter Conditions | Avoid low-quality signals | Trend filter, volatility filter | Important |
| Position Sizing | How much capital to allocate | Fixed %, Kelly Criterion, ATR-based | Essential |
1. Entry Conditions (Entry Signal)
Determines when to open a position. Common entry logics include:
- Technical indicator crossovers (e.g., golden cross)
- Price breakouts (breaking previous highs/lows)
- Statistical arbitrage (mean reversion of spreads)
- Machine learning prediction signals
Entry Condition Types
| Type | Logic Example | Best Market | Win Rate |
|------|--------------|-------------|----------|
| Breakout | Price > 20-day high | Trending | 35-45% |
| Mean Reversion | RSI < 30 | Ranging | 55-65% |
| Momentum | MACD histogram turns positive | Early trend | 40-50% |
| Pattern | Bullish engulfing candle | All | 45-55% |
2. Exit Conditions (Exit Signal)
Determines when to close a position. Includes two types:
- Take Profit: Reaching target price or condition
- Stop Loss: Hitting risk limit to protect capital
Exit Strategy Framework
| Exit Type | Trigger | Purpose | Typical Value |
|-----------|---------|---------|---------------|
| Stop Loss | Price moves against position | Limit losses | 2-5% of entry |
| Take Profit | Price reaches target | Lock in gains | 2:1 reward/risk |
| Time Stop | Position held too long | Free up capital | 5-20 bars |
| Trailing Stop | Price reverses from peak | Protect profits | 10-20% of peak |
| Signal Reversal | Opposite signal generated | Follow system | Varies |
3. Filter Conditions (Filter)
Used to filter low-quality signals and avoid trading in unfavorable environments:
- Trend filters: Only trade in bull/bear trends
- Volatility filters: Avoid low or extreme high volatility periods
- Time filters: Avoid major economic events or consolidation periods
Common Filter Types
| Filter | Implementation | Purpose |
|--------|---------------|---------|
| Trend Filter | Price > 200 MA | Only trade with trend |
| Volatility Filter | ATR < threshold | Avoid choppy markets |
| Volume Filter | Volume > average | Ensure liquidity |
| Time Filter | Avoid first/last hour | Skip volatile periods |
| Correlation Filter | Correlation < 0.7 | Avoid overlapping trades |
4. Position Sizing (Position Sizing)
Determines how much capital to allocate per trade:
| Method | Formula | Best For | Risk Level |
|--------|---------|----------|------------|
| Fixed Amount | $X per trade | Beginners, consistency | Low |
| Fixed Percentage | X% of capital per trade | Simple risk control | Medium |
| Volatility Adjusted | Based on ATR | Adapting to market conditions | Medium |
| Kelly Criterion | Optimal based on win rate | Mathematical optimization | High |
| Optimal f | Fractional Kelly variant | Balanced growth | Medium-High |
📚 Download Position Sizing Calculator — Free Excel template included!
Practical Example: RSI Overbought/Oversold Strategy
Here's a complete RSI mean reversion strategy written in Python with the Sentinel framework:
from sentinel import Strategy, Order
import pandas as pd
import numpy as np
class RSIMeanReversion(Strategy):
"""
RSI Overbought/Oversold Mean Reversion Strategy
Logic: Short when RSI > 70 (overbought), Long when RSI < 30 (oversold)
"""
def __init__(self):
super().__init__()
# Strategy parameters
self.rsi_period = 14
self.overbought = 70
self.oversold = 30
self.stop_loss_pct = 0.02 # 2% stop loss
self.take_profit_pct = 0.04 # 4% take profit
self.position_size = 0.1 # 10% capital per trade
def calculate_rsi(self, prices, period=14):
"""Calculate RSI indicator"""
deltas = np.diff(prices)
gains = np.where(deltas > 0, deltas, 0)
losses = np.where(deltas < 0, -deltas, 0)
avg_gain = np.mean(gains[:period])
avg_loss = np.mean(losses[:period])
for i in range(period, len(gains)):
avg_gain = (avg_gain * (period - 1) + gains[i]) / period
avg_loss = (avg_loss * (period - 1) + losses[i]) / period
rs = avg_gain / avg_loss if avg_loss != 0 else 0
rsi = 100 - (100 / (1 + rs))
return rsi
def on_bar(self, data):
"""Logic triggered on each bar"""
# Get historical prices
closes = data['close'].values
if len(closes) < self.rsi_period + 1:
return
# Calculate RSI
rsi = self.calculate_rsi(closes, self.rsi_period)
current_price = closes[-1]
# Trend filter: Only trade with clear trend
sma_50 = np.mean(closes[-50:])
sma_200 = np.mean(closes[-200:]) if len(closes) >= 200 else sma_50
# Volatility filter: Avoid extreme volatility
atr = self.calculate_atr(closes, 14)
avg_atr = np.mean([self.calculate_atr(closes[-i-14:-i], 14)
for i in range(1, 11)])
# Check current position
position = self.get_position()
# Entry logic
if position == 0:
# Oversold + Bullish trend + Normal volatility → Long
if (rsi < self.oversold and
sma_50 > sma_200 and
atr < avg_atr * 1.5):
stop_price = current_price * (1 - self.stop_loss_pct)
target_price = current_price * (1 + self.take_profit_pct)
self.buy(
size=self.position_size,
stop_loss=stop_price,
take_profit=target_price
)
# Overbought + Bearish trend + Normal volatility → Short
elif (rsi > self.overbought and
sma_50 < sma_200 and
atr < avg_atr * 1.5):
stop_price = current_price * (1 + self.stop_loss_pct)
target_price = current_price * (1 - self.take_profit_pct)
self.sell(
size=self.position_size,
stop_loss=stop_price,
take_profit=target_price
)
# Exit logic (if stop/profit not hit, exit when RSI returns to neutral)
elif position != 0:
if (position > 0 and rsi > 50) or (position < 0 and rsi < 50):
self.close_position()
def calculate_atr(self, prices, period=14):
"""Calculate Average True Range"""
# Simplified ATR calculation
highs = prices # Simplified - use actual high/low in production
lows = prices * 0.99
tr1 = highs - lows
return np.mean(tr1[-period:])
# Strategy configuration
config = {
'strategy': RSIMeanReversion,
'symbols': ['BTCUSDT', 'ETHUSDT'],
'timeframe': '1h',
'start_date': '2023-01-01',
'end_date': '2024-01-01',
'initial_capital': 10000,
'commission': 0.001 # 0.1% commission
}
Strategy Breakdown
| Element | Implementation | Rationale |
|---------|---------------|-----------|
| Entry | RSI < 30 with bullish trend → Long; RSI > 70 with bearish trend → Short | Mean reversion with trend confirmation |
| Exit | Fixed 2% stop loss / 4% take profit, or RSI returns to 50 | Risk management + signal reversal |
| Filter | 50/200 MA trend confirmation + ATR volatility filter | Avoid counter-trend and choppy trades |
| Sizing | Fixed 10% capital allocation to control per-trade risk | Consistent risk exposure |
🚀 Test This Strategy on Sentinel — Import code and run in 3 minutes!
How to Optimize Your Strategy
1. Parameter Optimization (Walk-Forward Analysis)
The best way to avoid overfitting is using rolling out-of-sample testing:
# Split data into multiple periods, optimize and validate independently
for train_start, train_end, test_start, test_end in walk_forward_splits:
best_params = optimize_on_train(train_start, train_end)
results = test_on_out_of_sample(test_start, test_end, best_params)
# Only accept parameters that perform well across multiple periods
if results.sharpe_ratio > 1.0 and results.max_drawdown < 0.2:
valid_params.append(best_params)
Walk-Forward Parameters
| Parameter | Recommendation | Purpose |
|-----------|---------------|---------|
| Training window | 6-12 months | Enough data for optimization |
| Testing window | 2-3 months | Validate on recent data |
| Step size | 1-3 months | Balance granularity and computation |
| Minimum periods | 5+ | Ensure robustness |
2. Add More Filters
| Filter Type | Purpose | Implementation | Impact |
|-------------|---------|----------------|--------|
| Volatility Filter | Avoid extreme volatility | Reduce position when ATR > threshold | -10% to -20% trades |
| Correlation Filter | Avoid overlapping signals | Skip if highly correlated with existing positions | Reduce concentration |
| Liquidity Filter | Ensure execution quality | Only trade when volume > average | Better fills |
| Time Filter | Avoid news events | No trading 1 hour before/after major announcements | Avoid whipsaws |
| Regime Filter | Adapt to market conditions | Different parameters for bull/bear markets | Improved adaptability |
3. Dynamic Position Sizing
# Adjust position based on volatility
atr = calculate_atr(data, 14)
volatility_factor = base_atr / atr # Higher volatility = smaller position
adjusted_size = base_position_size * volatility_factor
# Kelly Criterion position sizing
win_rate = 0.55 # From backtest
avg_win = 100 # Average winning trade
avg_loss = 50 # Average losing trade
kelly_fraction = (win_rate * avg_win - (1 - win_rate) * avg_loss) / avg_win
safe_kelly = kelly_fraction * 0.5 # Use Half Kelly for safety
Position Sizing Methods Comparison
| Method | Formula | Pros | Cons |
|--------|---------|------|------|
| Fixed Dollar | $1000 per trade | Simple, consistent | Doesn't account for volatility |
| Fixed Percent | 2% of capital | Scales with account | Can be too aggressive |
| ATR-Based | (1% * Capital) / ATR | Volatility-adjusted | Complex calculation |
| Kelly | f* = (bp-q)/b | Mathematically optimal | High volatility, estimation error |
| Half Kelly | 0.5 * Kelly | Reduced volatility | Lower growth rate |
4. Multi-Strategy Portfolio
Combine multiple low-correlation strategies to reduce overall drawdown:
portfolio = StrategyPortfolio([
('rsi_mean_reversion', 0.3), # 30% allocation
('trend_following', 0.4), # 40% allocation
('breakout', 0.3) # 30% allocation
])
# Rebalance monthly based on performance
portfolio.rebalance(frequency='1M', method='risk_parity')
Strategy Correlation Matrix
| Strategy | Trend | Mean Rev | Breakout | Arbitrage |
|----------|-------|----------|----------|-----------|
| Trend | 1.0 | -0.3 | 0.4 | 0.1 |
| Mean Reversion | -0.3 | 1.0 | -0.2 | 0.0 |
| Breakout | 0.4 | -0.2 | 1.0 | 0.2 |
| Arbitrage | 0.1 | 0.0 | 0.2 | 1.0 |
Lower correlation = better diversification benefits
Strategy Development Checklist
Before deploying any strategy to live trading, verify:
| Checkpoint | Requirement | Status | Notes |
|------------|-------------|--------|-------|
| Logic Validation | Clear economic rationale | ☐ | Not just curve-fitted |
| Backtest Period | Minimum 3 years of data | ☐ | Include multiple cycles |
| Out-of-Sample Test | Validated on unseen data | ☐ | Walk-forward analysis |
| Transaction Costs | Included in simulation | ☐ | 0.1-0.3% buffer |
| Statistical Significance | 100+ trades minimum | ☐ | More is better |
| Drawdown Acceptable | Max drawdown < 20% | ☐ | Know your tolerance |
| Paper Trading | 3+ months successful | ☐ | Real-time validation |
| Risk Limits | Stop-loss and sizing defined | ☐ | Mandatory |
| Stress Testing | Survives market crashes | ☐ | 2008, 2020 tests |
| Parameter Stability | Works across parameter ranges | ☐ | Not over-optimized |
Performance Benchmarks
| Metric | Minimum | Good | Excellent |
|--------|---------|------|-----------|
| Sharpe Ratio | 0.5 | 1.0 | 2.0+ |
| Max Drawdown | < 30% | < 20% | < 10% |
| Win Rate | > 35% | > 45% | > 55% |
| Profit Factor | > 1.2 | > 1.5 | > 2.0 |
| Calmar Ratio | > 0.5 | > 1.0 | > 2.0 |
📊 Validate Your Strategy with Sentinel — Comprehensive checklist and tools!
Introducing the Sentinel Strategy Marketplace
Writing a good strategy is just the first step. The Sentinel Strategy Marketplace helps you monetize it:
Marketplace Features
| Feature | Description | Benefit |
|---------|-------------|---------|
| Strategy Publishing | One-click cloud deployment | 24/7 automated execution |
| Subscription Monetization | Set monthly/quarterly fees | Passive income from copy-traders |
| Performance Display | Auto-generated reports | Build credibility |
| Risk Rating | System-assessed risk level | Help users choose appropriately |
| Profit Sharing | Automatic revenue split | Earn while you trade |
| Copy Trading | Users can follow your strategy | Expand your reach |
Why Choose Sentinel?
- Low Barrier: No server management needed, focus on strategy development
- High Flexibility: Support for Python, C++, TradingView Pine Script
- Real Performance: All strategies verified with live trading, no paper-only claims
- Community Validation: User ratings and reviews surface the best strategies
- Secure: API keys encrypted, funds remain in your exchange account
Marketplace Revenue Potential
| Subscribers | Monthly Fee | Monthly Revenue | Annual Revenue |
|-------------|-------------|-----------------|----------------|
| 10 | $29 | $290 | $3,480 |
| 50 | $29 | $1,450 | $17,400 |
| 100 | $49 | $4,900 | $58,800 |
| 500 | $49 | $24,500 | $294,000 |
💰 Publish Your Strategy on Sentinel — Start earning passive income!
Conclusion and Call to Action
The essence of quantitative trading isn't about perfect predictions—it's about building a repeatable, verifiable, executable trading system.
Key Takeaways:
- Four Core Elements: Entry, Exit, Filters, Position Sizing—miss any one and your strategy is incomplete
- Risk Management: Position sizing is as important as signal generation
- Validation: Out-of-sample testing and paper trading are non-negotiable
- Continuous Improvement: Markets evolve, so must your strategies
Next Steps:
- Download Sentinel Now: Sign up for a free account and get complete strategy templates
- Clone the RSI Strategy: Start with the example in this article, test in simulation
- Join Our Discord Community: Exchange optimization tips with 5,000+ quant traders
- Publish Your Strategy: Once validated through backtesting, consider sharing on the marketplace
🚀 Limited Time Offer: New users get 30 days of Pro membership free, unlocking advanced backtesting and real-time data!
👉 Start Your Free Sentinel Trial — No credit card required
👉 Download Strategy Templates — Ready-to-use code examples
👉 Join Discord Community — Connect with fellow traders
👉 Watch Strategy Development Masterclass — 2-hour deep dive
Additional Resources
Internal Links
- Quantitative Trading for Beginners: Build Your First Strategy with Python
- What is Backtesting? Why 90% of Trading Strategies Fail Without It
- The Complete Trading Bot Guide: 7 Steps from Theory to Execution
- Sentinel Backtesting Tutorial: Your First Strategy in 3 Minutes
- Technical Indicators Guide: RSI, MACD, KD Backtest Comparison
- Python Quant Frameworks: Backtrader vs Zipline vs Sentinel
- Python Algorithmic Trading: Build an Auto-Trading Bot in 50 Lines
External Authority Links
- QuantStart: Strategy Development
- Wiley: Quantitative Trading Book
- SSRN: Academic Trading Strategy Research
- CME Group: Risk Management
- Investopedia: Position Sizing
- CFA Institute: Portfolio Management
- Khan Academy: Statistics and Probability
This article is for educational purposes only. Investing involves risk, trade responsibly.
Ready to write your first quant strategy? Start your free Sentinel trial now!
相關閱讀
- Quantitative Trading for Beginners: Build Your First Strategy with Python
- Technical Indicators Guide: RSI, MACD, KD Backtest Comparison (2026)
- BTC Quant Trading Strategy 2026: Bitcoin Automation Guide for Professional Traders
- Trend Following vs Mean Reversion: Quant Strategy Backtest Comparison 2026
- What is Backtesting? Why 90% of Trading Strategies Fail Without It
- Python Algorithmic Trading: Build an Auto-Trading Bot in 50 Lines (2026)