AKQuant A-Share Backtesting
by @lamtest556-blip
A-share quantitative trading backtesting using AKQuant (Rust engine) and AKShare data. Use when user asks to "backtest a stock strategy", "test trading algor...
clawhub install akquant-backtest📖 About This Skill
name: akquant-backtest description: A-share quantitative trading backtesting using AKQuant (Rust engine) and AKShare data. Use when user asks to "backtest a stock strategy", "test trading algorithm on Chinese stocks", "analyze stock performance", "run double MA strategy", or "optimize trading parameters". Supports double MA, RSI, and custom strategies for A-shares.
AKQuant A-Share Backtesting
High-performance quantitative backtesting for Chinese stocks using Rust-powered AKQuant framework.
When to Use This Skill
Use this skill when you need to:
Quick Examples
Example 1: Quick Backtest
User says: "Backtest double MA strategy on 贵州茅台"Actions:
python3 scripts/run_backtest.py 600519 10 30
Result: Returns total return, trade count, equity curve
Example 2: Strategy Comparison
User says: "Compare 5-day vs 20-day MA on 平安银行"Actions:
# Fast MA = 5, Slow MA = 20
python3 scripts/run_backtest.py 000001 5 20Compare with default 10/30
python3 scripts/run_backtest.py 000001 10 30
Result: Compare returns to find optimal parameters
Example 3: Research Workflow
User says: "Analyze which tech stocks performed best with momentum strategy in 2024"Actions:
1. Test on multiple stocks: python3 scripts/run_backtest.py 300750 10 30 (宁德时代)
2. Test: python3 scripts/run_backtest.py 002594 10 30 (比亚迪)
3. Compare results and identify patterns
Step-by-Step Instructions
Step 1: Choose Stock Symbol
Common A-Share Symbols: | Symbol | Company | Sector | |--------|---------|--------| | 600519 | 贵州茅台 | 消费 | | 000001 | 平安银行 | 金融 | | 300750 | 宁德时代 | 新能源 | | 002594 | 比亚迪 | 汽车 | | 000858 | 五粮液 | 消费 |
Find symbol: Use AKShare or search "股票代码 + 公司名称"
Step 2: Select Strategy Parameters
Double MA Strategy (金叉买入,死叉卖出):
python3 scripts/run_backtest.py
Recommended combinations:
Step 3: Analyze Results
Key metrics to review:
Interpretation:
Return > 0% → Strategy beats buy-and-hold
Return < 0% → Strategy underperforms
Trade count > 20 → Consider commission impact
Available Strategies
Built-in Strategy: Double MA
Logic: Fast MA crosses above slow MA → Buy; Crosses below → SellCode example:
from double_ma_strategy import run_double_ma_backtestresult = run_double_ma_backtest(
symbol="000001",
fast_period=10,
slow_period=30,
initial_capital=100000,
start_date="20240101",
end_date="20241231"
)
print(f"Return: {result['return_pct']:.2f}%")
print(f"Trades: {len(result['trades'])}")
Custom Strategy Development
RSI Strategy Template:
import akquant as aqclass RsiStrategy:
def __init__(self, period=14, oversold=30, overbought=70):
self.rsi = aq.RSI(period)
self.oversold = oversold
self.overbought = overbought
def on_bar(self, bar):
self.rsi.update(bar['close'])
if self.rsi.value < self.oversold:
return 'BUY' # 超卖买入
elif self.rsi.value > self.overbought:
return 'SELL' # 超买卖出
return 'HOLD'
Technical Indicators Reference
| Indicator | Usage | Signal |
|-----------|-------|--------|
| aq.SMA(n) | Trend following | Price > SMA → uptrend |
| aq.EMA(n) | Faster trend | More responsive than SMA |
| aq.RSI(n) | Momentum | <30 oversold, >70 overbought |
| aq.MACD() | Trend + momentum | Crossover signals |
| aq.BollingerBands(n, k) | Volatility | Price touches bands |
| aq.ATR(n) | Risk sizing | Position sizing based on volatility |
Example:
import akquant as aqMulti-indicator strategy
sma = aq.SMA(20)
rsi = aq.RSI(14)for price in prices:
sma.update(price)
rsi.update(price)
# Buy: Price > SMA AND RSI < 40 (uptrend but not overbought)
if price > sma.value and rsi.value < 40:
signal = 'BUY'
Data Access via AKShare
Stock Historical Data
import akshare as akDaily price data (qfq = 前复权)
df = ak.stock_zh_a_hist(
symbol="000001",
period="daily",
start_date="20240101",
end_date="20241231",
adjust="qfq"
)Columns: 日期, 开盘, 收盘, 最高, 最低, 成交量
Real-time Quote
# Current prices
df = ak.stock_zh_a_spot_em()
Troubleshooting
Error: "ModuleNotFoundError: No module named 'akquant'"
Cause: Dependencies not installed Solution:source /root/.openclaw/venv/bin/activate
pip install akquant akshare pandas numpy
Error: "Stock symbol not found"
Cause: Wrong symbol format Solution:000001 not SZ000001)Error: "No data returned"
Causes: 1. Invalid date range - Checkstart_date < end_date
2. Stock suspended - Some stocks have trading halts
3. Delisted stock - Verify stock is still trading
4. Network issue - AKShare requires internet connectionStrategy returns -100% (total loss)
Causes: 1. Wrong parameter order -fast_period should be < slow_period
# Wrong: fast > slow
python3 scripts/run_backtest.py 000001 30 10
# Correct: fast < slow
python3 scripts/run_backtest.py 000001 10 30
2. Too many trades - High commission costs
3. Wrong signal logic - Check buy/sell conditionsSlow performance
Solutions:fast_period >= 5 to reduce calculationResults inconsistent between runs
Cause: AKShare data updates (recent days) Solution:Best Practices
Strategy Development Workflow
1. Start simple - Test MA crossover before complex strategies 2. Visualize - Plot equity curve if possible 3. Walk-forward test - Train on 2023, test on 2024 4. Transaction costs - Include 0.1% commission + 0.1% slippage 5. Risk management - Add stop-loss logicParameter Optimization
# Test multiple combinations
for fast in 5 10 15; do
for slow in 20 30 60; do
echo "Testing $fast/$slow:"
python3 scripts/run_backtest.py 000001 $fast $slow
done
done
Avoid Overfitting
Limitations & Warnings
References
📋 Tips & Best Practices
Strategy Development Workflow
1. Start simple - Test MA crossover before complex strategies 2. Visualize - Plot equity curve if possible 3. Walk-forward test - Train on 2023, test on 2024 4. Transaction costs - Include 0.1% commission + 0.1% slippage 5. Risk management - Add stop-loss logicParameter Optimization
# Test multiple combinations
for fast in 5 10 15; do
for slow in 20 30 60; do
echo "Testing $fast/$slow:"
python3 scripts/run_backtest.py 000001 $fast $slow
done
done