Create a parameter optimization script for a VectorBT strategy.
Arguments
Parse $ARGUMENTS as: strategy symbol exchange interval
$0 = strategy name (e.g., ema-crossover, rsi, donchian). Default: ema-crossover
$1 = symbol (e.g., SBIN, RELIANCE, NIFTY). Default: SBIN
$2 = exchange (e.g., NSE, NFO). Default: NSE
$3 = interval (e.g., D, 1h, 5m). Default: D
If no arguments, ask the user which strategy to optimize.
Instructions
- Read the vectorbt-expert skill rules for reference patterns
- Create
backtesting/{strategy_name}/ directory if it doesn't exist (on-demand)
- Create a
.py file in backtesting/{strategy_name}/ named {symbol}_{strategy}_optimize.py
- The script must:
- Load
.env from project root using find_dotenv() and fetch data via OpenAlgo client.history()
- If user provides a DuckDB path, load data directly via
duckdb.connect(path, read_only=True). See vectorbt-expert rules/duckdb-data.md.
- If
openalgo.ta is not importable (standalone DuckDB), use inline exrem() fallback.
- Use OpenAlgo ta for ALL indicators by default (never VectorBT built-in). Only switch to TA-Lib if the user explicitly says "talib"/"TA-Lib"
- Always use OpenAlgo ta for specialty indicators (Supertrend, Donchian, etc.) - no TA-Lib equivalent exists
- Use
ta.exrem() to clean signals (always .fillna(False) before exrem)
- Define sensible parameter ranges for the chosen strategy
- Use loop-based optimization to collect multiple metrics per combo
- Track: total_return, sharpe_ratio, max_drawdown, trade_count for each combination
- Use
tqdm for progress bars
- Indian delivery fees:
fees=0.00111, fixed_fees=20 for delivery equity
- Find best parameters by total return AND by Sharpe ratio
- Print top 10 results for both criteria
- Generate Plotly heatmap of total return across parameter grid (
template="plotly_dark")
- Generate Plotly heatmap of Sharpe ratio across parameter grid
- Fetch NIFTY benchmark and compare best parameters vs benchmark
- Print Strategy vs Benchmark comparison table
- Explain results in plain language for normal traders
- Save results to CSV
- Never use icons/emojis in code or logger output
- For futures symbols, use lot-size-aware sizing:
- NIFTY:
min_size=65, size_granularity=65
- BANKNIFTY:
min_size=30, size_granularity=30
Default Parameter Ranges
| Strategy |
Parameter 1 |
Parameter 2 |
| ema-crossover |
fast EMA: 5-50 |
slow EMA: 10-60 |
| rsi |
window: 5-30 |
oversold: 20-40 |
| donchian |
period: 5-50 |
- |
| supertrend |
period: 5-30 |
multiplier: 1.0-5.0 |
Example Usage
/optimize ema-crossover RELIANCE NSE D
/optimize rsi SBIN
1---2name: optimize3description: Optimize strategy parameters using VectorBT. Tests parameter combinations and generates heatmaps.4---5
6Create a parameter optimization script for a VectorBT strategy.
7
8## Arguments
9
10Parse `$ARGUMENTS` as: strategy symbol exchange interval
11
12- `$0` = strategy name (e.g., ema-crossover, rsi, donchian). Default: ema-crossover
13- `$1` = symbol (e.g., SBIN, RELIANCE, NIFTY). Default: SBIN
14- `$2` = exchange (e.g., NSE, NFO). Default: NSE
15- `$3` = interval (e.g., D, 1h, 5m). Default: D
16
17If no arguments, ask the user which strategy to optimize.
18
19## Instructions
20
211. Read the vectorbt-expert skill rules for reference patterns
222. Create `backtesting/{strategy_name}/` directory if it doesn't exist (on-demand)
233. Create a `.py` file in `backtesting/{strategy_name}/` named `{symbol}_{strategy}_optimize.py`
244. The script must:
25 - Load `.env` from project root using `find_dotenv()` and fetch data via OpenAlgo `client.history()`
26 - If user provides a DuckDB path, load data directly via `duckdb.connect(path, read_only=True)`. See vectorbt-expert `rules/duckdb-data.md`.
27 - If `openalgo.ta` is not importable (standalone DuckDB), use inline `exrem()` fallback.
28 - **Use OpenAlgo ta for ALL indicators by default** (never VectorBT built-in). Only switch to TA-Lib if the user explicitly says "talib"/"TA-Lib"
29 - **Always use OpenAlgo ta** for specialty indicators (Supertrend, Donchian, etc.) - no TA-Lib equivalent exists
30 - Use `ta.exrem()` to clean signals (always `.fillna(False)` before exrem)
31 - Define sensible parameter ranges for the chosen strategy
32 - Use loop-based optimization to collect multiple metrics per combo
33 - Track: total_return, sharpe_ratio, max_drawdown, trade_count for each combination
34 - Use `tqdm` for progress bars
35 - **Indian delivery fees**: `fees=0.00111, fixed_fees=20` for delivery equity
36 - Find best parameters by total return AND by Sharpe ratio
37 - Print top 10 results for both criteria
38 - Generate Plotly heatmap of total return across parameter grid (`template="plotly_dark"`)
39 - Generate Plotly heatmap of Sharpe ratio across parameter grid
40 - **Fetch NIFTY benchmark** and compare best parameters vs benchmark
41 - **Print Strategy vs Benchmark comparison table**
42 - **Explain results** in plain language for normal traders
43 - Save results to CSV
444. Never use icons/emojis in code or logger output
455. For futures symbols, use lot-size-aware sizing:
46 - NIFTY: `min_size=65, size_granularity=65`
47 - BANKNIFTY: `min_size=30, size_granularity=30`
48
49## Default Parameter Ranges
50
51| Strategy | Parameter 1 | Parameter 2 |
52|----------|------------|-------------|
53| ema-crossover | fast EMA: 5-50 | slow EMA: 10-60 |
54| rsi | window: 5-30 | oversold: 20-40 |
55| donchian | period: 5-50 | - |
56| supertrend | period: 5-30 | multiplier: 1.0-5.0 |
57
58## Example Usage
59
60`/optimize ema-crossover RELIANCE NSE D`
61`/optimize rsi SBIN`