介绍
用几个简单的例子让你快速入门,了解WanQuant的基本使用方法。
1.所有文档的相关代码都在开源项目里可以看到
https://github.com/JetCrab/WanQuant/samples
2.环境安装
bash
# 安装依赖
pip install wanquant
# 安装通达信数据源,仅供学习使用
pip install wanquant_tdx3.配置文件
- 修改数据存放目录
- 获取请求接口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()