Skip to content

介绍

用几个简单的例子让你快速入门,了解WanQuant的基本使用方法。

1.所有文档的相关代码都在开源项目里可以看到

https://github.com/JetCrab/WanQuant/samples

2.环境安装

bash
# 安装依赖
pip install wanquant
# 安装通达信数据源,仅供学习使用
pip install wanquant_tdx

3.配置文件

  • 修改数据存放目录
  • 获取请求接口token 登录获取
  • 文件路径 wanquant/samples/wq_conf.yaml
yaml
# 数据目录
data_dir: "E:/WanQuantData"
# 工作目录
work_dir: "E:/WanQuantWork"
log_level: "INFO" # 日志等级 例如 DEBUG INFO WARNING ERROR


# 存放一些第三方接口调用所需的配置
api_param:
  standard:
    wanquant:
      url: "http://data.wanquant.com"
      # 设置请求token
      token: "xxxxxxxxxxxxxxx"
  # tushare数据源 token
  tushare:
    token: ""


# 需要区分是什么市场的数据
# 框架数据源配置
data_feed:
  # list 代表标的列表
  sz|sh|bj:
    # 配置列表
    list: "StockAkDfList"
    # 配置 后复权因子 来源  如果注释该行 策略将不会复权
    hfq: "StockAkHfq"
    # 配置 涨跌幅限额 来源
    limit: "StockTsLimitRatio"
    # 配置 tick 数据来源
    s3: ""
    # 配置 1分钟数据 来源
    m1: "StockTdxMin"
    # 配置 1日线数据 来源
    d1: "StockTdxDay"
  # 东方财富概念版块
  g_df:
    list: ""
    member: ""
    d1: ""
  # 指数版块
  g_sz|g_csi|g_sh|g_bj:
    list: ""
    member: ""
    d1: ""


base:
  # 时区设置
  utc: '+8'
  def_fq: "qfq" # 默认复权方式, "qfq" "hfq" ""



#存储的配置
storage:
  default_use: "disk"
  disk:
    package: "wanquant.data.storage.disk_storage.DiskStorage"
    storage_dir: "${data_dir}"
    compression: "csv"

4.数据下载

python
from wanquant.core.wan_quant_save import WanQuantSave
from wanquant.engine.wq_save import start_save
from wanquant.util import u_api
from wanquant_tdx.imp_save import *

# 下载WanQuant自带的数据
start_save(save_list=[
    WanQuantSave("StockWqList"),  # A股列表
    WanQuantSave("StockWqLimitRatio"),  # A股涨跌停板幅度
    WanQuantSave("StockWqHfq"),  # A股后复权因子
])

# 下载tdx相关数据
save_params = {
    "symbol": u_api.get_stock_symbol_list(),
    "start_date": "2020-01-01",
    "end_date": "",
}

save_list = [
    [StockTdxDay(max_workers=10)],  # A股日线数据
    [StockTdxMin(max_workers=10)],  # A股分钟数据
]
start_save(save_list=save_list, params=save_params)

5.运行策略

一个简单选股策略

  • 文件路径 wanquant/samples/select/1_select.py
python
from wanquant.imp import *

backtest_date_range = "2025-10-15"
select_extend_len = 40  # 扩展数据天数
strategy_type = StrategyType.SELECT  # 策略模式
max_workers = 10  # 进程数量


def on_symbol(so: SymbolOp):
    # 设置标的池
    so.set_symbol(u_api.get_stock_symbol_list_not_st())


def on_select(so: SelectOp):
    # 最近20个交易日最少要上涨13天 否则不要
    if not so.last().up_days(20) > 13:
        return
    # 10日均线需要在40日均线之上 否则不要
    if not so.last(1).ma(10) > so.last(1).ma(40):
        return

    so.allow({
        "上涨天数": so.last().up_days(20),  # 最近20个交易日上涨天数
        "涨停天数": so.last().up_limit_days(20),  # 最近20个交易日涨停天数
    })


# 启动策略
start_strategy()
# 生成选择器结果
create_html()
create_excel()

一个简单交易策略

  • 文件路径 wanquant/samples/strategy/1_strategy.py
python
from wanquant.imp import *
from wanquant.util import u_df

backtest_date_range = ["2021-09-20", "2024-01-20"]
select_extend_len = 41  # 扩展数据天数
strategy_type = StrategyType.STRATEGY  # 策略模式
max_workers = 24  # 进程数量
backtest_money = 300000


def on_symbol(so: SymbolOp):
    # 设置标的池
    so.set_symbol(u_api.get_stock_symbol_list())


def on_select(so: SelectOp):
    # 最近20个交易日最少要上涨13天 否则不要
    if not so.last().up_days(20) > 13:
        return
    # 10日均线需要在40日均线之上 否则不要
    if not so.last(1).ma(10) > so.last(1).ma(40):
        return

    so.allow({
        "上涨天数": so.last().up_days(20),  # 最近20个交易日上涨天数
        "涨停天数": so.last().up_limit_days(20),  # 最近20个交易日涨停天数
        "涨幅总和": so.last().change_days(20)
    })


def on_filter_select(fso: FilterSelectOp):
    u_log.info("开始筛选", fso.node_date, u_df.lenm(fso.filter_df))
    # 上涨天数
    df_sorted = fso.filter_df.sort_values(by=['上涨天数', '涨幅总和'], ascending=False)
    # 取前20个
    top_20 = df_sorted.head(1)
    # 存储筛选结果
    fso.set_symbol(top_20.symbol.to_list())


def on_next(no: NextOp):
    if not no.exist_position():  # 检查是否有持仓
        # 不存在持仓 并且金叉开始买入 1000股
        no.buy(1000, no.last().open, "开盘买入")
    elif no.exist_position(is_can_use=True):  # 检查是否有可用持仓
        macd = no.last().load_macd(12, 26, 9)
        if macd.macd_dif < macd.macd_dea:
            # 存在持仓并且死叉开始卖出 1000股
            no.sell(1000, no.last().open, "macd死叉卖出")


# 启动策略
start_strategy()

# 生成选择器结果
create_html()
create_excel()