前言
笔者最近开始学习量化投资,先从alpha对冲模型开始,主要通过搜索网上的文章进行研究,整体来说受益匪浅,要感谢各位分享的前辈。但是在阅读这些文章的过程中我发现,当前的一些教程存在着以下的不足之处:(1).内容过于分散,不够系统化
(2).很多都只是利用因子回测,没有进行对冲
(3).对于初学者来说并不是非常友好,有些策略甚至无法成功运行或者代码已经过时
因而,我这里尝试对这些文章的内容进行总结,加上个人的补充,希望能够进行一个分享,同时对于自身也是一个提高。所有借鉴过的文章和书籍在文末都有列出。本文较为基础,并没有涉及复杂的交易策略。
策略运行环境
优矿平台Alpha对冲策略简介
1.Alpha策略
Alpha策略最初是由William Sharpe在1964年的著作《投资组合理论与资本市场》中首次提出的,并指出投资者在市场中交易面临系统性风险和非系统性风险,用公式表达如下:Rs=Rf+βs∗(Rm−Rf)
式中,Rs表示股票收益,Rf表示无风险收益率,Rm表示市场收益,βs表示股票相比于市场的波动程度,用以衡量股票的系统性风险。CAPM模型主要表示单个证券或投资组合同系统风险收益率之间的关系,也就是说,单个投资组合的收益率等于无风险收益率与风险溢价之和。
由于市场并非完全有效,个股仍存在alpha(超额收益)。 根据Jensen’s alpha的定义:αs=Rs−[Rf+βs∗(Rm−Rf)],除掉被市场解释的部分,超越市场基准的收益即为个股alpha。
2.Alpha对冲策略
Alpha对冲策略也被市场中性Alpha策略。通过衍生品来对冲投资组合的系统风险β,锁定超额收益Alpha。因此首先需要寻找稳定的Alpha,构建Alpha组合,进而计算组合的β来对冲风险。Alpha策略成功的关键就是寻找到一个超越基准(具有股指期货等做空工具的基准)的策略。比如,可以构造指数增强组合+沪深 300 指数期货空头策略。这种策略隐含的投资逻辑是择时比较困难,不想承受市场风险。多因子策略代码解析
网上有很多单因子和多因子策略,在我阅读下来的感受就是依靠个人选择因子组合来实现较高年化收益率。通过学习和研读这些策略的源码,可以帮助我们较快地去掌握策略编写的过程。这里详细介绍下一个利用净利润增长率、权益收益率(ROE)、相对强弱指标(RSI)的多因子策略。这个策略的代码是我在《量化分析师的Python日记【第14天:如何在优矿上做Alpha对冲模型】》这篇文章的代码基础上进行改进的。1.基础参数设置
1 | end = '2015-08-01' # 回测结束时间 |
(1)benchmark
为策略参照标准,即该量化策略回测结果的比较标准,通过比较可以大致看出策略的好坏。这里我们主要和HS300进行比较。这里比较常用的策略包括有SHCI(上证综指)、SH50(上证50)、
SH180(上证180)、HS300 (沪深300)和 ZZ500(中证500)。
(2)universe
universe 指策略回测的证券池,即策略逻辑作用的域,下单与历史数据获取都只限于universe中的证券。这个策略使用的是set_universe函数。实际上uqer上支持用以下三种方式获得政权池:DynamicUniverse、set_universe 和 StockScreener。实际策略的回测中,我们建议用DynamicUniverse的方式来获得证券池。后者用于返回动态证券池实例。在使用板块成分股、指数成分股或行业成分股作为策略的交易对象时,策略框架会根据实际情况调整当天股票池的内容,避免幸存者偏差。
2.日期设置
1 | # 构建日期列表 |
这部分比较简单,其实就是获取每个月的最后一天,收集一个日期集,作为交易信号。
3.帐户配置
1 | accounts = { |
这里简单配置了一个股票帐户。事实上,这里可配置的帐户类型还可以有期货、场外基金等。并且可以设置包括滑点在内的多个参数。
4.帐户初始化和执行交易指令
1 | def initialize(context): # 初始化虚拟账户状态 |
在uqer上,只需要定义initialize和handle_data这两个函数,系统就会帮助你执行交易策略了,具体的交易逻辑都是写在handle_data当中,也可以自己定义一些函数。
5.获取因子
(1)净利润增长率1 | NetProfitGrowRate =DataAPI.MktStockFactorsOneDayGet(tradeDate=yesterday.strftime('%Y%m%d'),secID=universe,field=u"secID,NetProfitGrowRate",pandas="1") |
利用函数DataAPI.MktStockFactorsOneDayGet可以获取到我们想要的因子,这里我们获取到了净利润增长率。打印下结果是这样子的。
1 | secID NetProfitGrowRate |
1 | NetProfitGrowRate.columns = ['secID','NetProfitGrowRate'] |
接下来,对数据进行排序,对数值进行一系列的去极值、标准化等的操作。
(2)ROE
1 | ROE = DataAPI.MktStockFactorsOneDayGet(tradeDate=yesterday.strftime('%Y%m%d'),secID=universe,field=u"secID,ROE",pandas="1") |
(3)RSI
1 | RSI = DataAPI.MktStockFactorsOneDayGet(tradeDate=yesterday.strftime('%Y%m%d'),secID=universe,field=u"secID,RSI",pandas="1") |
6.构建score矩阵
1 | weight = np.array([0.4, 0.3, 0.3]) # 信号合成,各因子权重 |
我们获得了三个因子之后,还需要利用这三个因子选择股票。因而,这里设置了一个权重来选股。通过改变权重,策略也会相应改变,可以试着尝试不同的权重来看看年化收益率的变化。
7.获取目标股票
1 | total_score = Total_Score['total_score'].to_dict() |
这里主要用到的是simple_long_only这个函数,返回了利用total_score获得的排名前30%的股票。
8.获取目标股票的SecID
1 | RSI['wts'] = np.nan |
这里的操作就是获取目标股票的SecID,后面买操作的时候需要。这里是利用RSI这个DataFrame来进行操作的。
9.买卖股票
1 | # 先卖出 |
这里的策略很简单,直接全卖了,然后再把buylist里面的股票买一遍。看到这里的话,整个策略的逻辑已经非常清晰了,如果有其他的策略,可以在这个模板的基础上进行修改。我这里附上整个完整的策略。
1 | from CAL.PyCAL import * |
策略的回测结果如图。
Alpha对冲策略
在了解了如何利用多因子策略后,我们就可以加入购买期货合约的部分来实现一个对冲了。而2015年的大涨和大跌可以作为我们进行检验回测的时间段。下面用来讲解策略的代码主要来自于文章《多因子股票-股指期货 多空对冲策略 小白解读》。讲解的内容则主要是期货部分的代码。1.帐户设置
1 | accounts = { |
帐户这里多了一个期货帐户,主要是为了后面增加期货交易的逻辑。
2.获取当前合约持仓状态
1 | future_account = context.get_account("futures_account") |
这里IFL0代表的是当月合约。如果当前没有持仓合约,那么就准备购买当月主力合约。
3.对持有合约进行处理
1 | last_trade_date = get_asset(contract_holding).last_trade_date |
先取得合约的最后交割日,计算下离今天还有多久。因为在交割日前波动大,为了降低风险,我们选择在交割日前3天平仓。
1 | if days_to_expire == 3: #接近交割日股指期货一般波动异常,所以一般要提前几天交割 |
接下来的操作比较简单,如果快到交割日了,获取当前持仓量,全平后以相同的数量买进下月的期货。
4.对当前持有股票进行对冲
1 | contract_current_month = context.get_symbol('IFL0') |
如果当前的股票没有对冲,那么就购买期货合约进行对冲。这里需要先获取一个合约乘数,计算出要购买的合约的数量,也就是total_hedging_amount。然后购买相应数量的期货合约。
5.对期货进行调仓
1 | total_hedging_amount = int(stock_positions_value / futures_price / multiplier) #计算对冲总数量 |
在当前有持仓的情况下,判断是否需要调整。和上面一样,计算出一个total_hedging_amount,并计算出和当前持仓量的差异,如果差异大过阈值2,就需要进行一个调整。比较尴尬的是,这个策略在某书籍中给出的时候没有测量15年全年的收益,而是测了半年,所以书中的收益率很高,在我将事件设置为全年后,模型的年化收益率感人。
整体的期货逻辑就是这样子,原文对每行代码有详细解读,如果想继续深入看的可以看看这个链接的内容:
https://uqer.io/v3/community/share/594aa088fba7a70057b0c0e6
Fama-French三因子模型对冲
Fama和French 1993年指出可以建立一个三因子模型来解释股票回报率。模型认为,一个投资组合(包括单个股票)的超额回报率可由它对三个因子的暴露来解释,这三个因子是:市场资产组合(Rm− Rf)、市值因子(SMB)、账面市值比因子(HML)。
β、si和hi分别是三个因子的系数,回归模型表示如下:
1 | Rit− Rft= ai+ βi(Rmt− Rft) + SiSMBt+ hiHMIt+ εit |
在文章 破解Alpha对冲策略——观《量化分析师Python日记第14天》有感 的最后,作者给出了这个三因子模型,实际上作者选择的是PE 和 LFLO这两个因子来选股。整个模型获得了不错的年化收益率。于是我大胆想象,如果将这个三因子模型放到对冲模型中,会有怎样的效果。事实就是,在收益率在上面的对冲模型的基础上进一步下跌了。如果有兴趣的朋友可以试下我下面的代码。
1 | from CAL.PyCAL import * |
由此可见,找到一个好的策略实在是非常困难。
总结
此处我分析了多因子策略、对冲策略、三因子模型对冲,总结下来,其实当前很多策略代码都是加过某种“修饰”,具体效果并不好。后期我的研究可能会有以下内容1.学习更多策略
2.尝试不用平台实现自己的回测框架