def cal_obj(signal, name, period, quantile): # price_bench = dv.data_benchmark obj = SignalDigger(output_folder="FACTORS/%s" % name, output_format='pdf') obj.process_signal_before_analysis(signal, price=price, n_quantiles=quantile, period=period, mask=mask, group=sw1, can_enter=enter, can_exit=exit, commission=0.0008) return obj
def cal_obj(signal, name, period=5, quantile=5): obj = SignalDigger() obj.process_signal_before_analysis( signal, price=price, n_quantiles=quantile, period=period, can_enter=can_enter, can_exit=can_exit, mask=mask, ) obj.create_full_report() return obj
def cal_obj(signal, name, period, quantile): price_bench = dv.data_benchmark obj = SignalDigger(output_folder="hs300/%s" % name, output_format='pdf') obj.process_signal_before_analysis(signal, price=price, n_quantiles=quantile, period=period, mask=mask, group=sw1, can_enter=can_enter, can_exit=can_exit, commission=0.0003) obj.create_full_report() return obj
ic_20_mean = dict() ic_20_std = dict() ir_20 = dict() for name in ic_20.columns: ic_20_mean[name] = ic_20[name].loc[start:].mean() ic_20_std[name] = ic_20[name].loc[start:].std() ir_20[name] = ic_20_mean[name] / ic_20_std[name] import datetime trade_date = pd.Series(ic_20.index) trade_date = trade_date.apply( lambda x: datetime.datetime.strptime(str(x), '%Y%m%d')) ic_20.index = trade_date obj = SignalDigger(output_folder='./output', output_format='pdf') obj.process_signal_before_analysis( signal=comb_factors["equal_weight"], price=dv.get_ts("close_adj"), high=dv.get_ts("high_adj"), # 可为空 low=dv.get_ts("low_adj"), # 可为空 n_quantiles=5, # quantile分类数 mask=mask, # 过滤条件 can_enter=can_enter, # 是否能进场 can_exit=can_exit, # 是否能出场 period=period, # 持有期 benchmark_price=dv.data_benchmark, # 基准价格 可不传入,持有期收益(return)计算为绝对收益 commission=0.0008, ) obj.create_full_report() plt.show()
kind="line", figsize=(15, 5), ) #在原有的基础上调整了输出的时间: ic_30.loc[datetime.date(2017, 1, 3):, ][["equal_weight", "ic_weight", "pe"]].plot( kind="line", figsize=(15, 5), ) #step4:查看等权合成因子的详情报告 process_signal_before_analysis():与第二章SignalDigger因子分析完全一样,至此可以之前单一因子对比,看合成因子效果如何: import matplotlib.pyplot as plt from jaqs_fxdayu.research.signaldigger.analysis import analysis from jaqs_fxdayu.research import SignalDigger obj = SignalDigger() #这里与第二章不同,对比下 obj.process_signal_before_analysis( signal=comb_factors["equal_weight"], price=dv.get_ts("close_adj"), high=dv.get_ts("high_adj"), # 可为空 low=dv.get_ts("low_adj"), # 可为空 n_quantiles=5, # quantile分类数 mask=mask, # 过滤条件 can_enter=can_enter, # 是否能进场 can_exit=can_exit, # 是否能出场 period=30, # 持有期 benchmark_price=dv.data_benchmark, # 基准价格 可不传入,持有期收益(return)计算为绝对收益 commission=0.0008, ) obj.create_full_report() plt.show()
# import h5py import warnings from jaqs_fxdayu.research import SignalDigger from jaqs_fxdayu.data import DataView from api import * warnings.filterwarnings('ignore') # step 1:实例化SignalDigger 通过output_folder和output_format指定因子绩效表现的输出路径和输出格式,通过signal_name指定绩效文件名称 sd = SignalDigger(output_folder=".", output_format='pdf', signal_name="signal") folders = [ './data_2016_1_000300', './data_2016_2_000300', './data_2017_1_000300', './data_2017_2_000300', './data_2018_1_000300', './data_2018_2_000300', './data_2019_1_000300' ] def get_(folder): # step 2 因子数据预处理 # 加载dataview数据集 dv = DataView() dataview_folder = folder dv.load_dataview(dataview_folder) # 定义信号过滤条件-非指数成分 # df_index_member = dv.get_ts('index_member') signal = dv.get_ts("pb") price = dv.get_ts("close_adj") group = dv.get_ts("sw1")
in_sample_range=[20140101,20160101], #选择优化的时间范围内范围 默认为None,表示在全样本上优化 #这样做的目的是留下一部分样本进行检验,看优化的效果如何 ascending=False) #是否按优化目标升序排列(从小到大),ascending=False表示按降序排列,也就是说得到的结果中第一行就是最优解 print(ret_best[0]["signal_name"]) #返回最优解的结果 'LEN': 12 print(ret_best[0]["ret"]) print(ret_best[0]["ic"]) print(ret_best[0]["space"]) #step3:进行可视化的操作 from jaqs_fxdayu.research import SignalDigger from jaqs_fxdayu.research.signaldigger.analysis import analysis import matplotlib.pyplot as plt obj = SignalDigger() def draw_analysis(signal_data,period): obj.signal_data = signal_data obj.period = period obj.create_full_report() plt.show() #全样本可视化操作: draw_analysis(optimizer.all_signals[ret_best[0]["signal_name"]], period=30) #当然,这里也可以仿制第二章中的方法,不定义函数,直接运行: '''' obj.signal_data=optimizer.all_signals[ret_best[0]["signal_name"]] obj.period = 30 obj.create_full_report()
is_quarterly=False, add_data=True) can_enter = np.logical_and(dv.get_ts('up_limit') < 1, ~mask_sus) # 未涨停未停牌 can_exit = np.logical_and(dv.get_ts('down_limit') < 1, ~mask_sus) # 未跌停未停牌 return can_enter, can_exit mask = mask_index_member() #是否需要过滤该支股票:这里false表示不用过滤该股票,true表示需要过滤掉该股票 can_enter, can_exit = limit_up_down( ) #是否能够买入/卖出:can_enter中true表示可以买入,false表示不能买入;can_exit中true表示可以卖出,false表示不能卖出 #2_SignalDigger处理因子 obj.process_signal_before_analysis(): #step1: from jaqs_fxdayu.research import SignalDigger obj = SignalDigger( output_folder='G:\data2', #输出路径 output_format='pdf') #output_format='pdf'表示输出格式为pdf # 处理因子 计算目标股票池每只股票的持有期收益,和对应因子值的quantile分类 obj.process_signal_before_analysis( signal=dv.get_ts( "pb"), #传入的因子,这里是dataframe格式,不同于alphalens需要传入的multiIndex格式 price=dv.get_ts("close_adj"), #这里的price,high,low是需要计算的价格 high=dv.get_ts("high_adj"), # 可为空(可以不写这一行) low=dv.get_ts("low_adj"), # 可为空(可以不写这一行) group=dv.get_ts("sw1"), # 可为空(可以不写这一行) ,这里选择申万的分类方式 n_quantiles=5, # quantile分类数 mask=mask, # 过滤条件 can_enter=can_enter, # 是否能进场 can_exit=can_exit, # 是否能出场 period=15, # 持有期
mask = mask_index_member() can_enter, can_exit = limit_up_down() #step2: #用append_df的方法将slope_df添加至本地(dataview数据集里) print(dv.fields) #查看dv中取得的数据 dv.append_df(field_name="Union", df=Union, is_quarterly=False ) #用append_df方法将"Union"添加至本地(dataview数据集里),其新名称为df=(Union) dv.append_df(field_name="Intersection", df=Intersection, is_quarterly=False) dv.save_dataview('G:/data/hs300_2') #保存,若不运行,则下次重新运行不会有Union和Intersection #step3:新因子分析: from jaqs_fxdayu.research import SignalDigger import matplotlib.pyplot as plt from jaqs_fxdayu.research.signaldigger.analysis import analysis obj = SignalDigger(output_folder='G:/data', output_format='pdf') def draw_analysis( signal="Union", benchmark_price=None): #同样类似于第二章SignalDigger处理因子的方式,不过这里是定义函数 obj.process_signal_before_analysis( signal=dv.get_ts(signal), price=dv.get_ts("close_adj"), high=dv.get_ts("high_adj"), #可为空 low=dv.get_ts("low_adj"), #可为空 n_quantiles=1, # quantile分类数 mask=mask, #过滤条件 can_enter=can_enter, # 是否能进场 can_exit=can_exit, # 是否能出场 period=30, # 持有期