龙空技术网

量化交易的学习——因子处理

青崖白鹿 99

前言:

此刻我们对“数学中的因子是什么意思”大体比较关怀,你们都想要分析一些“数学中的因子是什么意思”的相关内容。那么小编同时在网摘上网罗了一些对于“数学中的因子是什么意思””的相关资讯,希望咱们能喜欢,咱们一起来学习一下吧!

前面的文章里有讲如何学习、学习方法,可以去看我的上一篇文章。到这里,量化投资里很重要的一个元素是因子,无论是个人还是机构,大家都在卷因子,谁能挖到好的因子,谁的策略就能无敌!

那么,

因子是什么?

在量化投资中,因子是用于衡量和预测资产或投资组合的表现的可量化特征。它们是根据历史数据和统计模型构建的,并用于辅助投资决策。以下是一些常见的量化投资因子:

1. 估值因子:基于资产的估值水平,如市盈率、市净率、市销率等。

2. 成长因子:基于资产的增长特征,如盈利增长率、收入增长率等。

3. 市场因子:与整个市场相关的因子,如市场收益率、市场波动率等。

4. 质量因子:基于公司财务指标衡量的因子,如盈利质量、资产负债比率等。

5. 动量因子:基于资产或市场短期表现的因子,如过去一段时间的收益率。

6. 波动因子:基于资产或市场的波动性的因子,如历史波动率、波动率预测等。

7. 尺寸因子:基于公司规模的因子,如市值、市值相对于行业的排名等。

8. 杠杆因子:基于公司债务水平的因子,如资本结构、杠杆比率等。

9. 市场情绪因子:基于投资者情绪的因子,如投资者情绪指数、新闻情绪指标等。

这些因子可以单独使用或组合在一起构建多因子模型,用于量化投资策略的选择、资产配置和风险管理。

简单来说,很基础的数学方程式,小学就学过的:y=f(x),y表示股票收益,x就是因子,我们做策略的目的就是找到这个f(x)的具体公式,从而在未来的市场里套用这个公式,达到赚取收益的目的。

任何数据都有可能成为因子!任何数据都可以加工成新的因子!

数据获取,我一般直接用bigquant的,不用再去清洗数据。数据取出来后,也不是可以直接使用的,一般都有常规的处理方法使数据来适应量化的需求,这里就展示几种处理方法:

本次采用的平台依旧是:BigQuant

去极值

由于数据中会存在异常值或离群值,对整体数据分析会有影响,因此我们需要去极值。去极值的目的是为了减少异常值对整体数据分析的影响,使得数据更加符合正常的分布特征,提高模型的准确性和稳定性。去极值可以帮助我们更好地理解和分析数据,并提取更有效的信息。

1.MAD法

MAD(Median Absolute Deviation)法是一种常用的用于去极值的统计方法。它基于中位数的概念,用于识别和处理数据中的离群值。

MAD法的步骤如下:

计算数据的中位数(Median)。计算每个数据点与中位数的绝对偏差(Absolute Deviation),即将每个数据点与中位数相减并取绝对值。计算绝对偏差的中位数(Median of Absolute Deviation),即对所有绝对偏差值进行排序,取其中间值作为绝对偏差的中位数。计算MAD值,将绝对偏差的中位数乘以一个常数因子(常用的常数因子是1.4826),得到MAD值。定义阈值,通常是MAD值乘以一个常数因子(例如3或2.5),超过该阈值的数据点被认为是离群值。

根据MAD法的计算结果,我们可以判断哪些数据点是离群值,并进行相应的处理,例如修正或剔除,这里我们选择修正。

那么,我们根据以下步骤来实操一下:

第一步,取数据,这次采用代码取,上次是可视化画布取。

import pandas as pdimport pandas as pdfrom bigdatasource.api import DataSourceins=['000001.SZA','000002.SZA','000003.SZA','000004.SZA','000005.SZA']df=DataSource('bar1d_CN_STOCK_A').read(instruments=ins,start_date='2022-01-01',end_data='2023-12-31')df=df[['date','instrument','close']]df

数据结果如图:

第二步,自定义一个因子factor

def calc_factor(df):    df['return_5']=df['close']/df['close'].shift(5)     df['return_10']=df['close']/df['close'].shift(10)    df['factor']=df['return_5']/df['return_10']    return dfdf=df.groupby('instrument').apply(calc_factor)df.dropna(inplace=True)df.sort_values('date',inplace=True)df

结果如下:

第三步,使用mad法,代码中涉及到另一个std法,用if判断。可以直接留下mad法

def winsorize_factor(factor_data,method='mad',n_std=3):    if method=='mad': # mad 法        median=factor_data.median(axis=0) #取中位数        mad=np.median(np.abs(factor_data-median),axis=0) #计算与中位数偏差绝对值,并取中位数         low_bound=median-mad*n_std #设置最低阈值        high_bound=median+mad*n_std #设置最高阈值    elif method=='std':        mean=factor_data.mean(axis=0)        std=factor_data.std()        low_bound=mean-std*n_std        high_bound=mean+std*n_std    else:        raise valueerror('mothd一定是mad或者是std')    factor_data[factor_data<low_bound]=low_bound    factor_data[factor_data>high_bound]=high_bound    return factor_datadf['winsorize_f']=winsorize_factor(df['factor'],'mad')df

