《Python量化投资》02 单因子极值-标准化预处理

一、因子信号的获取

极值处理与标准化:去除极值,降低极值对于数据的影响
标准化:对不同数据进行同一处理的时候需要同一量纲。这样因子与因子就可以进行计算

极值处理:Triming和Winsorizing,一般因子如果极值是不对的原因造成,这样的因子就不能使用了,就Triming,去除这些不用的因子。Winsorizing:当数据中有因子的极值,这样的因子不是错误的,所以只要Winsorizing,对数据进行压缩一下。

中心化:类似于提纯,取出一个因子中不同因素的影响,对因子进行提纯。

行业中性:提出行业的区别,不局限与行业的影响。

在这里插入图片描述

1.1 第一个因子市值原始信号

市值因子需要取负的log:
因子市场逻辑: 1.小市值的公司通常是有着较大的经营风险,投资者应该获得风险补偿;
2.小市值的公司成长性较高,往往都是轻资产的公司。

取对数,会使得对数的值越小会越大,所以需要还取一个log。

为什么是要取对数呢?证券市场上市值大的与小的差异很大,而且大市值的公司少。简而言之,市值的分布如下,而我们通常希望因子的分布尽可能是一个正态分布。

在这里插入图片描述

1.2 市值因子信号的计算
import pandas as pd
import numpy as np
%matplotlib inline

size_data = pd.read_hdf('../data/demo_tpd.h5')

在这里插入图片描述
取出1月22号的所有股票,再取出其市值,再取-log变换。

size_data_one_day = size_data[size_data['data_date'] == '2013-01-22']
size_data_one_day.head()
size_data_one_day['mv'].hist(bins=100)

#取-log变换
size_data['signal_raw'] = -np.log(size_data['mv'])
size_data_one_day = size_data[size_data['data_date'] == '2013-01-22']
size_data_one_day['signal_raw'].hist(bins=100)

在这里插入图片描述
在这里插入图片描述
保存转换后-log后的市值数据到本地

size_data[['data_date', 'secucode', 'signal_raw']].to_hdf('size_signal_raw.h5', key='data')

在这里插入图片描述

二、 因子预处理

2.1 极值处理

在这里插入图片描述
windsorized data

signal = pd.read_hdf('size_signal_raw.h5',key='data')
signal.head()

在这里插入图片描述
取一天的数据实验一下

signal_one_day = signal[signal['data_date'] == '2013-01-28']
signal_one_day.signal_raw.hist(bins=100)

在这里插入图片描述

ceiling = signal_one_day['signal_raw'].quantile(0.975)
floor = signal_one_day['signal_raw'].quantile(0.025)
# 最低的赋值,最高的赋值
signal_one_day['signal_raw'].apply(lambda x:ceiling if x >ceiling else (floor if x < floor else x)).hist(bins = 100)

在这里插入图片描述

将上述的过程绘制成函数,对每一天都进行win操作

def winsor(signal_one_day):
    ceiling = signal_one_day['signal_raw'].quantile(0.975)
    floor = signal_one_day['signal_raw'].quantile(0.025)
    signal_one_day.loc[signal_one_day['signal_raw'] >ceiling,'signal_raw'] =ceilling
    signal_one_day.loc[signal_one_day['signal_raw'] < floor,'signal_raw'] = floor
    
    return signal_one_day['signal_raw']
signal.sort_values(['data_date','secucode'],inplace=True)
signal['signal_win'] = signal.groupby('data_date').apply(winsor).values

在这里插入图片描述

2.2 标准化处理

在这里插入图片描述
定义标准化函数

def std(ser):
    return (ser - ser.mean())/ser.std()

应用函数标准化数据

signal.sort_values(['data_date','secucode'],inplace=True)
signal['signal_std'] = signal.groupby('data_date')['signal_win'].apply(std)

取出某一天的数据观察标准化情况

signal_one_day = signal[signal['data_date'] == '2013-01-22']
signal_one_day['signal_std'].hist(bins = 100)

在这里插入图片描述

signal_one_day['signal_std'].std()
signal_one_day['signal_std'].mean()

0.9999999999999996
-1.9805185359970363e-14

保存计算后的结果

signal[['data_date','secucode','signal_std']].to_hdf('size_signal_final.h5',key='data')
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个Python数据预处理的代码实例。 假设我们有一个包含学生成绩的数据集,文件名为"grades.csv",数据格式如下: ``` Name,Math,English,Science Alice,90,85,92 Bob,80,75,88 Charlie,75,92,82 David,92,87,90 ``` 我们需要进行以下数据预处理操作: 1. 将文件读取为一个Pandas DataFrame。 2. 检查是否有缺失值。 3. 将每个科目的分数转换为百分制。 4. 计算每个学生的平均分。 5. 将每个学生的平均分按照从高到低排序。 6. 将处理后的数据保存为一个新文件。 下面是相应的代码实现: ```python import pandas as pd # 读取数据 df = pd.read_csv("grades.csv") # 检查是否有缺失值 if df.isnull().values.any(): print("Warning: There are missing values in the data.") # 将每个科目的分数转换为百分制 df["Math"] = df["Math"] / 100.0 * 100 df["English"] = df["English"] / 100.0 * 100 df["Science"] = df["Science"] / 100.0 * 100 # 计算每个学生的平均分 df["Average"] = df.mean(axis=1) # 将每个学生的平均分按照从高到低排序 df = df.sort_values(by=["Average"], ascending=False) # 保存处理后的数据为一个新文件 df.to_csv("processed_grades.csv", index=False) ``` 执行完上述代码后,将生成一个新的文件"processed_grades.csv",内容如下: ``` Name,Math,English,Science,Average David,92.0,87.0,90.0,89.66666666666667 Alice,90.0,85.0,92.0,89.0 Charlie,75.0,92.0,82.0,83.0 Bob,80.0,75.0,88.0,81.0 ``` 以上就是一个简Python数据预处理代码实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驭风少年君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值