本模板主要用於分析標準庫Alpha101,和Alpha191兩個標準庫中的因子,以及使用def()方式自定義的因子進行全信息分析,只用引入因子,設置測試時間,測試股票池子,就能實現快速的完成因子測試,本模板基於聚寬的因子研究模板,做了適當的修改。在此感謝聚寬。
標準因子庫因子分析模板¶
# 導入函數庫
from jqdata import *
import numpy as np
import pandas as pd
import jqfactor
from jqlib import alpha191
from jqlib.alpha191 import *
from jqfactor import get_factor_values
from jqfactor import Factor
from jqfactor import analyze_factor
warnings.filterwarnings('ignore')
#獲取交易日期列表
#四個參數分別為開始日期,結束日期,交易周期('day','month','quarter','halfyear'),count:天數,與start二者取其一
def get_tradeday_list(start,end,frequency=None,count=None):
if count != None:
df = get_price('000001.XSHG',end_date=end,count=count)
else:
df = get_price('000001.XSHG',start_date=start,end_date=end)
#如果頻率為“day”或者沒有設置,直接返回df.index
if frequency == None or frequency =='day':
return df.index
else:
#否則增加一列'year-month',值為前7位
df['year-month'] = [str(i)[0:7] for i in df.index]
if frequency == 'month':
return df.drop_duplicates('year-month').index#刪除重複項,設置'year-month'為index
elif frequency == 'quarter':#季度
df['month'] = [str(i)[5:7] for i in df.index]
df = df[(df['month']=='01') | (df['month']=='04') | (df['month']=='07') | (df['month']=='10') ]
return df.drop_duplicates('year-month').index
elif frequency =='halfyear':
df['month'] = [str(i)[5:7] for i in df.index]
df = df[(df['month']=='01') | (df['month']=='06')]
return df.drop_duplicates('year-month').index
# 設置起止時間
start='2016-07-01'
end='2016-08-01'
# 設置調倉周期
periods=(5,10,20)
# 設置分層數量
quantiles=5
#獲取日期列表
date_list = get_tradeday_list(start=start,end=end,count=None)#獲取回測日期間的所有交易日
date_list
#定義一個空的dataframe記錄因子值
factor_df = pd.DataFrame()
#循環計算給定日期範圍的因子值
mark = 1
for d in date_list:
pool = get_index_stocks('000905.XSHG',date=d)
#alpha191.alpha_005為因子庫,標準因子,也可以用定義因子函數
far=alpha191.alpha_005(pool, end_date=d)
if mark == 1:
factor_df = far
mark = 0
else:
#逐日合並factor_df
factor_df = pd.concat([far,factor_df],axis=1,sort=True)
#將columns更改為可以日期標簽
factor_df.columns = date_list
factor_df.head()
#數據清洗、包括去極值、標準化、中性化等,並加入y值
from jqfactor import *
for date in date_list:
#對數據進行處理、標準化、去極值、中性化
#factor_df = winsorize_med(factor_df, scale=3, inclusive=True, inf2nan=True, axis=0) #中位數去極值處理
se = standardlize(factor_df[date], inf2nan=True) #對每列做標準化處理
se = neutralize(se, how=['liquidity'], date=date)#剔除原始因子值與流動性相關的部分
factor_df[date] = se
#進行轉置,調整為分析可用的格式
factor_df = factor_df.T
factor_df.head()
#使用獲取的因子值進行單因子分析
far = analyze_factor(factor=factor_df, start_date=date_list[0], end_date=date_list[-1], weight_method='avg', industry='jq_l1', quantiles=quantiles, periods=periods,max_loss=0.3)
# 打印信息比率(IC)相關表
far.plot_information_table(group_adjust=False, method='rank')
# 畫各分位數平均收益圖
far.plot_quantile_returns_bar(by_group=False, demeaned=0, group_adjust=False)
# 打印換手率表
far.plot_turnover_table()
#調用因子分析方法,進行因子信息全覽
far.create_full_tear_sheet(demeaned=False, group_adjust=False, by_group=False, turnover_periods=None, avgretplot=(5, 15), std_bar=False)
# 計算指定調倉周期的各分位數每日累積收益
df = far.calc_cumulative_return_by_quantile(period=5)
#進行數據展示
df.plot(figsize=(15,6))