akquant

$npx mdskill add lzwme/finance-quant-skills/akquant

Generate executable quantitative strategy code using the akquant framework.

  • Developers need to create, backtest, or optimize quantitative trading strategies.
  • Depends on Python, uv, and the akquant library on Windows.
  • Analyzes user intent to select strategy type, data, risk rules, and optimization method.
  • Outputs complete Python strategy code with lifecycle hooks, order management, and risk controls.

SKILL.md

.github/skills/akquantView on GitHub ↗
---
name: akquant
description: 生成 akquant 框架的可执行量化策略代码,涵盖数据接口、事件驱动、风控与优化。当用户需要开发量化策略、配置回测环境、设置风控规则、进行参数优化、实现横截面轮动策略,或提及 akquant 时使用
metadata: {"openclaw":{"emoji":"📈","requires":{"bins":["python", "uv"],"os":"win32"}}}
---

# AKQuant 量化策略开发指南

## 任务目标

本 Skill 用于辅助 AI 编程智能体生成符合 akquant 框架规范的可执行量化策略代码。能力包括策略设计、回测配置、订单管理、风控规则、参数优化与横截面策略实现。

## 核心能力清单

- 策略类生成:继承 Strategy 基类,实现生命周期钩子
- 数据接口配置:准备 DataFrame 数据、设置预热期、访问历史数据
- 事件驱动机制:on_bar/on_tick/on_order/on_trade 等回调
- 订单管理:市价单/限价单/目标仓位/OCO/Bracket/Trailing Stop
- 风控规则:持仓限制/回撤熔断/止损阈值/行业集中度
- 参数优化:网格搜索与滚动优化(Walk-Forward)
- 多策略编排:slot 映射与策略级风控

## 触发条件

当用户表达以下意图时触发:
- 开发量化交易策略
- 配置回测环境与参数
- 设置风险控制规则
- 进行参数优化与调优
- 实现横截面或轮动策略
- 排查策略运行错误

## 策略开发工作流

### 阶段一:理解需求

1. 识别策略类型:趋势跟踪、均值回归、横截面轮动、套利等
2. 确定数据需求:时间周期、标的范围、字段要求
3. 明确风控约束:持仓上限、止损止盈、回撤限制

### 阶段二:设计策略结构

参考 [strategy-patterns.md](references/strategy-patterns.md) 选择范式:
- 类风格(推荐):继承 Strategy,封装状态与逻辑
- 函数风格:initialize + on_bar,快速原型

关键决策点:
- 预热期设置:根据指标窗口长度计算
- 历史数据访问:get_history (numpy) 或 get_history_df (DataFrame)
- 执行模式:NextOpen(下一 Bar 开盘)或 CurrentClose(当前 Bar 收盘)

### 阶段三:编写策略代码

使用 [assets/strategy-template.py](assets/strategy-template.py) 作为起点:

```python
from akquant import Strategy, Bar

class MyStrategy(Strategy):
    warmup_period = 20  # 预热数据长度

    def __init__(self, param1=10):
        self.param1 = param1

    def on_start(self):
        self.subscribe("600000")

    def on_bar(self, bar: Bar):
        # 核心交易逻辑
        history = self.get_history(self.param1, bar.symbol, "close")
        if len(history) < self.param1:
            return

        import numpy as np
        ma = np.mean(history)
        pos = self.get_position(bar.symbol)

        if bar.close > ma and pos == 0:
            self.buy(bar.symbol, 100)
        elif bar.close < ma and pos > 0:
            self.sell(bar.symbol, 100)
```

### 阶段四:配置回测环境

参考 [api-reference.md](references/api-reference.md) 设置参数:

```python
from akquant import run_backtest

result = run_backtest(
    strategy=MyStrategy,
    data=df,
    symbol="600000",
    initial_cash=500_000.0,
    commission_rate=0.0003,
    stamp_tax_rate=0.001,
    t_plus_one=True,  # A 股 T+1 规则
    warmup_period=20,
    execution_mode="NextOpen",
)
```

### 阶段五:设置风控规则

参考 [risk-management.md](references/risk-management.md) 配置:

