• 研究平台的api
  • get_price("000001.XSHE", start_date="2017-01-01", end_date="2017-01-06")
  • get_trading_dates(start_date="2017-01-01", end_date='2018-01-01')
  • fund = get_fundamentals(q, entry_date="2017-01-03")
  • 数据的组成
  • 面板数据:面板数据结构是为了存储三维的结构,由截面数据和序列数据组成
  • 截面数据:在同一时间,不同统计单位相同统计指标组成的数据列
  • 换成截面数据 面板数据转换 fund[:, '2017-01-03', :]  # 截面数据, DataFrame, 股票代号, 列指标名字
  • 序列数据:在不同时间点上收集到的数据这类数据反映了某一事物,现象等随时间的变化状态或程度  
  • 多因子分析使用的是截面数据!!!
  • 因子数据的处理:
  • 因子去极值处理: 去极值并不是删除“异常数据”,而是将这些数据“拉回”到正常的值
  • 分位数去极值
  • 1、中位数
  • 定义:中位数是指将数据按大小顺序排列起来,形成一个数列,居于数列中间位置的那个数据。中位数用Me(Median简写)表示
  • 2、四分位数
  • 3、百分位数
  • 百分位数即数据所处位置为整体的某个%位数
  • 0 quantile = 0 percentile
  • 0.25 quantile = 25 percentile
  • 0.5 quantile = 50 percentile
  • 将指定分位数区间以为的极值用 分位点的值  替换掉
  • from scipy.stats.mstats import winsorize
    fund["pe_ration_winsorize"] = winsorize(fund['pe_ratio'], limits=0.025)
  • 中位数绝对偏差去极值
  • 经常使用:3倍中位数法
  • MAD 又称为中位数绝对偏差法(Median Absolute Deviation), MAD 是一种先需计算所有因子与中位数之间的距离总和来检测离群值的方法。
# 自实现中位数绝对偏差去极值
def mad(factor):
    """
    实现中位数绝对偏差去极值
    """
    # 1、找到因子中的中位数 median
    me = np.median(factor)
    # 2、得到每个因子指与中位数的绝对偏差值  \x - median\
    # 3、得到绝对偏差值的中位数,MAD,median(\x - median\)
    # np.median(abs(factor - me)) 就是 MAD
    mad = np.median(abs(factor - me))
    
    # 求出3倍中位数的上下限制
    up = me + (3 * 1.4826 * mad)
    down = me - (3 * 1.4826 * mad)
    
    # 利用三倍中位数的值去极值
    factor = np.where(factor > up, up, factor)
    factor = np.where(factor < down, down, factor)
    return factor
  • 正态分布去极值
  • 采取的是3sigma原则
import numpy as np
def threesigma(factor):
    """
    3sigma方法去极值
    """
    # 计算平均值和标准差
    mean = factor.mean()
    std = factor.std()
    # 计算上下限的数据
    up = mean + 3 * std
    down = mean - 3 * std
    
    # 替换极值
    factor = np.where(factor > up, up, factor)
    factor = np.where(factor < down, down, factor)
    
    return factor
  • 总结:
  • 采用中位数绝对偏差法去极值
  • 因子的标准化处理
  • from sklearn.preprocessing import StandardScaler
def stand(factor):
    """
    自实现标准化
    """
    mean = factor.mean()
    std = factor.std()
    
    return (factor - mean) /std