第十课 因子数据处理之去极值

  • 概述
  • 因子 Panel 结构分析
    • 截面数据
    • 序列数据
  • 因子去极值
  • 分位数去极值
    • 中位数
    • 四分位数
    • 百分位数
    • 原理
    • 分析
    • 代码实现
  • 中位数绝对偏差去极值
    • 计算方法
    • 代码实现
  • 正态分布去极值
    • 代码实现
  • 总结

概述

在我们构建策略之前首先要对得到的数据进行预处理. 去极值就是排除一些极端值的干扰. 如图:

因子 Panel 结构分析

Pandas 当中面板数据结构是三维的结构. 由截面数据和序列数据组成.

代码:

get_price("000001.XSHE", start_date="2020-01-01", end_date="2020-01-06")

输出结果:

price = get_price(["000024.XSHE","000001.XSHE","000002.XSHE"], start_date="2015-04-01",end_date="2015-04-12")
price

输出结果:

截面数据

截面数据: 在同一时间, 不同统计单位相同统计指标组成的数据列.

# 获取个别财务数据
q = query(fundamentals.income_statement.revenue,fundamentals.income_statement.cost_of_goods_sold
).filter(fundamentals.stockcode.in_(["000024.XSHE","000001.XSHE"])
)fund = get_fundamentals(q, entry_date="2020-01-03")# 换成截面
fund.iloc[:,0,:]

输出结果:

# 获取所有财务数据
q = query(fundamentals.income_statement.revenue,fundamentals.income_statement.cost_of_goods_sold
)fund = get_fundamentals(q, entry_date="2020-01-03")# 换成截面
fund.iloc[:,0,:]

输出结果:

序列数据

序列数据: 在不同时间点上收集到的数据. 这类数据反映了某一事物, 现象等随时间变的化状态或程度.

注: 多因子分析使用的是截面数据而不是序列数据.

因子去极值

首先我们需要明白, 去极值不是删除 “异常数据”, 而是将这些数据 “拉回” 到正常的值.

去极值分为三种方法:

  • 分位数去极值
  • 中位数绝对偏差去极值
  • 正态分布去极值

分位数去极值

首先我们来了解几个概念:

  1. 中位数
  2. 四分位数
  3. 百分位数

中位数

中位数是指将数据按大小顺序排列起来, 形成一个数列. 中位数就是居于数列中间位置的那个数. 中位数用 Me (Median 简写) 表示.

从上图我们可以看出中位数相较于平均数受极大值 / 极小值的影响较小. 所以我们选择中位数而不是平均数.

四分位数

四分位数即把所有数值由小到大排列并分成四等分. 处于三个分割点位置的数值就是四分位数.

  • 第一四分位数 (Q1), 又称 “较小四分位数”, 等于该样本中所有数值由小到大排列后第 25% 的数字
  • 第二四分位数 (Q2), 又称 “中位数”, 等于该样本中所有的数值由小到大排序后第 50% 的数字
  • 第三四分位数 (Q3), 又称 “较大四分位数”, 等于该样本中所有的数值由小到大排序后第 75% 的数字

百分位数

百分位数即数据所处位置为整体的某个 % 位数. 关于百分位数有两种称呼, quantile 和 percentile.

原理

分位数去极值的原理是将指定分位数区间以外的极值用分位点的值替换掉.

分析

  • 获取指定某个日期或者区间段的 pe_ratio 截面数据
  • 分位数去极值
  • 去极值结果与极值前结果比较

代码实现

函数:

import numpy as np# 求出两个分位数的点的值
def quantile(factor, up, down):"""分位数去极值"""up_scale = np.percentile(factor, up)down_scale = np.percentile(factor, down)factor = np.where(factor > up_scale, up_scale, factor)factor = np.where(factor < down_scale, down_scale, factor)return factor

代码:

# 筛选条件
q = query(fundamentals.eod_derivative_indicator.pe_ratio
)# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]# 上下 2.5% 处理
fund["pe_ratio_fixed"] = quantile(fund["pe_ratio"], 97.5, 2.5)# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500])
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()

输出结果:

中位数绝对偏差去极值

绝对偏差法 (MAD: Median Absolute Deviation) 是一种先需计算所有因子与中位数之间的距离综合来检测离群值的方法.

计算方法

  1. 找出因子的中位数 median
  2. 得到每个因子值与中位数的绝对偏差 |x - median|
  3. 得到绝对偏差值的中位数, MAD, median(|x - median|)
  4. 计算 MAD_e = 1.4826*MAD. 然后确定参数 n, 做出调整

去极值判断:

注: 通常把偏移中位数三倍设为 MAD_e. 如果样本满足正态分布且足够大, 我们可以证明超过上下限的值为异常值.

代码实现

函数:

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()

输出结果:

正态分布去极值

正态分布 (Normal Distribution):

  • 1σ: 68.27% 的数据落在一个标准差之内
  • 2σ: 95.45% 的数据落在两个标准差之内
  • 3σ: 99.73% 的数据落在三个标准差之内
  • 4σ: 99.99% 的数据落在四个标准差之内

代码实现

def three_sigma(factor):"""3 sigma 去极值"""# 求出因子数据的平均数和标准差mean = factor.mean()std = factor.std()# 左右的数据加减 3 个标准差high = mean + (3 * std)low = mean - (3 * std)# 替换极值数据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, :]# 3 sigma 去极值
fund["pe_ratio_fixed"] = three_sigma(fund["pe_ratio"])# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500], color="orange")
plt.bar(fund.index[:500],fund['pe_ratio_fixed'][:500], color= "red")
plt.xticks(fund.index[:501:50])
plt.title("pe_ratio vs pe_ratio_fixed")
plt.show()