```python
from akquant.config import RiskConfig

result = run_backtest(
    ...,
    risk_config=RiskConfig(
        max_position_pct=0.10,  # 单标的持仓不超过 10%
        max_account_drawdown=0.20,  # 最大回撤 20%
        max_daily_loss=0.05,  # 单日亏损 5%
    ),
)
```

### 阶段六:参数优化

参考 [optimization.md](references/optimization.md) 执行:

```python
from akquant import run_grid_search, run_walk_forward

# 网格搜索
results = run_grid_search(
    strategy=MyStrategy,
    param_grid={"param1": [10, 20, 30]},
    data=df,
    sort_by="sharpe_ratio",
)

# 滚动优化(推荐)
wfo_results = run_walk_forward(
    strategy=MyStrategy,
    param_grid={"param1": [10, 20, 30]},
    data=df,
    train_period=250,
    test_period=60,
    metric="sharpe_ratio",
)
```

## 横截面策略开发

参考 [cross-section-guide.md](references/cross-section-guide.md) 实现多标的轮动:

**推荐范式**:使用 on_timer 统一触发调仓

```python
class CrossSectionStrategy(Strategy):
    def __init__(self):
        self.universe = ["sh600519", "sz000858", "sh601318"]

    def on_start(self):
        self.add_daily_timer("14:55:00", "rebalance")

    def on_timer(self, payload):
        if payload != "rebalance":
            return

        # 计算所有标分数
        scores = {}
        for symbol in self.universe:
            history = self.get_history(20, symbol, "close")
            scores[symbol] = (history[-1] - history[0]) / history[0]

        # 选出最佳标的并调仓
        best = max(scores, key=scores.get)
        self.order_target_percent(0.95, symbol=best)
```

## 资源索引

| 资源 | 用途 | 何时读取 |
|------|------|----------|
| [api-reference.md](references/api-reference.md) | API 速查 | 查询函数签名与参数 |
| [strategy-patterns.md](references/strategy-patterns.md) | 策略范式 | 设计策略结构 |
| [risk-management.md](references/risk-management.md) | 风控配置 | 设置风控规则 |
| [optimization.md](references/optimization.md) | 参数优化 | 调优策略参数 |
| [cross-section-guide.md](references/cross-section-guide.md) | 横截面策略 | 实现多标的轮动 |
| [strategy-template.py](assets/strategy-template.py) | 策略模板 | 快速生成代码骨架 |
## 环境准备与依赖管理

### 使用 uv 管理项目环境(推荐)

由于 akquant 依赖 `pandas>=3.0.0`,全局安装可能与现有项目存在版本冲突。推荐使用 **uv** 创建隔离环境:

#### 1. 安装 uv:若已安装则跳过

```bash
# macOS
brew install uv

# Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```

#### 2. 创建项目并初始化环境

```bash
# 创建项目目录
mkdir my-quant-strategy
cd my-quant-strategy

# 初始化项目(创建 pyproject.toml)
uv init

# 创建虚拟环境并安装依赖
uv venv
uv add akquant pandas numpy
```

#### 3. 运行策略脚本

```bash
# 方式一:使用 uv run(推荐)
uv run python my_strategy.py

# 方式二:激活虚拟环境后运行
source .venv/bin/activate  # macOS/Linux
# .venv\Scripts\activate   # Windows
python my_strategy.py
```

#### 4. 依赖版本锁定

uv 会自动生成 `uv.lock` 文件,确保团队依赖一致:

```bash
# 安装精确版本(从 lock 文件)
uv sync

# 添加新依赖
uv add scipy  # 自动更新 lock 文件
```

#### 5. 项目结构建议

```
my-quant-strategy/
├── .venv/              # 虚拟环境(uv 自动创建)
├── pyproject.toml      # 项目配置
├── uv.lock             # 依赖锁定文件
├── strategies/         # 策略脚本
│   ├── ma_strategy.py
│   └── cross_section.py
└── data/               # 数据文件
    └── stock_data.csv
```

### 快速启动命令

