1. 程式人生 > >上下行波動率因子

上下行波動率因子

因子的定義
上下行波動率是歷史收益率低於平均收益率的下行波動率比上歷史收益率高平均收益率的上行波動率的比率:

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)