quantfactortest 2.0
单因子的测试（日级别and分钟级别）,非交互式
License: MIT License
Requires Python: >=3.7

# 请直接使用pip install quantfactortest安装。

安装的时候有一个额外的包叫做baostock，它是用来获取指数收益率的（只有日频才有），其目的是用来计算超额收益率（在后面会有详细的说明）。  

本单因子测试分为分钟级别（可以是1分钟、5分钟、10分钟不等）以及日级别（每天）。
首先对日级别的做出参数上的解释。  


## 日级别：
使用的时候请先传入必要的参数：  

使用far=analyze_daily_factor(factor,price,quantiles=5,periods=[1],neutralize=0,demeaned=False,show_IC_line=True,show_IC_heat=True,show_test_line=True,show_test_heat=True)


1. factor、price

    factor以及price是一个n*m的DataFrame的格式，请保持二者的index为datatime格式（或者为时间的str格式，程序会自动转换成datatime的格式）；请保持二者的columns一致，比如000001.sh在factor里面是第一列，那么请让它在price里面也是第一列。factor是用来传递每一个标的在每一日的因子值，price是用来传递每一个标的在每一日的价值，这个价值由你来确定，可以是开盘价，收盘价、平均价等等。  

    那么我们为什么要传入price而不是直接的收益率呢？是为了得到不同收益周期的收益率，详情请参照periods的解释。  


2. quantiles
    
    默认值为5，为分组回测时分组的组数。  


3. periods
    
    默认值为[1]。表示我们的收益率的计算周期是1天，也就是用次日的价值/当日的价值-1。如果是[1,2,3,5,10]，那么程序会依次得到这不同收益周期的全部结果。  

    在这里需要额外阐述清楚一个重要的概念。在进行分组回测的时候，假如我们选择的是收益周期为2，如果周一该标的价值10元，周三价值11元，涨幅为10%，但是我们分组回测的收益其实为10%/2=5%。为什么会这样？因为我们还要分一半的资金给到周二时候的股票，周三时候的资金就用的是周一的另一半资金（此时假设已经拿了回来）。  


4. neutralize

    默认值为0，其实就是不做中性化，也就是不减去指数的超额收益。  

    指数的数据来源于baostock，链接为：http://baostock.com/baostock/index.php/%E6%8C%87%E6%95%B0%E6%95%B0%E6%8D%AE  

    如果想要减去某一具体的指数，请把neutralize=某指数的代码，如neutralize='sh.000001'  

    综合指数，例如：sh.000001 上证指数，sz.399106 深证综指 等；  

    规模指数，例如：sh.000016 上证50，sh.000300 沪深300，sh.000905 中证500，sz.399001 深证成指等；  

    一级行业指数，例如：sh.000037 上证医药，sz.399433 国证交运 等；  

    二级行业指数，例如：sh.000952 300地产，sz.399951 300银行 等；  

    策略指数，例如：sh.000050 50等权，sh.000982 500等权 等；  

    成长指数，例如：sz.399376 小盘成长 等；  

    价值指数，例如：sh.000029 180价值 等；  

    主题指数，例如：sh.000015 红利指数，sh.000063 上证周期 等；  

    基金指数，例如：sh.000011 上证基金指数 等；  

    债券指数，例如：sh.000012 上证国债指数 等；  


5. demeaned

    默认值为False，就是是否减去每一日的所有股票的平均收益（不是根据市值加权平均）。  

    如在周一的三只股票的收益为1%，2%，3%，如果demeaned=True，那么最后的结果将会为-1%，0%，1%。 

6. show_IC_line,show_IC_heat,show_test_line,show_test_heat

     默认值均为True。
     show_IC_line：是否展示IC值的折线图，数据量过大的时候（尤其是分钟级别）画图缓慢，不作折线图可以节省时间。
     show_IC_heat：是否展示IC值的月度图。
     show_test_line：是否展示分组回测结果的折线图。
     show_test_heat：是否展示分组回测结果的热力月度图，因为该结果图片太多，设置忽略可以净化荧幕。
     设置为True是展示，设置为False是不展示。


## 接下来将会解释结果：  
    请使用far.get_all(percentiles=[0.2,0.4,0.6,0.8],buy=[5],sell=[1],gap=10)  

    这里有额外的四个参数，我们将会在涉及到它们的结果中具体阐述用法。  


1. 首先会输出一个有关于因子描述的dataframe，它会包含每一个分位的因子的情况。percentiles的参数就是为了更具体地展示某一个位置因子的大小。

2. 接下来会展示IC（以及RankIC）的值以及IC（以及RankIC）的变化折线图以及月度的IC值，帮助我们来判断是否近期失效以及因子在各个月之间的稳定性；gap就是在作图的时候画的时间滚动平均线的周期，默认为10（2周）。
    
3. 分组回测的相关情况。

    然后会展示复利收益率各分组的折线图、累加收益率各分组的折线图；

    某一组的复利（以及累加）月度收益图，其目的是为了判断时间轮动（季节轮动）等。

    然后就和buy以及sell有关，buy=[5]和sell=[1]意味着我们做多第五分位和做空第一分位，资金的分配都是平均的。默认值是做多最大分位和做空最小分位。

    然后是该策略的复利收益率的折线图

4. 各分位以及各个周期的换手率，帮助我们判断策略的实现难度以及各种手续费。
    
5. 因子的自相关性系数，辅助判断第四条。

## 以上就是日级别的回测，分钟级别的回测仅有稍微的变动，我将只阐述不一样的变化。
far=analyze_minute_factor(factor,price,minute,quantiles=5,periods=[240],demeaned=False,trade_day=[],trade_time=[],show_IC_line=True,show_IC_heat=True,show_test_line=True,)

1. minute，请输入您的时间间隔。假如是5分钟，那么请输入5。

2. periods，默认值为240。假设您的时间间隔为5，那么建议不要将交易周期低于240/5=48，因为240分钟=4小时是A股日内的交易时间，A股日内不允许买卖，所以请将periods设置的间隔大于240/minute 

3. 因为baostock没有分钟级别的指数数据，所以我在此删掉了neutralize。

4. trade_day和trade_time是用来计算收益率的。我要详细地表明它和periods的区别。如果我的minute是5，periods为48，那么我在周一的9:35的股票将会在周二的9:35再次交易，周一的9：40的股票将会在周二的9：40再次交易......  

    如果trade_day为[1],trade_time为['15:00']，这意味着我统一在次日的15：00进行交易。也就是不管我是在周一的9:35买的还是10：00买的，我都会统一在周二的15：00进行交易来计算收益率。

5. 在最终的结果中，将不会再产生月度收益率图标，所以没有show_test_heat这个参数。