```bash
# 一键创建并运行策略项目
mkdir quant-project && cd quant-project
uv init
uv venv
uv add akquant pandas numpy

# 创建策略文件(使用模板)
cat > strategy.py << 'EOF'
from akquant import Strategy, Bar, run_backtest
import pandas as pd
import numpy as np

class MyStrategy(Strategy):
    warmup_period = 20

    def on_bar(self, bar: Bar):
        closes = self.get_history(20, bar.symbol, "close")
        if len(closes) < 20:
            return
        ma = np.mean(closes)
        pos = self.get_position(bar.symbol)
        if bar.close > ma and pos == 0:
            self.buy(bar.symbol, 100)
        elif bar.close < ma and pos > 0:
            self.sell(bar.symbol, pos)

# 准备数据并运行回测
# result = run_backtest(strategy=MyStrategy, data=df, symbol="600000")
EOF

# 运行策略
uv run python strategy.py
```

## 注意事项

1. **预热期计算**:确保 warmup_period >= 指标所需的最大窗口长度
2. **T+1 规则**:A 股策略需设置 t_plus_one=True,并区分总持仓与可用持仓
3. **风控优先级**:显式参数 > 配置对象 > 默认值
4. **数据格式**:DataFrame 必须包含 date/open/high/low/close/volume/symbol 字段
5. **横截面触发**:优先使用 on_timer,无固定时点再考虑 timestamp 收齐方案
6. **优化风险**:网格搜索易过拟合,推荐使用滚动优化验证稳健性

## 使用示例

### 示例 1:双均线策略

```python
from akquant import Strategy, Bar
import numpy as np

class DualMAStrategy(Strategy):
    warmup_period = 30

    def __init__(self, fast=10, slow=20):
        self.fast = fast
        self.slow = slow
        self.warmup_period = slow + 1

    def on_bar(self, bar: Bar):
        fast_ma = np.mean(self.get_history(self.fast, bar.symbol, "close"))
        slow_ma = np.mean(self.get_history(self.slow, bar.symbol, "close"))

        pos = self.get_position(bar.symbol)
        if fast_ma > slow_ma and pos == 0:
            self.buy(bar.symbol, 100)
        elif fast_ma < slow_ma and pos > 0:
            self.sell(bar.symbol, pos)
```

### 示例 2:带风控的趋势策略

```python
from akquant import Strategy, Bar, run_backtest
from akquant.config import RiskConfig
import numpy as np

class TrendStrategy(Strategy):
    warmup_period = 20

    def __init__(self, ma_window=20, stop_loss=0.05):
        self.ma_window = ma_window
        self.stop_loss = stop_loss

    def on_bar(self, bar: Bar):
        ma = np.mean(self.get_history(self.ma_window, bar.symbol, "close"))
        pos = self.get_position(bar.symbol)

        if bar.close > ma * 1.02 and pos == 0:
            self.buy(bar.symbol, 100)
        elif bar.close < ma * 0.98 and pos > 0:
            self.sell(bar.symbol, pos)

# 运行回测
result = run_backtest(
    strategy=TrendStrategy,
    data=df,
    symbol="600000",
    initial_cash=1_000_000.0,
    risk_config=RiskConfig(
        max_position_pct=0.20,
        max_account_drawdown=0.15,
        stop_loss_threshold=0.85,
    ),
)
```

### 示例 3:横截面动量轮动

```python
from akquant import Strategy, run_backtest
import numpy as np

class MomentumRotation(Strategy):
    def __init__(self, lookback=20):
        self.lookback = lookback
        self.universe = ["sh600519", "sz000858", "sh601318"]
        self.warmup_period = lookback + 1

    def on_start(self):
        for symbol in self.universe:
            self.subscribe(symbol)
        self.add_daily_timer("14:55:00", "rebalance")

    def on_timer(self, payload):
        if payload != "rebalance":
            return

        scores = {}
        for symbol in self.universe:
            closes = self.get_history(self.lookback, symbol, "close")
            if len(closes) < self.lookback:
                return
            scores[symbol] = (closes[-1] - closes[0]) / closes[0]

        # 选出最佳标的,持仓 95%
        best = max(scores, key=scores.get)
        self.order_target_percent(0.95, symbol=best)
```

