hello,我是毛豆。本系列用最精简的代码和案例带你快速入门量化,只讲最干的干货,想要学习量化又不知道该如何上手的小伙伴赶紧看过来!
前期回顾:
三分钟入门量化(一):
三分钟入门量化(一):行情数据获取&绘制k线图
三分钟入门量化(二):
三分钟入门量化(二):Tushare Pro数据接口介绍
三分钟入门量化(三):
三分钟入门量化(三):计算收益率
三分钟入门量化(四):
三分钟入门量化(四):行情数据统计分析
三分钟入门量化(五):
三分钟入门量化(五):收益率的推断统计
三分钟入门量化(六):
三分钟入门量化(六):相关性分析
三分钟入门量化(七):
三分钟入门量化(七):回归分析
三分钟入门量化(八):
三分钟入门量化(八):资本资产定价模型
三分钟入门量化(九):
三分钟入门量化(九):小市值策略(本地)
上一期我们使用python在本地实现了小市值策略,但没有考虑到实际仓位分配不均等、交易手续费、滑点等问题,因此测算结果不是很精准。今天继续分享如何使用第三方量化平台做策略回测。
聚宽回测框架
我们以聚宽为例,先看一下回测框架。
首先登录到聚宽官网,选择策略研究-策略列表,点击新建策略,选择股票策略。
点击后进入到聚宽的回测环境中,界面展示如下:
由于我们选择的是股票策略,这里官方已经为我们搭建好了股票策略的基本回测框架,分为4个代码块,分别如下:
1.初始化函数initialize()
用于设置一些环境参数,比如:
set_benchmark():设置参照基准,一般选用沪深300作为参考;
log.set_level():设置输出日志级别;
set_order_cost():设置印花税、交易佣金,手续费默认为万分之三,印花税为千分之一;
run_daily():定时任务,用于设置策略什么时候运行、以及运行频率。
除了run_daily()之外,也可以使用handle_data()指定策略的运行频率。handle_data()每个单位时间会调用一次, 如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次。需要注意的是,同一策略中不要同时使用run_daily和handle_data。
2.开盘前运行函数
开盘前我们往往需要预先设定好备选股池,因此这里主要实现选股逻辑。最简单的方式就是直接指定股票代码,示例中指定备选股为平安银行。在run_daily()中指定time='before open',代表运行时间为开盘前(9:00)。
3.开盘中运行函数
开盘中我们需要对备选股和持仓股进行监控,一旦备选股符合买入条件就开仓,持仓股符合卖出条件就清仓。其中order_value()、order_target()为下单函数,用于实现下单功能。
在run_daily()中指定time='open',按天回测运行时间为09:30:00,按分钟回测运行时间为每分钟的第1秒。
4.收盘后运行函数
收盘后我们可以打印出当天的交易记录,或者同步当天的某些特定信息。
在run_daily()中指定time='after close',代表运行时间为收盘后(15:00)半小时内。
上面的几个函数中都带有默认参数context、g。这两个对象都是回测环境中官方已经为我们构建好的,其中context用于存放用户的账户信息、时间信息等,比如:
context.portfolio: 存放账户信息,包括账户总资金、可用资金、持仓股、仓位等等;
context.current_dt:存放当前时间;
g用于存放用户自定义的各类全局变量。
总体来说回测框架清晰简明,用户只需要在此基础上新增自己的功能模块即可,而我们需要实现的任何功能都可以通过各类数据接口来达成。聚宽提供了丰富的数据接口,每个数据接口在官方给出的API文档中都有详细的说明,即用即查,非常方便。
比如编写小市值策略需要用到的市值数据,在股票数据-财务数据中可以查看到数据接口为get_fundamentals():
筛选出市值在20-30亿的股票,实现方式如下:
q = query(
valuation.code,
valuation.market_cap
).filter(
valuation.market_cap.between(20,30)
)
# 选出低市值的股票,构成buylist
df = get_fundamentals(q)
下面我们在回测环境中实现完整的小市值策略。
小市值策略聚宽实现
首先定义初始化函数,在这里可以预先定义好用于市值筛选的query语句,其功能为筛选出市值在20-30亿之间的股票并排序;设置持仓股为10只,设置调仓频率为每月1次。
# 导入函数库
from jqdata import *
# 初始化函数,设定基准等等
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
#定义用于市值筛选的query对象
g.q = query(valuation.code,valuation.market_cap).filter(valuation.market_cap.between(20,30)).order_by(valuation.market_cap.asc())
# 定义持仓数量
g.N = 10
# 每月运行一次
run_monthly(trade, 1)
接下来实现交易函数,其功能为卖出持仓股,买入备选股。
def trade(context):
#筛选初市值在20-30亿之间的股票并按市值升序排序
df = get_fundamentals(g.q)
buylist =list(df['code'])
#过滤停牌股票
buylist = filter_paused_stock(buylist)
#选择其中市值最小的10只
buylist = buylist[:g.N]
#持仓股卖出,如果持仓股在备选股中则不用卖
for security in context.portfolio.positions:
if security not in buylist:
order_target_value(security, 0)
#备选股买入,如果备选股在持仓股中则不用买
buylist=[i for i in buylist if i not in context.portfolio.positions]
if len(buylist)>0:
#每只股资金
cash = context.portfolio.available_cash/len(buylist)
## 买入股票
for security in buylist:
order_value(security, cash)
单独写一个函数,用于过滤停牌股:
# 过滤停牌股票
def filter_paused_stock(stock_list):
current_data = get_current_data()
return [stock for stock in stock_list if not current_data[stock].paused]
写好之后我们设置回测时间为2023-01-01至2023-07-01、回测金额为100000、回测频率为每天,点击运行回测:
查看收益概述:
年化收益38.74%,最大回撤8.06%,累计收益、夏普比率、胜率等指标也都计算好了。曲线中蓝线为策略收益,红线为基准收益。
点击查看交易详情可以看到具体交易了哪些股、盈亏如何:
当然,回测时间太短是无法评估策略是否长期有效的。我们可以修改回测时间为2013.01.01-2023.07.01,重新回测:
10年16倍!长期收益不错,但最大回撤也上升到了33.99%。相比于32.29%年化收益来说,这个回撤有点大,而且回撤时间较长,如果无法接受长期回撤的话需慎用。
毛豆实盘使用的超短线高频量化策略『旋风冲锋』,经历了数十个版本的回测调优,不仅有着超高的年化收益,而且严格控制回撤,实盘效果也非常好。
回测数据:
旋风冲锋策略说明
实盘数据:
『旋风冲锋』策略半年实盘数据大公开!
以上是今天的全部干货内容,本文主要目的是阐述如何通过聚宽平台做策略回测,小市值策略本身如何这里不过多评价,每个人的风险偏好与投资风格不同,适合自身的策略才是最好的策略。
本文是『三分钟入门量化』系列的最后一篇文章,后续毛豆还会分享更多量化相关文章,也会在每个交易日继续和大家分享旋风冲锋策略的实盘情况,欢迎大家点赞关注。