Количественная оценка Python — сбор и обработка данных о факторах

Оглавление

Сбор данных о факторах

Извлеките данные о факторах из стратегии

1) Метод 1: Используйте get_factor_by_code для получения данных о факторах (отдельная акция)

 2) Способ 2: используйте get_factor_by_day для получения данных о факторах (за один день)

3) Способ 3: используйте get_factor_by_factor для получения данных фактора (один фактор)

Кейс: сбор и обработка однофакторных данных

1) Импорт библиотеки

2) Определить функции обработки данных

3) Получить данные фактора

 4) Факторная обработка данных


Сбор данных о факторах

Auto-Trader может получить данные двумя способами:
1) Получить данные о факторах вне стратегии
То есть без использования бэктестинга платформы данные могут быть получены напрямую, в основном для проведения соответствующих исследований по полученным данным.
2) Получить данные о факторах в рамках стратегии
То есть структура тестирования на истории платформы используется для постоянного обновления и получения соответствующих данных о факторах с заданной частотой, которая в основном используется для тестирования стратегии на истории.

Извлеките данные о факторах из стратегии

1) Метод 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) Способ 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) Способ 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