Skip to content

Latest commit

 

History

History
 
 

multifactorial_model

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

1.calculate_parameters文件夹:

  • 1.1 以begin为前缀的py文件是通过wind的数据接口下载数据存储到本地的mysql数据库中,会得到两个数据表:table_day_data,table_month_data。
  • 1.2 以calculate为前缀的py文件是计算我们自己的因子库,并把计算的结果存储到1.1中的table_month_data数据表中。
  • 1.3 recover_month_data.py是用来修复经过1.1和1.2之后的数据表。
  • 1.4 以stocks开头的py文件是用来存储沪深300和中证500的股票信息。
  • 1.5 deal_with_day_data.py是提供一些基本的功能函数。

2.clean文件夹:

  • 2.1 add_industry_dummy_variables.py是把行业数据添加到table_month_data数据表中
  • 2.2 get_clean_store_data.py对table_month_data中的数据进行清洗得到一个新的数据表all_stocks_cleaned_factors_table,final_clean.py是对all_stocks_cleaned_factors_table中的数据进行清洗得到一个新的数据表final_all_stocks_cleaned_factors_table
  • 2.3 auto_regression_tvalue_correlation.py是计算得到t值和ic值 ,auto_regression_improved_correlation.py是对ic值计算方法改进后,得到的ic值

3.backtest文件夹:

  • 3.1 tmp.py进行回测,在控制台会输出每个月末选出的股票组合,该组合中各个股票的收益率,以及该组合总体的收益率,最后绘制出2010年到2016年收益率的曲线图。

注意:回测中采用的均是等权重

补充:

去极值的方法:

一. 分位数去极值

比如前后5%的分位数点,将大于或小于分位数的点的值删除掉

二. 3倍标准差

当数据的分布是类正态分布的时候,可以使用3倍标准差的方法。注意使用的是均值

三. 中位数去极值
  • 中值滤波,使用中值滤波非常有可能改变原有位置的值,在wiki中举的例子可以明显看到
  • 中位数去极值,直接使用与中位数的相对距离去除异常值
  • MAD方法,与上面提到的3倍标准差法很相似,但是用的是中位数,而不是均值。

更具体点(参考优矿)

异常值的识别

1. 固定比例法

把上下2%的值进行拉回,认为这些数据不可信。

2. 均值标准差法

这种想法的思路来自于正态分布,假设X∼N(μ,σ2),那么:

P(|X−μ|>k∗σ)={0.317,k=1 0.046,k=2 0.003,k=3 通常把三倍标准差之外的值都视为异常值,不过要注意的是样本均值和样本标准差都不是稳健统计量,其计算本身受极值的影响就非常大,所以可能会出现一种情况,那就是我们从数据分布图上能非常明显的看到异常点,但按照上面的计算方法,这个异常点可能仍在均值三倍标准差的范围内。因此按照这种方法剔除掉异常值后,需要重新观察数据的分布情况,看是否仍然存在显著异常点,若存在则继续重复上述步骤寻找异常点。 理解:因为剔除掉极值后,样本的方差可能发生变化了(正如文中所说,它不是一个稳健的估计量),每次剔除通常都会变化——就是因为这个,所以需要重复的去做。

如果数据不服从正态分布,可以通过切比雪夫不等式依然可以对均值的若干倍标准差之外的样本数据量的占比进行估计:

​ P(|X−μ|>k∗σ)<=1/k2

坏处对于这样的方法,上面不等式右边的上界数值会偏大,在数据分布的偏度和峰度影响下,这种方法可能会把过量的数据认定为异常点。 如果通过Box-Cox变换将不服从正态分布的数据转化为服从正态分布的数据,那么是否可行呢?熟悉Box-Cox变换方法的都知道,经过这样的一个变换,例如就取对数,它会缩小数据之间的距离,这样可能会使得原来是异常值的点变为不是异常值。

3. MAD法

MAD 法是针对均值标准差方法的改进,把均值和标准差替换成稳健统计量,样本均值用样本中位数代替,样本标准差用样本MAD(Median Absolute Deviation)代替:

md=median(xi,i=1,2,…,n) MAD=median(|xi−md|,i=1,2,…,n) MADe=1.483∗MAD 通常把偏离中位数三倍以上的数据作为异常值。和均值标准差方法比,中位数和MAD的计算不受极端异常值的影响,结果更加稳健。

4. boxplot法

我们知道箱线图上其实也会注明异常值,假设Q1和Q3分别为数据从小到大排列的25%和75%分位数,记IQR=Q1−Q3, 把(−∞,Q1−3∗IQR)⋃(Q3+3∗IQR,+∞)区间里的数据标识为异常点。分位数也是稳健统计量,因此Boxplot 方法对极值不敏感,但如果样本数据正偏严重,且右尾分布明显偏厚时,Boxplot 方法会把过多的数据划分为异常数据,因此Hubert& Vandervieren (2007)对原有Boxplot 方法进行了偏度调整。首先样本偏度定义采用了Brys(2004)提出的MedCouple方法:

md=median(xi,i=1,2,…,n) mc=median(\frac{(x_{i}-md)-(md-x_{j})}{x_{i}-x_{j}},x_{i}>=md&x_{j}<=md) 然后给出了经偏度调整boxplot方法上下限: L={Q1−1.5∗exp(−3.5∗mc)∗IQR,mc>=0 Q1−1.5∗exp(−4∗mc)∗IQR,mc<0

U={Q3+1.5∗exp(4∗mc)∗IQR,mc>=0 Q3+1.5∗exp(3.5∗mc)∗IQR,mc<0 区间(−∞,L)⋃(U,+∞)上的点视为异常点。和原始Boxplot 方法相比,当样本数据分布右偏时,此法会提升正常数据区间上限的数值;样本数据左偏时,则会降低正常数据区间下限的数值。 这个mc可以使用statsmodels包中的函数直接进行计算