python量化—因子数据获取与处理

目录

因子数据获取

策略外获取因子数据

1)方法一:利用 get_factor_by_code 获取因子数据(单个股票)

 2)方法二:利用 get_factor_by_day获取因子数据(单天)

3)方法三:利用 get_factor_by_factor 获取因子数据(单个因子)

案例:单因子数据获取及处理

1)导入库

2)定义数据处理函数

3)获取因子数据

 4)因子数据处理


因子数据获取

Auto-Trader获取数据有两种方式:
1) 策略外获取因子数据
即不采用平台的回测框架,可直接获取数据,主要是将获取的数据做相应的研究。
2) 策略内获取因子数据
即采用平台的回测框架,以设定的频率不断刷新获取相应的因子数据,主要是用于策略回测。

策略外获取因子数据

1)方法一:利用 get_factor_by_code 获取因子数据(单个股票

获取单个股票,在一段时间内多个因子的数据。
# 导入atrader库:
from atrader import *
# 方法一:获取平安银行20160101到20160701这段时间 PE、PB因子
数据(单个股票):
factor_data1 = get_factor_by_code(factor_list=['pe'
, 
'pb'], target='SZSE.000001', begin_date='2016-01-01', 
end_date='2016-07-01')
# 打印输出结果:
print(factor_data1)

 2)方法二:利用 get_factor_by_day获取因子数据(单天)

获取单天,多个股票,多个因子的数值。
# 方法二:获取平安银行、万科在20160601这天的PE、PB因子
数据(单天):
factor_data2 = 
get_factor_by_day(factor_list=[‘pe'
, 
'pb'], 
target_list=['SZSE.000001','SZSE.000002'], 
date='2016-06-01')
# 打印输出结果:
print(factor_data2)

3)方法三:利用 get_factor_by_factor 获取因子数据(单个因子)

获取一段时间,多标的的单个因子数据。
# 方法三:获取平安银行、万科在20160101到20160701这段时间
的PE因子数据(单个因子):
factor_data3 = get_factor_by_factor(factor=‘pe'
, 
target_list=['SZSE.000001','SZSE.000002'], 
begin_date='2016-01-01', end_date='2016-07-01')
# 打印输出结果:
print(factor_data3)

案例:单因子数据获取及处理

1)导入库

from atrader import *
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math
from statsmodels import  regression
import statsmodels.api as sm
import scipy.stats as st
import datetime as dt

2)定义数据处理函数

# 3sigma法去极值
def extreme_3sigma(dt,n=3):
    mean = dt.mean()           # 截面数据均值
    std = dt.std()             # 截面数据标准差
    dt_up = mean + n*std       # 上限
    dt_down = mean - n*std     # 下限
    return dt.clip(dt_down, dt_up, axis=1)   # 超出上下限的值,赋值为上下限
# Z值标准化
def standardize_z(dt):
    mean = dt.mean()     #  截面数据均值
    std = dt.std()       #  截面数据标准差
    return (dt - mean)/std
# 申万一级行业
shenwan_industry = {
'SWNLMY1':'sse.801010',
'SWCJ1':'sse.801020',
'SWHG1':'sse.801030',
'SWGT1':'sse.801040',
'SWYSJS1':'sse.801050',
'SWDZ1':'sse.801080',
'SWJYDQ1':'sse.801110',
'SWSPYL1':'sse.801120',
'SWFZFZ1':'sse.801130',
'SWQGZZ1':'sse.801140',
'SWYYSW1':'sse.801150',
'SWGYSY1':'sse.801160',
'SWJTYS1':'sse.801170',
'SWFDC1':'sse.801180',
'SWSYMY1':'sse.801200',
'SWXXFW1':'sse.801210',
'SWZH1':'sse.801230',
'SWJZCL1':'sse.801710',
'SWJZZS1':'sse.801720',
'SWDQSB1':'sse.801730',
'SWGFJG1':'sse.801740',
'SWJSJ1':'sse.801750',
'SWCM1':'sse.801760',
'SWTX1':'sse.801770',
'SWYH1':'sse.801780',
'SWFYJR1':'sse.801790',
'SWQC1':'sse.801880',
'SWJXSB1':'sse.801890'
}
def industry_exposure(target_idx):
    # 构建DataFrame,存储行业哑变量
    df = pd.DataFrame(index = [x.lower() for x in target_idx],columns = shenwan_industry.keys())
    for m in df.columns:        # 遍历每个行业
        # 行标签集合和某个行业成分股集合的交集
        temp = list(set(df.index).intersection(set(get_code_list(m).code.tolist())))
        df.loc[temp, m] = 1      # 将交集的股票在这个行业中赋值为1
    return df.fillna(0)         # 将 NaN 赋值为0
# 需要传入单个因子值和总市值
def neutralization(factor,mkv,industry = True):
    Y = factor.fillna(0)
    Y.rename(index = str.lower,inplace = True)
    df = pd.DataFrame(index = Y.index, columns = Y.columns)    # 构建输出矩阵
    for i in range(Y.shape[1]):       # 遍历每一个因子数据
        if (type(mkv) == pd.DataFrame) | (type(mkv) == pd.Series):
            mkv.rename(index = str.lower,inplace = True)
            lnmkv = mkv.iloc[:,0].apply(lambda x:math.log(x))                   # 市值对数化
            lnmkv = lnmkv.fillna(0)
            if industry:              # 行业、市值
                dummy_industry = industry_exposure(Y.index.tolist())
                X = pd.concat([dummy_industry,lnmkv],axis = 1,sort = False)     # 市值与行业合并           
            else:                     # 仅市值
                X = lnmkv           
        elif industry:                # 仅行业
            dummy_industry = industry_exposure(factor.index.tolist())
            X = dummy_industry
        # X = sm.add_constant(X)     # 添加常数项
        result = sm.OLS(Y.iloc[:,i].astype(float),X.astype(float)).fit()        # 线性回归
        df.iloc[:,i] = result.resid.tolist()                         # 每个因子数据存储到df中
    return df

3)获取因子数据

# 获取因子数据
factor = get_factor_by_factor(factor='pb', target_list=list(get_code_list('hs300',date='2018-01-01').code), 
                              begin_date='2018-01-01', end_date='2020-12-31')
mkv = get_factor_by_factor(factor='mkv', target_list=list(get_code_list('hs300',date='2018-01-01').code), 
                           begin_date='2018-01-01', end_date='2020-12-31')
mkv = mkv.set_index('date').T                        # 设置行标签,然后转置
factor = factor.set_index('date').T

 4)因子数据处理

# 去极值和标准化
factor_S = standardize_z(extreme_3sigma(factor,5.2))
factor_S
# 市值、行业中性化
factor_ID_MV = neutralization(factor_S,mkv)
factor_ID_MV

猜你喜欢

转载自blog.csdn.net/m0_52051577/article/details/130369378
今日推荐