def algo(context): global candidate_stock, selected_stock date_now = context.now.strftime('%Y-%m-%d') date_previous = get_trading_date_from_now(date_now, -1, ql.Days) # 前一个交易日,用于获取因子数据的日期 print(date_now + '日回测程序执行中...') if date_now not in trading_date_list: # 非调仓日 pass # 预留非调仓日的微调空间 else: # 调仓日执行算法 print(date_now + '日回测程序执行中...') # 根据指数获取股票候选池的代码 code_list = SelectedStockPoolFromListV1( INCLUDED_INDEX, EXCLUDED_INDEX, date_previous).get_stock_pool() strategy = STRATEGY(code_list, date_previous) candidate_stock = strategy.select_code() # 调仓日定期调节候选的股票池更新,非调仓日使用旧股票池 sw1_industry = get_SW1_industry(date_previous, candidate_stock) # 获取股票的申万一级行业信息字典 industry_wm_result = industry_wheel_movement[date_now] # 行业轮动内部自动替换为前一交易日 candidate_selected_stock = [ stock for stock in candidate_stock if sw1_industry[stock] is not None and industry_wm_result[sw1_industry[stock]] == 1 ] # 忽略无行业信息的股票并根据行业择时信号选择候选股票 if candidate_selected_stock == selected_stock: # 候选股状态与之前一样,不用任何操作 pass else: selected_stock = candidate_selected_stock # 更新已持股池的信息 if candidate_selected_stock == []: # 空仓信号 stock_dict[date_now] = {} else: candidate_selected_stock = list_wind2jq(candidate_selected_stock) stock_now = WEIGHTS(candidate_selected_stock, date_previous).get_weights() stock_dict[date_now] = stock_now
def algo(context): global position_now, position_target date_now = context.now.strftime('%Y-%m-%d') date_previous = get_trading_date_from_now(date_now, -1, ql.Days) # 前一个交易日,用于获取因子数据的日期 select_time_value = select_time_model[date_now] # 择时信号计算,择时内部自动替换为前一交易日 print(date_now + ('日回测程序执行中...,择时值:%.2f' % select_time_value)) if date_now not in trading_date_list: # 非调仓日 pass else: # 调仓日执行算法,更新position_target position_now = False # 虚拟上,调仓日需要提前清仓 stock_dict[date_now] = {} # 根据指数获取股票候选池的代码 code_list = SelectedStockPoolFromListV1( INCLUDED_INDEX, EXCLUDED_INDEX, date_previous).get_stock_pool() strategy = STRATEGY(code_list, date_previous, 0.9) select_code_list = list_wind2jq(strategy.select_code()) if len(select_code_list) > 0: # 有可选股票时记录下可选股票 stock_now = WEIGHTS(select_code_list, date_previous).get_weights() position_target = stock_now else: position_target = {} # 择时判定 if select_time_value >= 0 and not position_now and position_target != {}: # LLT择时信号为正,空仓且有目标持仓状态 stock_dict[date_now] = position_target position_now = True elif select_time_value < 0 and position_now and position_target != {}: # LLT择时信号为负且持仓状态: stock_dict[date_now] = {} position_now = False
def algo(context): date_now = context.now.strftime('%Y-%m-%d') date_previous = get_trading_date_from_now(date_now, -1, ql.Days) # 前一个交易日,用于获取因子数据的日期 if date_now not in trading_date_list: # 非调仓日 pass # 预留非调仓日的微调空间 else: # 调仓日执行算法 print(date_now+'日回测程序执行中...') # 根据指数获取股票候选池的代码 select_code_list = list_wind2jq(INCLUDED_INDEX) if len(select_code_list) > 0: # 有可选股票时选取合适的股票 stock_now = WEIGHTS(select_code_list, date_previous).get_weights() stock_dict[date_now] = stock_now else: stock_dict[date_now] = {}
def algo(context): date_now = context.now.strftime('%Y-%m-%d') date_previous = get_trading_date_from_now(date_now, -1, ql.Days) # 前一个交易日,用于获取因子数据的日期 if date_now not in trading_date_list: # 非调仓日 pass # 预留非调仓日的微调空间 else: # 调仓日执行算法 print(date_now+'日回测程序执行中...') # 根据指数获取股票候选池的代码 code_list = SelectedStockPoolFromListV1(INCLUDED_INDEX, EXCLUDED_INDEX, date_previous).get_stock_pool() # 按照选股策略选股,与选股策略接口保持一致 strategy = STRATEGY(code_list, date_previous) select_code_list = list_wind2jq(strategy.select_code()) if len(select_code_list) > 0: # 有可选股票时选取合适的股票 stock_now = WEIGHTS(select_code_list, date_previous).get_weights() stock_dict[date_now] = stock_now else: stock_dict[date_now] = {}
def algo(context): date_now = context.now.strftime('%Y-%m-%d') date_previous = get_trading_date_from_now(date_now, -1, ql.Days) # 前一个交易日,用于获取因子数据的日期 select_time_value = select_time_model[date_now] # 择时信号计算 select_time_dict[date_now] = select_time_value print(date_now + ('日回测程序执行中...,择时值:%.2f' % select_time_value)) if date_now not in trading_date_list: # 非调仓日 pass else: # 调仓日执行算法 # 根据指数获取股票候选池的代码 code_list = SelectedStockPoolFromListV1( INCLUDED_INDEX, EXCLUDED_INDEX, date_previous).get_stock_pool() strategy = STRATEGY(code_list, date_previous, 0.9) select_code_list = list_wind2jq(strategy.select_code()) if len(select_code_list) > 0: # 有可选股票时选取合适的股票 stock_now = WEIGHTS(select_code_list, date_previous).get_weights() else: stock_dict[date_now] = {}
def algo(context): global position_now, position_target date_now = context.now.strftime('%Y-%m-%d') date_previous = get_trading_date_from_now(date_now, -1, ql.Days) # 前一个交易日,用于获取因子数据的日期 select_time_value = select_time_model[date_now] # 择时信号计算 if date_now not in trading_date_list: # 非调仓日 pass else: # 调仓日执行算法,更新position_target position_now = False # 虚拟上,调仓日需要提前清仓 stock_dict[date_now] = {} # 根据指数获取股票候选池的代码 all_code_set = set() for index in INDEX: code_set = set( w.wset("sectorconstituent", "date=" + date_previous + ";windcode=" + index).Data[1]) all_code_set = all_code_set | code_set code_list = list(all_code_set) # 股票候选池 strategy = STRATEGY(code_list, date_previous, 0.9) select_code_list = list_wind2jq(strategy.select_code()) if len(select_code_list) > 0: # 有可选股票时记录下可选股票 stock_now = WEIGHTS(select_code_list, date_previous).get_weights() position_target = stock_now else: position_target = {} # 择时判定 if select_time_value >= 0 and not position_now and position_target != {}: # LLT择时信号为正,空仓且有目标持仓状态 stock_dict[date_now] = position_target position_now = True elif select_time_value < 0 and position_now and position_target != {}: # LLT择时信号为负且持仓状态: stock_dict[date_now] = {} position_now = False # 打印择时信号和仓位配置信息 print(date_now + ('日回测程序执行中...,择时值:%.2f' % select_time_value)) print(date_now + '日回测程序执行中...,选股:') print(position_target)
views_vector.append(ws.cell(ws.nrows - 2, j).value) views_cov.append(ws.cell(ws.nrows - 1, j).value) views_matrix = np.array(views_matrix).transpose() views_vector = np.array(views_vector).reshape(-1, 1) views_cov = np.diag(np.array(views_cov)**2) return views_matrix, views_vector, views_cov if __name__ == '__main__': # 输入数据 date = '2019-11-04' file_path = '投资示例.xlsx' # 数据整理 code_list = 品种获取(file_path) views_matrix, views_vector, views_cov = 观点信息获取(file_path) code_weights = WEIGHTS(list_wind2jq(code_list), date).get_weights() # 风险平价收益和历史数据估计协方差数据 rp_weights = [code_weights[code] for code in code_weights] return_cov = 方差风险_历史数据(code_list, date, 60).return_cov * 240 # 主观观点标准差与历史估计标准差的比较 views_variance = get_variance_of_views_from_weights_covariances( return_cov, views_matrix) views_std = np.sqrt(views_variance) print('观点的历史数据估计标准差为:') print(views_std) print('观点的主观判断标准差为:') print(np.sqrt(np.diag(views_cov))) # BL模型的参数设定 delta_value = 50.0