因子的定义
上下行波动率是历史收益率低于平均收益率的下行波动率比上历史收益率高平均收益率的上行波动率的比率:
DUVOLi=log((nu?1)∑d(rit?rl?)2(nd?1)∑u(rit?rl?)2)
其中,nu为大于平均复合收益率的天数,nd为小于平均复合收益率的天数, rit为股票的日收益率,rl?为股票的60日平均收益率。这是一个衡量股价暴跌可能性的指标,学界通常认为DUVOL较高的股票有着更高的暴跌可能,因此也就有着期望更高的风险溢价。
from quartz_extensions import *
import numpy as np
import pandas as pd
start = ‘2016-01-01’ # 回测起始时间
end = ‘2016-12-01’ # 回测结束时间
benchmark = ‘HS300’ # 策略参考标准
universe = set_universe(‘A’) # 证券池,支持股票和基金
refresh_rate = ‘fri’ # 调仓频率,表示每周五结束之后生成调仓
delay_number = 5 # 信号最大衰减周期
quantile_number = 5 # 分位分组的组数
function_list = [“winsorize”, “neutralize”, “standardize”] # 信号处理函数列表,从前到后进行处理
industry_type = ‘SW1’ # 行业分类类型
自定义因子函数
def foo(data, dependencies=[‘closePrice’], max_window=121):
daily_return = data[‘closePrice’]/data[‘closePrice’].shift(1)-1
daily_return = daily_return.ix[1:, :]
three_month_mean = pd.rolling_mean(daily_return, 60)
up_vol_data = pd.Series()
temp1 = daily_return[60:]
temp2 = three_month_mean[60:]
I_i = temp1 > temp2
up_vol = (((temp1-temp2)*(temp1-temp2))[I_i]).mean()
up_vol = pd.DataFrame(up_vol).T
up_vol.index = [up_vol.index[-1]]
I_i = temp1 < temp2
down_vol = (((temp1-temp2)*(temp1-temp2))[I_i]).mean()
down_vol = pd.DataFrame(down_vol).T
down_vol.index = [down_vol.index[-1]]
factor = down_vol/up_vol
factor = factor.ix[0, :]
return np.log(factor)
注册因子名称
def initialize(account):
a = Signal(‘duvol’, foo)
account.signal_generator = SignalGenerator(a)
调用自定义因子分析函数
create_factor_tear_sheet(‘duvol’, start=start, end=end, benchmark=benchmark, universe=universe, refresh_rate=refresh_rate, delay_number=delay_number, quantile_number=quantile_number, function_list=function_list, industry_type=industry_type, initialize=initialize)