def test_analyze_signal(): # -------------------------------------------------------------------------------- # Step.1 load dataview dv = DataView() dv.load_dataview(dataview_folder) mask = mask_index_member(dv) can_enter, can_exit = limit_up_down(dv) # -------------------------------------------------------------------------------- # Step.3 get signal, benchmark and price data dv.add_formula('divert', '- Correlation(vwap_adj, volume, 10)', is_quarterly=False, add_data=True) signal = dv.get_ts('divert') price = dv.get_ts('close_adj') price_bench = dv.data_benchmark # Step.4 analyze! my_period = 5 obj = SignalDigger(output_folder='../output/test_signal', output_format='pdf') obj.process_signal_before_analysis( signal=signal, price=price, 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=my_period, # 持有期 benchmark_price=price_bench, # 基准价格 可不传入,持有期收益(return)计算为绝对收益 commission=0.0008, ) signal_data = obj.signal_data result = analysis(signal_data, is_event=False, period=my_period) ic = pfm.calc_signal_ic(signal_data, by_group=True) mean_ic_by_group = pfm.mean_information_coefficient(ic, by_group=True) plotting.plot_ic_by_group(mean_ic_by_group) res = obj.create_full_report()
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, # 持有期 benchmark_price=benchmark_price, # 基准价格 可不传入,则持有期收益(return)计算为绝对收益 commission=0.0008, ) print(analysis(obj.signal_data, is_event=True, period=30)) # is_event=False表示不是事件类因子,period=15研究周期 obj.create_full_report() plt.show()
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() signal_data = obj.signal_data #得到因子值 result = analysis(signal_data, is_event=False, period=30) #得到分析表格 print(analysis(obj.signal_data, is_event=False, period=30)) #与上面完全一样 '''进一步测试下等权合成因子的绝对收益效果 可以尝试运行下 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, #这行注释掉即可 commission = 0.0008, ) obj.create_full_report()
obj.process_signal_before_analysis(signal=comb_factors["ic_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=20,# 持有期 benchmark_price=dv.data_benchmark, # 基准价格 可不传入,持有期收益(return)计算为绝对收益 commission = 0.0008, ) obj.create_full_report() plt.show() print(analysis(obj.signal_data,is_event=False,period=20)) excel_data = obj.signal_data[obj.signal_data['quantile']==5]["quantile"].unstack().replace(np.nan, 0).replace(5, 1) print (excel_data.head()) excel_data.to_excel('./ic_weight_quantile_5.xlsx') obj = SignalDigger() obj.process_signal_before_analysis(signal=comb_factors["ir_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,# 是否能出场
n_quantiles=5, # quantile分类数 mask=mask, # 过滤条件 can_enter=can_enter, # 是否能进场 can_exit=can_exit, # 是否能出场 period=5, # 持有期 benchmark_price=dv.data_benchmark, # 基准价格 可不传入,持有期收益(return)计算为绝对收益 commission=0.0008, ) signal_data = obj.signal_data import matplotlib.pyplot as plt print(obj.create_full_report()) plt.show() from jaqs_fxdayu.research.signaldigger.analysis import analysis result = analysis(signal_data, is_event=False, period=5) print("——ic分析——") print(result["ic"]) print("——选股收益分析——") print(result["ret"]) print("——最大潜在盈利/亏损分析——") print(result["space"]) import matplotlib.pyplot as plt obj.create_full_report() plt.show() obj.process_signal_before_analysis( signal=dv.get_ts("pe"), price=dv.get_ts("close_adj"), high=dv.get_ts("high_adj"), # 可为空
mask=mask, # 过滤条件 can_enter=can_enter, # 是否能进场 can_exit=can_exit, # 是否能出场 period=15, # 持有期 benchmark_price=dv.data_benchmark, # 基准价格 可不传入,持有期收益(return)计算为绝对收益 commission=0.0008, ) signal_data = obj.signal_data signal_data.head() # In[7]: # In[8]: from jaqs_fxdayu.research.signaldigger.analysis import analysis result = analysis(signal_data, is_event=False, period=15) # In[9]: print("——ic分析——") print(result["ic"]) print("——选股收益分析——") print(result["ret"]) print("——最大潜在盈利/亏损分析——") print(result["space"]) # 4.2 # 读取600104.XSHG的股票日线 # # 利用正确的方法将日K线聚合成周K线 #
can_enter=can_enter, # 是否能进场 can_exit=can_exit, # 是否能出场 period=15, # 持有期 benchmark_price=dv. data_benchmark, #基准价格 可不传入,持有期收益(return)计算为绝对收益,这里写了则表示计算收益为相对与指数的收益.也可以以其他指数为标准 #改为benchmark_price=None, #则计算的是绝对收益 commission=0.0008, #手续费,在alphalens中就不能设置手续费 ) #得到因子值: signal_data = obj.signal_data #signal表示因子值,return表示持有期的收益率(买入并持有15天后的相对收益),upside_ret/ downside_ret代表在对应持有期下的最大上涨空间以及最大下跌空间(这里都是计算的绝对收益率) signal_data.head() #step2: 因子分析 from jaqs_fxdayu.research.signaldigger.analysis import analysis result = analysis(signal_data, is_event=False, period=15) # is_event=False表示不是事件类因子,period=15研究周期 #这里会得到一个字典(含三个索引) #return_ic/upside_ret_ic/downside_ret_ic: 表示持有期收益的ic/持有期(股票暴涨)最大向上空间的ic/持有期(股票暴跌)最大向下空间的ic #long_ret/short_ret/long_short_ret/top_quantile_ret/bottom_quantile_ret/tmb_ret/all_sample_ret 表示: #多头组合收益(做多因子值为正的股票)/空头组合收益(做空因子值为负的股票)/多空组合收益(做多因子值为正的股票,做空因子值为负的股票)/ #/做多因子值(按quantile分类)最大的组合收益/做多因子值最小(按quantile分类,后同)的组合收益/因子值最大组(构建多头)+因子值最小组(构建空头)收益/全样本(例如这里研究的沪深300的股票)-基准组合收益 #long_space/short_space/long_short_space/top_quantile_space/bottom_quantile_space/tmb_space/all_sample_space 表示: #(与上面一行一一对应)多头组合空间/空头组合空间/多空组合空间/因子值最大组合空间/因子值最小组合空间/因子值最大组(构建多头)+因子值最小组(构建空头)空间/全样本(无论信号大小和方向)-基准组合空间 #而关于索引项(ic或收益的具体指标): #"IC Mean", "IC Std.", "t-stat(IC)", "p-value(IC)", "IC Skew", "IC Kurtosis", "Ann. IR" 表示: #IC均值,IC标准差,IC的t统计量,对IC做0均值假设检验的p-value,IC偏度,IC峰度,iC的年化信息比率-mean(IC)/std(IC) (一般|IC的均值|>0.02,|iC的年化信息比率|>0.6就可认为因子效果会比较好) #'t-stat',"p-value","skewness","kurtosis","Ann. Ret","Ann. Vol","Ann. IR","occurance" 表示: