[关闭]
@Channelchan 2018-01-09T21:16:46.000000Z 字数 3368 阅读 25556

IC序列阈值选股

  1. 读取本地数据
  2. 获取每日IC的DataFrame
  3. 设置IC阈值
  4. 选出因子值最大的n只股票
  5. 位移与转换格式
  6. 回测绩效

1_读取本地数据

  1. from jaqs.data.dataapi import DataApi
  2. from jaqs.data import DataView
  3. import numpy as np
  4. from datetime import datetime
  5. import pandas as pd
  6. import warnings
  7. import alphalens
  8. warnings.filterwarnings("ignore")
  9. dataview_folder = 'JAQS_Data/hs300'
  10. dv = DataView()
  11. dv.load_dataview(dataview_folder)
D:\Anaconda3\lib\site-packages\statsmodels\compat\pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.
  from pandas.core import datetools


Dataview loaded successfully.
  1. def change_index(signal):
  2. signal.index = pd.Index(map(lambda x: datetime.strptime(str(x),"%Y%m%d") , signal.index))
  3. return signal
  1. big_factor = ['roe','roa']
  1. PN = pd.Panel({name: change_index(dv.get_ts(name)) for name in big_factor})
  1. prices = change_index(dv.get_ts('close_adj'))

2_获取每日IC的DataFrame

  1. def cal_daily_ic(factor_df):
  2. factor_data = alphalens.utils.get_clean_factor_and_forward_returns(factor_df.stack(), prices, quantiles=5, periods=(5,))
  3. return alphalens.performance.mean_information_coefficient(factor_data, by_time='D')
  4. daily_ic = {key: cal_daily_ic(value) for key, value in PN.iteritems()}
  1. ic_df = pd.DataFrame({factor: daily_ic.get(factor)[5] for factor in big_factor})
  1. print(ic_df.head())
                 roa       roe
date                          
2012-01-04 -0.022573  0.095570
2012-01-05 -0.012033 -0.010591
2012-01-06 -0.028648  0.082105
2012-01-09 -0.138597  0.084739
2012-01-10 -0.177690  0.068066
  1. df_ic = ic_df.rename_axis(lambda s: s.year*10000+s.month*100+s.day)

3_设置IC阈值

  1. import numpy as np
  2. def cal_big(big_ic, limit_ic=0.02):
  3. # 设置IC阈值为-limit_ic
  4. big_df = big_ic.copy()
  5. big_df[big_df<limit_ic]=np.nan
  6. big_df[big_df>=limit_ic]=1
  7. return big_df

4_选出因子值最大的n只股票

  1. def big_select(rows, n=10):
  2. # 只选最小的n只
  3. time, row = rows
  4. row = row.dropna().index
  5. dct = {}
  6. if len(row) == 0:
  7. return dct
  8. target = pd.DataFrame({factor: dv.get_ts(factor, end_date=time).iloc[-1].dropna().T for factor in row})
  9. for name, s in target.iteritems():
  10. for code in s.nlargest(n).index:
  11. dct[code] = 1
  12. return dct

5_位移与转换格式

  1. select_big = pd.DataFrame(list(map(big_select, cal_big(df_ic).iterrows())), index=PN.major_axis[5:])
  1. from datetime import timedelta
  2. def change_columns_time(signal):
  3. new_names = {}
  4. for c in signal.columns:
  5. if c.endswith('SZ'):
  6. new_names[c] = c.replace('SZ', 'XSHE')
  7. elif c.endswith('SH'):
  8. new_names[c] = c.replace('SH', 'XSHG')
  9. signal = signal.rename_axis(new_names, axis=1)
  10. signal.index = pd.Index(map(lambda x: x+timedelta(hours=15) , signal.index))
  11. return signal
  1. big_df = change_columns_time(select_big)

6_回测绩效

  1. import numpy as np
  2. import talib as ta
  3. import pandas as pd
  4. import rqalpha
  5. from rqalpha.api import *
  6. #读取文件位置
  7. def init(context):
  8. context.codes = big_df
  9. context.stocks = []
  10. # scheduler.run_weekly(find_pool, tradingday=1)
  11. scheduler.run_daily(find_pool)
  12. def find_pool(context, bar_dict):
  13. try:
  14. codes = context.codes.loc[context.now]
  15. except KeyError:
  16. return
  17. stocks = codes.index[codes == 1]
  18. context.stocks = stocks
  19. def handle_bar(context, bar_dict):
  20. buy(context, bar_dict)
  21. def buy(context, bar_dict):
  22. pool = context.stocks
  23. if pool is not None:
  24. stocks_len = len(pool)
  25. for stocks in context.portfolio.positions:
  26. if stocks not in pool:
  27. order_target_percent(stocks, 0)
  28. result = []
  29. for codes in pool:
  30. if codes not in result and codes not in context.portfolio.positions:
  31. result.append(codes)
  32. if len(result):
  33. for r in result:
  34. order_target_percent(r, 1.0/stocks_len)
  35. config = {
  36. "base": {
  37. "start_date": "2015-09-01",
  38. "end_date": "2017-12-22",
  39. "accounts": {'stock':1000000},
  40. "benchmark": "000300.XSHG"
  41. },
  42. "extra": {
  43. "log_level": "error",
  44. },
  45. "mod": {
  46. "sys_analyser": {
  47. "enabled": True,
  48. "plot": True
  49. }
  50. }
  51. }
  52. rqalpha.run_func(init=init, handle_bar=handle_bar, config=config)

output_22_1.png-64.1kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注