Python量化交易,使用qteasy测试一个多因子选股交易策略
问题介绍
今天我们尝试利用qteasy
来创建一个多因子选股交易策略,看看它能否给我们带来超额收益。
qteasy
是本人正在开发的一个快速量化交易工具包,完全免费使用。利用这个工具包,可以快速灵活地生成各种量化交易策略,生成历史数据并回测策略的表现,有针对性地优化策略的性能;还能模拟实盘自动化交易;不仅如此,qteasy
还内嵌了tushare
,可以快速建立一个本地数据仓库,实现大量金融数据的快速下载、清洗、存储和快速调用。qteasy
目前最新版本为v1.0.20
,并且正在不断迭代中,最新版本可以通过pip
安装。
python -m pip install qteasy
要获取更多信息,请访问Github项目地址或项目文档
策略思想
本策略每隔1个月定时触发,根据Fama-French三因子模型对每只股票进行回归,得到其alpha值。 假设Fama-French三因子模型可以完全解释市场,则alpha为负表明市场低估该股,因此应该买入。计算市场收益率、个股的账面市值比和市值,并对后两个进行了分类, 根据分类得到的组合分别计算其市值加权收益率、SMB和HML. 对各个股票进行回归(假设无风险收益率等于0)得到alpha值.
策略的实现
在另外两篇介绍交易策略的文章中,我们仅仅使用了qteasy的内置交易策略,但是,上面的交易策略属于复杂策略,无法通过简单的内置交易策略实现,也无法通过将多个内置策略复合起来实现,因此,我们必须用到qteasy的自定义交易策略功能,才能实现。
import qteasy as qt
qt.__version__
使用qteasy自定义交易策略
qteasy
提供了三种不同的策略类,便于用户针对不同的情况创建自定义策略。
GeneralStg
: 通用交易策略类,适用于最普遍的情形FactorSorter
: 因子选股类,用户只需要定义出选股因子,便可以通过对象属性实现多种选股动作RuleIterator
: 循环规则类,用户只要针对一支股票定义选股或择时规则,则同样的规则会被循环作用于所有的股票,而且不同股票可以定义不同的参数
qteasy
中的策略自定义非常简单,只需要重写两个方法即可:
__init__()
在此方法中定义策略的运行参数,包括运行的频率、视窗长度、使用的数据类型、可调参数数量类型等realize()
在此方法中定义策略的运行逻辑:根据数据生成交易信号
在这个例子中,我们使用
import qteasy as qt
import numpy as np
def market_value_weighted(stock_return, mv, mv_cat, bp_cat, mv_target, bp_target):
""" 根据mv_target和bp_target计算市值加权收益率,在策略中调用此函数计算加权收益率
"""
sel = (mv_cat == mv_target) & (bp_cat == bp_target)
mv_total = np.nansum(mv[sel])
mv_weight = mv / mv_total
return_total = np.nansum(stock_return[sel] * mv_weight[sel])
return return_total
class MultiFactors(qt.FactorSorter):
""" 开始定义交易策略
"""
def __init__(self, pars: tuple = (0.5, 0.3, 0.7)):
"""交易策略的初始化参数"""
super().__init__(
pars=pars,
par_count=3, # 策略的可调参数有三个
par_types=['float', 'float', 'float'], # 参数1:大小市值分类界限,参数2:小/中bp分界线,参数3,中/大bp分界线
par_range=[(0.01, 0.99)