第四步,运行结果:

这里运用的是填充法,即用最高/低阈值来填充极值,最终的winsorize_f就是处理后的数据了。

同理,可以使用一下std法。

标准化

为什么要做数据的标准化?

不同尺度的数据:在金融数据中,各种指标的尺度可能会有很大差异。例如,某些指标可能在0到1之间,而其他指标可能在几千到几万之间。如果不进行标准化,那么尺度大的指标可能会在后续的分析中产生过大的影响,从而导致结果的偏误。模型需求:很多机器学习算法和统计模型都对数据的尺度和分布有假设。例如,线性回归模型假设数据是正态分布的,支持向量机(SVM)和深度学习模型则对数据的尺度非常敏感。如果数据没有进行标准化,可能会影响模型的性能。易于理解和解释:标准化后的数据更易于理解和解释。例如,我们可以通过查看标准化后的数据的均值和标准差,来快速了解数据的分布情况。算法收敛速度:对于梯度下降等优化算法,如果数据的尺度不一致,可能会导致收敛速度变慢,甚至无法收敛。

因此,为了保证金融分析的准确性和模型的性能,通常需要对数据进行标准化。

标准化公式=(x-mean)/std

标准化就比较简单了,求出mean和std(标准差)即可。

第一步,取数据,并创建需要标准化的因子factor,先看看结果

import pandas as pdfrom bigdatasource.api import DataSourceins=['000001.SZA','000002.SZA','000003.SZA','000004.SZA','000005.SZA']df=DataSource('bar1d_CN_STOCK_A').read(instruments=ins,start_date='2022-01-01',end_data='2023-12-31')df=df[['date','instrument','close']]def calc_factor(df):    df['return_5']=df['close']/df['close'].shift(5)    df['return_10']=df['close']/df['close'].shift(10)    df['factor']=df['return_5']/df['return_10']    return dfdf=df.groupby('instrument').apply(calc_factor)df.dropna(inplace=True)df.sort_values('date',inplace=True)df

第二步,按照标准化公式=(x-mean)/std,计算被标准化的factor。常在代码里备注是个好习惯。

1、先计算均值和标准差

#标准化=(x-mean)/stdmean=df['factor'].mean()std=df['factor'].std()print(f'均值{mean},标准差{std}')

2、计算被标准化后的factor,zscore就是我们标准化后的值

df['zscore']=(df['factor']-mean)/stddf

3、可以查看一下标准化后的均值和标准差,均值接近0,标准差为1,表明达到了标准化的目的,让数据之间的差异减少。

中性化

常规的有市值中性化和行业中性化。

市值中性化

在投资策略中,有些策略可能对市值较大或市值较小的股票有偏好,这可能会带来一些风险。例如,如果策略偏好市值较大的股票,那么在大市值股票表现不佳的时候,策略的表现可能会受到影响。同样,如果策略偏好市值较小的股票,那么在小市值股票表现不佳的时候,策略的表现也可能会受到影响。

市值中性化就是通过一些数学方法,将策略的市值偏好消除,使得策略在大市值股票和小市值股票之间保持中性,不会因为市值大小的变化而受到影响。这样,策略的表现就更加稳健,对市值大小的敏感性降低。

另外,进行市值中性化,也可以使得策略更加公平地对待各种股票,不会因为市值大小而对某些股票有过多的偏好,也能够提高策略的多样性和稳健性。

下面,我们来具体实现一下市值中性化:

A*X+B=Y

市值*回归系数+提纯因子=未提纯因子

第一步,取数据,需要取总市值数据,数据取的方法同上

第二步,检查是否是空值,避免造成之后的训练中断.

df1.isnull().sum()

isnull返回的是布尔值,布尔值是TRUE和FALSE,以上值表明都是false,没有空值

第三步,计算市值中性化后的“换手提纯因子“,这里先计算线性回归后的残差。

这里使用的是最小二乘法回归后的残差值进行中性化,为什么要使用这个?以及什么是最小二乘法和残差,可以交给chatgpt。

为什么要用线性回归?通过线性回归得到的残差值进行市值中性化,这种方法实际上是在控制市值影响的前提下,提取了'换手率'的纯净部分(提纯换手因子)。这种处理方式实际上考虑到了市值与'换手率'之间可能存在的关系,通过线性回归模型,将'换手率'中可以被市值解释的部分剔除,剩下的部分就是在控制了市值影响后的'换手率',也就是提纯换手因子。

# 计算市值中性化的值import statsmodels.api as sm #statsmodels是一个强大的Python库,用于估计和检验统计模型。它包含了许多统计测试、数据探索以及估计各种统计模型的方法。result=sm.OLS(df1['换手率'].astype(float),df1['总市值'].astype(float)).fit() #OLS是最小二乘法的公式result

需要理解OLS和sm的具体代码吗?不需要,只需要理解原理和使用前人智慧即可。

输出结果:

第四步,将上一步计算出来的残差值赋值给提纯因子

df1['提纯换手因子']=result.residdf1

这样就把提纯后的因子提取出来,不受市值的影响。

同理,可以做一下行业中性化的分析,擅用CHATGPT!

标签: #数学中的因子是什么意思