量化交易 第十一课 因子数据处理之标准化

第十一课 因子数据处理之标准化

概述

数据标准化主要是应对特征向量中数据很分散的情况, 防止小数据被大数据 (绝对值) 吞并的情况. 另外, 数据标准化也有加速训练, 防止梯度爆炸的作用.

在这里插入图片描述

标准化

标准化常用的方法是 z-score 标准化. 经过处理后的数据均值为 0, 标准差为 1. 处理方法是:
在这里插入图片描述

  • μ: 样本的均值
  • σ: 样本的标准差

简单说一下 sklearn 的标准化. 没有接触过 机器学习的同志们我建议你们先去看机器学习的内容, 专栏链接:
https://blog.csdn.net/weixin_46274168/category_10621044.html

例子:

In [2]: import numpy as np

In [3]: X_train = np.array([[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]])

In [4]: from sklearn.preprocessing import StandardScaler

In [5]: std = StandardScaler()

In [6]: X_train_std = std.fit_transform(X_train)

In [7]: X_train_std
Out[7]:
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])

方法一

# 方法一
def stand(factor):
    """数据标准化"""
    mean = factor.mean()
    std = factor.std()
    return (factor - mean) / std
    
# 筛选条件
q = query(
    fundamentals.eod_derivative_indicator.pe_ratio
)

# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]

# 标准化处理
fund["pe_ratio_fixed"] = stand(fund["pe_ratio"])

# 画图
plt.style.use('fivethirtyeight')
f, ax = plt.subplots(1,2,figsize=(20,8))
ax[0].bar(fund.index[:500],fund['pe_ratio'][:500], color="red")
ax[1].bar(fund.index[:500],fund['pe_ratio_fixed'][:500])

# 设置x轴
ax[0].set_xticks(fund.index[:501:100])
ax[1].set_xticks(fund.index[:501:100])

# 设置标题
ax[0].set_title("origional")
ax[1].set_title("standard")

plt.show()

输出结果:
在这里插入图片描述

方法二

def mad(factor):
    """3倍中位数去极值"""
    
    # 求出因子值的中位数
    median = np.median(factor)
    
    # 求出因子值与中位数的差值, 进行绝对值
    mad = np.median(abs(factor - median))
    
    # 定义几倍的中位数上下限
    high = median + (3 * 1.4826 * mad)
    low = median - (3 * 1.4826 * mad)
    
    # 替换上下限
    factor = np.where(factor > high, high, factor)
    factor = np.where(factor < low, low, factor)
    return factor

# 筛选条件
q = query(
    fundamentals.eod_derivative_indicator.pe_ratio
)
# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]

# 中位数绝对偏差法
fund["pe_ratio_fixed"] = mad(fund["pe_ratio"])

# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500], color="green")
plt.bar(fund.index[:500],fund['pe_ratio_fixed'][:500])
plt.xticks(fund.index[:501:50])
plt.title("pe_ratio vs pe_ratio_fixed")
plt.show()

输出结果:
在这里插入图片描述
注: 两种方法并没有本质上的区别.

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值