输出结果:

总结

在做去极值的时候最好不要用正态分布去极值法, 推荐使用分位数和中位数绝对偏差去极值.

量化交易 第十课 因子数据处理之去极值相关推荐

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

    第十一课 因子数据处理之标准化 概述 标准化 方法一 方法二 概述 数据标准化主要是应对特征向量中数据很分散的情况, 防止小数据被大数据 (绝对值) 吞并的情况. 另外, 数据标准化也有加速训练, 防 ...

  2. 量化交易 第十二课 因子数据处理之市值中性化

    第十二课 因子数据处理之市值中性化 概述 市值影响 怎么去除市值影响 回归法 简介 流程分析 代码实现 概述 众所周知, 行业和市值是两个十分显著对因子有影响力的因素. 在进行截面回归判断每个单因子的 ...

  3. 量化交易 实战第九课 多因子相关性分析

    量化交易 实战第九课 多因子相关性分析 概述 研报分析结果 代码实现 导包 总资产回报率 IC 资本回报率 IC 计算相关性 概述 相关性 (Correlation) 在统计中是与独立性 (Indep ...

  4. 量化交易 实战第一课 策略入门

    量化交易 实战第一课 策略入门 概述 要求 指标 市净率 股票市值 代码实现 概述 不管是技术分析还是基本面分析, 我们在进行投资的时候会选择某些表现好的股票来作为一个股票池. 从中进行交易的判断 ( ...

  5. 量化交易 实战第二课 金融时间序列分析 Part 1

    量化交易 实战第一课 金融时间序列分析 Part 1 概述 平台 获取股票数据 需求 函数 index_components - 获取指数成分股列表 get_price - 合约历史数据 代码 统计分 ...

  6. 股票量化交易策略:多因子筛选练习

    一.多因子筛选阶段介绍 1. 筛选阶段的任务 基本面数据因子(特征)如此之多,那么如何去找到对应的对股票收益率比较好的.并且能在未来一段时间给我们的选股收益率提供帮助. 2.挖掘因子的过程 我们可以大 ...

  7. 量化交易 聚宽 多因子策略(市值, ROE)

    量化交易 聚宽 多因子策略(市值, ROE) # 导入函数库 from jqdata import *# 初始化函数,设定基准等等 def initialize(context):# 设定沪深300作 ...

  8. Python量化交易05——基于多因子选择和选股策略(随机森林,LGBM)

    参考书目:深入浅出Python量化交易实战 在机器学习里面的X叫做特征变量,在统计学里面叫做协变量也叫自变量,在量化投资里面则叫做因子,所谓多因子就是有很多的特征变量. 本次带来的就是多因子模型,并且 ...

  9. 量化交易初级阶段——简单多因子策略实现指数增强

    多因子策略是量化交易之中最为常见的策略之一,相当于技术指标之中的均线,只要是学量化都会学到多因子策略. 多因子的总体思路很像高考.现在高考也是刚刚结束,也祝愿各位考生金榜题名!我就按照高考的思路简单说 ...

最新文章

  1. Response.Redirect 打开新窗体的两种方法
  2. JavaScript学习总结(二)——逻辑Not运算符详解
  3. java添加删除用户信息泄露_java删除用户404错误!!神奇!增改查都没问题啊!!...
  4. spring api 中文_Spring高级技术梳理
  5. matlab保存数据到excel_Excel意外退出数据未保存?这个方法可以帮你找回所有数据...
  6. coreldraw登录老是出现未知错误_原神:新版本bug频出,史莱姆消失,联机模式提示506错误码...
  7. 前端直接读取文本文件内容
  8. Linux DRM KMS 驱动简介
  9. 小甲鱼零基础入门python课后作业及答案_小甲鱼python视频第四讲(笔记及课后习题答案)...
  10. 福利时间(1):Scala 入门视频
  11. python程序题库-python题库-Python,题库
  12. javascript 判断为负数_JavaScript判断数字正负数
  13. C语言协程库async
  14. Can‘t connect to MySQL server on ‘localhost‘ (10061)
  15. Vue绘制折线图并渲染数据
  16. Java 消息队列、缓存、同步(个人理解:空谈)
  17. ZZULIOJ:1125: 上三角矩阵的判断
  18. 正则表达式 Exel单元格
  19. javascript--浅谈函数与闭包
  20. SOCKET学习第三阶段(SELECT模型)

热门文章

  1. RewriteRule htaccess详细语法使用教程
  2. 逻辑编排在优酷可视化搭建中的实践(一) - 逻辑与Runtime
  3. TV HD android,芒果TV HD官方下载-芒果TV HD 安卓版v6.8.8-PC6安卓网
  4. html我的家乡作业,我的家乡作文7篇
  5. LD(Local descriptor)
  6. oracle mrp全称,【简答题】MRP和MRP2的中文和英文全称分别是什么? (20.0分)
  7. Intellij IDEA最常用快捷键
  8. Android TV开发:APP安装、ICON图标问题
  9. 智能车竞赛线上培训:英飞凌AURIX™的智能车培训入门篇
  10. Educational Codeforces Round 67小结