文章目录
摘要
本文基于优矿量化平台研究了Alpha对冲策略,以Net Profit Growth Rate(60%),ROE(30%),RSI(10%)构建三因子选股模型,以沪深300成分股为股票池,沪深300为基准,回测期间为2015/01/01-2015/12/31。回测结果显示,对冲beta后的多因子选股策略年化收益率从-6.8%下降到-8.7%,对冲beta后,组合的收益波动率(41.3%–8.9%)和最大回撤(46.6%–11.4%)都显著下降,说明了alpha对冲策略能够规避一部分由市场带来的风险。
理论基础
什么是Alpha?
- 假设市场完全有效,根据CAPM模型有,Rs=Rf+βs∗(Rm−Rf)
- 市场并非完全有效,Jensen’s alpha:αs=Rs−[Rf+βs∗(Rm−Rf)]
- 股票的收益是受多方面因素影响的,经典的Fama French三因素就告诉我们,市值大小、估值水平、以及市场因子就能解释股票收益,而且低市值、低估值能够获取超额收益。
- 假设我们已经知道了哪些因子能够获取超额收益,那么我们根据这些因子构建股票组合(比如持有低市值、低估值的股票)
- 持有组合,做空基准,对冲获取稳定的差额收益(alpha收益)
可视化展示
# 假设构建的多头组合每天跑赢基准0.1%
data = DataAPI.MktIdxdGet(ticker='000300', beginDate='20130101', field='tradeDate,CHGPct', pandas='1').set_index('tradeDate').rename(columns={
'CHGPct':'benchmark'})
data['portfolio'] = data['benchmark'] + 0.001
data.cumsum().plot(figsize=(12,5))
假设构建的多头组合每天跑赢基准0.1%,那么portfolio高于benchmark那一部分的收益即为Alpha收益。
Alpha对冲适用于什么样的市场环境?
1. 高波动性市场:
当市场波动性较高时,Alpha对冲策略可以帮助降低投资组合的整体风险水平,实现更稳定的收益。在这种情况下,对冲策略可以减少投资组合受到市场波动影响的程度。
2. 市场走势不确定:
当市场走势不确定或无法准确预测时,Alpha对冲策略可以提供一种方式来保护投资组合免受市场波动的影响。通过对冲市场风险,投资者可以在市场波动时保持相对稳定的投资收益。
3. 特定风险敞口管理:
对于特定的风险敞口,如利率风险、汇率风险或行业风险等,Alpha对冲策略可以帮助投资者有效管理和降低这些风险的影响。通过对冲特定的风险敞口,投资者可以实现更为稳健的投资组合表现。
4. 市场阶段转换:
在市场阶段转换或调整期间,Alpha对冲策略可以提供一种有效的方式来应对市场的变化,并帮助投资者调整其投资组合以适应新的市场环境。
总的来说,Alpha对冲策略适用于需要管理市场波动性、保护投资组合免受风险影响或者调整投资组合以适应新的市场环境的情况下。然而,投资者在实施Alpha对冲策略时需要谨慎考虑各种因素,并根据市场情况和投资目标进行合理的风险管理和决策。
策略实现
-
第一步:制定一个选股策略,构建投资组合,使其同时拥有alpha和beta收益。
(本策略选取过去一天EV/EBITDA值并选取30只EV/EBITDA值最小且大于零的股票) -
第二步:做空股指期货,将投资组合的beta抵消,只剩alpha部分。
-
第三步:进行回测。
策略设置
- 股票池:沪深300成分股
- 基准:沪深300
- 期货标的:CFFEX.IF对应的真实合约
- 因子选取及权重:Net Profit Growth Rate(60%),ROE(30%),RSI(10%)
- 因子处理:去极值(winsorize)、标准化(standardize)、中性化(neutralize)
- 回测初始资金:1000万
- 回测期间:2015/01/01–2015/12/31
回测环境
优矿量化平台
(本地python环境跑不出来)
策略代码
- 非对冲多因子策略代码:
from CAL.PyCAL import *
import numpy as np
from pandas import DataFrame
start = '2015-01-01' # 回测起始时间
end = '2015-12-31' # 回测结束时间
universe = DynamicUniverse('HS300') # 证券池
benchmark = 'HS300' # 策略参考标准
freq = 'd'
refresh_rate = 1
capital_base = 10000000
cal = Calendar('China.SSE')
period = Period('-1B')
#配置账户信息,支持多资产多账户
stock_commission = Commission(buycost=0.0, sellcost=0.0, unit='perValue')
slippage = Slippage(value=0, unit='perValue')
accounts = {
'stock_account': AccountConfig(account_type='security',capital_base=capital_base,commission=stock_commission,slippage=slippage)
}
def initialize(context):
context.signal_generator = SignalGenerator(Signal('NetProfitGrowRate'),Signal('ROE'),Signal('RSI'))
context.need_to_switch_position = False
context.contract_holding = ''
pass
def handle_data(context):
universe = context.get_universe(exclude_halt=True)
yesterday = context.previous_date
signal_composite = DataFrame()
# 净利润增长率
NetProfitGrowRate = context.signal_result['NetProfitGrowRate']
signal_NetProfitGrowRate = standardize(neutralize(winsorize(NetProfitGrowRate),yesterday.strftime('%Y%m%d')))
signal_composite['NetProfitGrowRate'] = signal_NetProfitGrowRate
# 权益收益率
ROE = context.signal_result['ROE'