print(group2_code.tail() ) #value="industry1_code"表示以industry2_name为分类标准,不过返回的code类型(类别代号) group3 = dp.daily_sec_industry(api, symbols, start, end, source='zz', value="industry1_name") print(group3.tail()) #source='zz'表示以中证为分类标准,只是分类标准不同而已 group3_code = dp.daily_sec_industry(api, symbols, start, end, source='zz', value="industry1_code") print(group3_code.tail() ) #source='zz'表示以中证为分类标准,只是分类标准不同而已,industry1_code返回的是类别代号(code类型) #3_添加数据保存 dv = DataView() dataview_folder = 'G:/data/hs300' #档案地址 dv.load_dataview(dataview_folder) #加载档案地址 dv.append_df(group, 'group') #将group列加入dv中,后面的'group'为列名 dv.save_dataview('G:/data/hs300') #保存 #获取数据 print(dv.get_ts('group').tail()) A = dv.get_ts('group') #这样看的更清楚点
import talib as ta import numpy as np import pandas as pd from datetime import datetime def change_time(df): df.index = pd.Index( map(lambda x: datetime.strptime(str(x), "%Y%m%d"), df.index)) return df EMA = dv.get_ts('close').ewm(span=5, adjust=False).mean() EMA2 = EMA.ewm(span=5, adjust=False).mean() EMA3 = EMA2.ewm(span=5, adjust=False).mean() dv.append_df(EMA3, 'EMA3') dv.add_formula('a', 'close/Delay(close,1)-1', is_quarterly=False, add_data=True) dv.add_formula('b', '(close/Delay(EMA3,19))^(1/20)-1', is_quarterly=False, add_data=True) Factor1 = dv.add_formula( 'Factor1', '-Log((Ts_Sum(If(a>b,1,0),20)-1)*Ts_Sum(If(a<b,(a-b)^2,0),20)/(Ts_Sum(If(a<b,1,0),20))*Ts_Sum(If(a>b,(a-b)^2,0),20))', is_quarterly=False, add_data=True) EMA = dv.get_ts('close').ewm(span=60, adjust=False).mean()
plt.show() #画图 def signal_data(signal, name, period=5, quantile=5): obj = cal_obj(signal, name, period, quantile) return obj.signal_data #得到一个详细的数据 #3_画图展示: plot_pfm(factor, 'roe_pb', period=5, quantile=5) #ic值 t-value:t检验,p-value:pvalue,IC SKew:偏度,IC Kurtosis:峰度 #Daily Quantile Return:每个Quantile的收益率,Cumulative Return of Each Quantile:每个Quantile的累计收益率 #Signal Weighted Long Only Portfolio Cumulative Return 多头的收益率 #Signal Weighted Short Only Portfolio Cumulative Return 空头的收益率 #Top Minus Bottom Quantile Return 多空收益(多减空的一个收益) #Top Minus Bottom (long top,short bottom) Portfolip Cumulative Return (做多Quantile高的,做空Quantile低的的收益率) #Daily IC and Moving Average: IC的均值;Distribution Daily IC: IC的分布;IC Monthly Mean;每个月IC的值 #4_信号表格: signal_df = signal_data( factor, 'roe_pb') #signal:因子值,return:收益率(未来5天的收益率)(period=5),quantile:百分位 print(signal_df.head(100)) Q5 = signal_df.signal[signal_df['quantile'] == 5] #先判断'quantile'是否等于5返回一列true或者false,是true的话则记录signal Q5[Q5 > 0] = 1 #将这些列中的元素转标记成1 dv.append_df(Q5.unstack(), 'roe_pb_Q5' ) #在dv中加入一列Q5.unstack(),'roe_pb_Q5'为列名 可以运行下A=Q5.unstack()以方便查看 dv.get_ts('roe_pb_Q5') #读取roe_pb_Q5 dv.save_dataview('G:/data/hs300')
dv.add_formula('down_limit', '(close - Delay(close, 1)) / Delay(close, 1) < -0.095', is_quarterly=False, add_data=True) can_enter = np.logical_and( dv.get_ts('up_limit') < 1, ~mask_sus) # 未涨停dv.get_ts('up_limit') < 1,未停牌(~mask_sus):即可以进场 can_exit = np.logical_and( dv.get_ts('down_limit') < 1, ~mask_sus) # 未跌停dv.get_ts('down_limit') < 1,未停牌(~mask_sus):即可以出场 return can_enter, can_exit mask_index_member = mask_index() can_enter, can_exit = limit_up_down() #3_添加数据 # dv.remove_field('mask_index_member') # dv.remove_field('can_enter') # dv.remove_field('can_exit') dv.append_df(mask_index_member, 'mask_index_member') #后面是给新因子的名称 dv.append_df(can_enter, 'can_enter') dv.append_df(can_exit, 'can_exit') #保存: dv.save_dataview('G:/data/hs300') print(dv.get_ts('mask_index_member').head()) X1 = dv.get_ts('mask_index_member') #true表示不在指数成分里,false表示在指数成分里 X2 = dv.get_ts('can_enter') #可以买入 X3 = dv.get_ts('can_exit') #可以卖出
warnings.filterwarnings("ignore") dataview_folder = '../Factor' dv = DataView() dv.load_dataview(dataview_folder) from jaqs_fxdayu.research.signaldigger import process Open = dv.get_ts("open_adj") High = dv.get_ts("high_adj") Low = dv.get_ts("low_adj") Close = dv.get_ts("close_adj") trade_status = dv.get_ts('trade_status') mask_sus = trade_status == 0 # 剔除掉停牌期的数据 再计算指标 open_masked = process._mask_df(Open, mask=mask_sus) high_masked = process._mask_df(High, mask=mask_sus) low_masked = process._mask_df(Low, mask=mask_sus) close_masked = process._mask_df(Close, mask=mask_sus) from jaqs_fxdayu.data import signal_function_mod as sfm cci = sfm.ta(ta_method='CCI', ta_column=0, Open=open_masked, High=high_masked, Low=low_masked, Close=close_masked, Volume=None) dv.append_df(cci, 'CCI') dv.get_ts('CCI').tail()
# 跌停 dv.add_formula('down_limit', '(close - Delay(close, 1)) / Delay(close, 1) < -0.095', 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() 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(