More from lzwme/finance-quant-skills

SkillDescription
baostockBaoStock 免费开源 A 股数据平台,无需注册、无需 API Key,支持股票行情、K线、财务数据、行业分类、指数成分股查询。当用户提及 baostock、需要获取A股历史行情、财务报表、交易日历,或需要**免费、免注册**的A股数据时使用。与 tushare(数据更全但需注册)和 jqdatasdk(聚宽数据)不同,baostock 完全免费无限制,适合快速入门和低成本数据需求。
equity-researcher机构级投研报告生成技能。覆盖中国A股、港股、美股上市公司。输出模式:1)投资速览:3-5页,含公司概览、核心财务指标、估值倍数、投资逻辑与风险因素;2)深度研报:≥25页,含行业分析、产业链图谱、三表模型、DCF估值、情景分析与敏感性测试。触发条件:1)直接请求:分析/看看/研究/调研/介绍一下 + 公司名或股票;2)投资询问:你怎么看/能不能买/值得投吗/帮我看看/扒一扒 + 公司或股票;3)关键词:研报、投资简报、投资速览、公司一页纸、深度研报、深度研究、深度分析、个股分析、一页纸、速览、公司速览、投研报告;4)股票代码:标准格式(如 600519.SH、0700.HK、AAPL、TSLA、BYD)。意图不明确时主动询问输出模式,禁止默认推断。
joinquant-docs聚宽(JoinQuant)官网策略开发指南,涵盖回测、模拟交易、数据 API、交易函数、因子与技术指标。当用户编写聚宽策略、回测、模拟盘、查询聚宽 API、get_price/order/run_daily、Alpha 因子、技术指标,或提及 joinquant、聚宽、jqdata 策略时使用。本地数据获取请用 jqdatasdk 技能。
jqdatasdk聚宽(JoinQuant)本地数据 SDK,提供 A 股行情、历史K线、财务数据、指标数据等,与聚宽官网数据同源。当用户提及 jqdatasdk、聚宽数据、需要获取A股数据,或已注册聚宽账号时使用。与 baostock(免费)和 tushare(数据最全)不同,jqdatasdk 需注册聚宽账号获取 Token,适合已在使用聚宽平台的用户。本地数据获取请用本技能,聚宽官网策略开发请用 joinquant-docs 技能。
miniqmtMiniQMT 迅投量化交易接口,基于 XtQuant Python 库,支持 A 股/期货/期权的行情数据获取(K线、分笔、财务数据等)和交易下单(报单、撤单、查询资产/委托/持仓)。当用户提及 miniqmt、xtquant、迅投、获取实时行情、量化交易下单、回测数据获取,或需要连接 MiniQMT 客户端进行程序化交易时使用
pywencai同花顺问财数据查询:使用中文自然语言查询A股、指数、基金、港美股、可转债等市场数据;当用户需要通过自然语言从问财获取选股、财务、资金流、技术指标等数据时使用。
qmt-docsQMT(迅投极速策略交易系统)Python 策略开发完整指南。涵盖策略编写、回测、实盘交易、API参考和代码示例。当用户需要开发 QMT 量化策略、查询 QMT API、从聚宽迁移至 QMT、编写实盘交易程序,或提及 QMT、迅投策略、QMT 回测时使用。
rqalphaRQAlpha 米筐开源事件驱动回测框架。支持A股和期货,模块化架构,可自由扩展;当用户需要快速回测A股/期货策略、使用内置数据(download-bundle)、开发Mod插件,或提及 rqalpha、米筐时使用。与 backtrader 相比,rqalpha 内置A股日线数据、安装更简便,适合快速验证;backtrader 更灵活、社区更大。若用户仅需数据获取而无回测需求,引导使用 baostock/akshare/tushare 等数据 Skill。
tdxquant通达信量化数据获取技能。当用户提及 tdxquant、通达信、TdxQuant、tqcenter,并且需要获取A股数据(行情快照、K线、财务、板块、可转债、新股、交易数据等)、查询交易日历、执行通达信公式、订阅行情、交易下单时使用