def ShiftTradingDay(date,shift=5): # 获取所有的交易日,返回一个包含所有交易日的 list,元素值为 datetime.date 类型. tradingday = jqdata.get_all_trade_days() # 得到date之后shift天那一天在列表中的行标号 返回一个数 shiftday_index = list(tradingday).index(date)+shift # 根据行号返回该日日期 为datetime.date类型 return tradingday[shiftday_index]
def get_bonds_history_factors(self, interval=1): """ 获取任意指数一段时间的历史转债指数算术平均价格、转债指数溢价率 估值列表,通过计算当前的估值在历史估值的百分位,来判断当前市场的估值高低。 由于加权方式可能不同,可能各个指数公开的估值数据有差异,但用于判断估值相对高低没有问题 input: interval: 计算指数估值的间隔天数,增加间隔时间可提高计算性能 output: result: 指数历史估值的 DataFrame,index 为时间,列为市场总量,低估转债总量,平均价格, 溢价率 """ all_days = get_all_trade_days() total_markets = [] underrate_markets = [] avg_prices = [] avg_premium_ratios = [] days = [] begin = datetime.strptime(self._begin_date, '%Y-%m-%d').date() end = datetime.strptime(self._end_date, '%Y-%m-%d').date() i = 0 for day in all_days: if (day < begin or day > end): continue i += 1 if (i % interval != 0): continue logging.info("======统计历史:{}================".format( day.strftime("%Y-%m-%d"))) bond_list = self.get_bonds(day.strftime("%Y-%m-%d")) total_market, underrate_market, avg_price, avg_premium_ratio = self.get_bonds_factors( bond_list) #debug_msg = "当前转债存量:{:.2f}, 低估转债存量:{:.2f}, 当前平均价格:{:.2f}, 当前溢价率{:.2f}".format( # total_market, underrate_market, avg_price, avg_premium_ratio) avg_prices.append(avg_price) avg_premium_ratios.append(avg_premium_ratio) total_markets.append(total_market) underrate_markets.append(underrate_market) days.append(day) result = pd.DataFrame( { 'total_markets': total_markets, 'underrate_markets': underrate_markets, 'avg_prices': avg_prices, 'avg_premium_ratios': avg_premium_ratios }, index=days) print(result) return result
def initialize(context): set_benchmark('000300.XSHG') # 设定比较基准指数 set_option('use_real_price', True) # 默认复权模式 # 设定融资/融券账户 set_subportfolios( [SubPortfolioConfig(cash=context.portfolio.cash, type='stock_margin')]) # 设定交易成本 # set_order_cost(OrderCost(open_tax=0, close_tax=0.000, open_commission=0.0000, close_commission=0.0000, close_today_commission=0, min_commission=0), type='stock') set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=5), type='stock') # 设定融资/融券的利率和保证金比例 """ set_option('margincash_interest_rate', 0.00) set_option('margincash_margin_rate', 1.0) set_option('marginsec_interest_rate', 0.00) set_option('marginsec_margin_rate', 1.0) """ set_option('margincash_interest_rate', 0.00) # 事实上做多可以直接使用普通账户,所以不计这部分利率 set_option('margincash_margin_rate', 1.0) set_option('marginsec_interest_rate', 0.10) set_option('marginsec_margin_rate', 1.5) # 设置定时运行函数 run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') run_daily(market_open, time='open', reference_security='000300.XSHG') run_daily(after_market_close, time='after_close', reference_security='000300.XSHG') # 记录交易日期及其索引 g.all_tdays = jqdata.get_all_trade_days() g.date_xlat = dict([(doc[1], doc[0]) for doc in enumerate(g.all_tdays)]) # 设定若干全局变量 g.elapsed_days = 0 g.rebalance_today = False g.new_long_pos = {} g.new_short_pos = {}
def get_stock_beta_history_factors(self, interval=7): """ 获取任意指数一段时间的历史 pe,pb 估值列表,通过计算当前的估值在历史估值的百分位,来判断当前市场的估值高低。 由于加权方式可能不同,可能公开的估值数据有差异,但用于判断估值相对高低没有问题 input: interval: 计算指数估值的间隔天数,增加间隔时间可提高计算性能 output: result: 指数历史估值的 DataFrame,index 为时间,列为pe,pb,roe """ all_days = get_all_trade_days() pes = [] roes = [] pbs = [] days = [] begin = datetime.strptime(self._begin_date, '%Y-%m-%d').date() end = datetime.strptime(self._end_date, '%Y-%m-%d').date() i = 0 for day in all_days: if (day <= begin or day >= end): continue i += 1 if (i % interval != 0): continue pe, pb, roe = self.get_stock_beta_factor(day) if pe and pb and roe: pes.append(pe) pbs.append(pb) roes.append(roe) days.append(day) result = pd.DataFrame({'pe': pes, 'pb': pbs, 'roe': roes}, index=days) return result
set_option('margincash_margin_rate', 1.0) set_option('marginsec_interest_rate', 0.00) set_option('marginsec_margin_rate', 1.0) """ set_option('margincash_interest_rate', 0.00) # 事实上做多可以直接使用普通账户,所以不计这部分利率 set_option('margincash_margin_rate', 1.5) set_option('marginsec_interest_rate', 0.10) set_option('marginsec_margin_rate', 1.5) # 设置定时运行函数 run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') run_daily(market_open, time='open', reference_security='000300.XSHG') run_daily(after_market_close, time='after_close', reference_security='000300.XSHG') # 记录交易日期及其索引 g.all_tdays = jqdata.get_all_trade_days() g.date_xlat = dict([(doc[1], doc[0]) for doc in enumerate(g.all_tdays)]) # 设定若干全局变量 g.elapsed_days = 0 g.rebalance_today = False g.new_long_pos = {} g.new_short_pos = {} # 在每个交易日开盘前运行 def before_market_open(context): cur_dt = context.current_dt.date() # 当前日期 if g.elapsed_days % ADJUST_INTERVAL == 0: # 是否是调仓日 log.info("Rebalance at %s", cur_dt) g.rebalance_today = True idx = g.date_xlat[cur_dt]
def prepare_data(start_date, end_date, cut_date): # 用沪深300做测试 test_stock = '000300.XSHG' # 测试开始日期和终止日期 #start_date = datetime.date(2007, 1, 4) #end_date = datetime.date(2017, 1, 3) # 所有的交易日期 trading_days = jqdata.get_all_trade_days() start_date_index = trading_days.tolist().index(start_date) end_date_index = trading_days.tolist().index(end_date) cut_date_index = trading_days.tolist().index(cut_date) all_data = [] training_data = [] testing_data = [] feature_list = [] label_list = [] # 获取所有的数据 for index in range(start_date_index, end_date_index): #计算特征值 start_day = trading_days[index - 35] end_day = trading_days[index] stock_data = get_price(test_stock, start_date=start_day, end_date=end_day, frequency='daily', fields=['close', 'high', 'low', 'volume']) close_prices = stock_data['close'].values high_prices = stock_data['high'].values low_prices = stock_data['low'].values volumes = stock_data['volume'].values #通过数据计算指标 sma_data = talib.SMA(close_prices)[-1] wma_data = talib.WMA(close_prices)[-1] mom_data = talib.MOM(close_prices)[-1] stck, stcd = talib.STOCH(high_prices, low_prices, close_prices) stck_data = stck[-1] stcd_data = stcd[-1] macd, macdsignal, macdhist = talib.MACD(close_prices) macd_data = macd[-1] rsi_data = talib.RSI(close_prices, timeperiod=10)[-1] willr_data = talib.WILLR(high_prices, low_prices, close_prices)[-1] cci_data = talib.CCI(high_prices, low_prices, close_prices)[-1] mfi_data = talib.MFI(high_prices, low_prices, close_prices, volumes)[-1] obv_data = talib.OBV(close_prices, volumes)[-1] roc_data = talib.ROC(close_prices)[-1] cmo_data = talib.CMO(close_prices)[-1] # 训练数据或者测试数据的输入特征 features = [] features.append([sma_data]) #0 features.append([0]) features.append([wma_data]) #2 features.append([0]) features.append([mom_data]) #4 features.append([0]) features.append([stck_data]) #6 features.append([0]) features.append([stcd_data]) #8 features.append([0]) features.append([macd_data]) #10 features.append([0]) features.append([rsi_data]) #12 features.append([0]) features.append([willr_data]) #14 features.append([0]) features.append([cci_data]) #16 features.append([0]) features.append([mfi_data]) #18 features.append([0]) features.append([obv_data]) #20 features.append([0]) features.append([roc_data]) #22 features.append([0]) features.append([cmo_data]) #24 features.append([0]) features.append([close_prices[-1]]) features = np.array(features) # 训练数据或者测试的标签数据,就是涨或者跌,涨用[1,0],平或者跌用[0,1] label = [[0], [1]] if close_prices[-1] > close_prices[-2]: label = [[1], [0]] elif close_prices[-1] < close_prices[-2]: label = [[0], [1]] label = np.array(label) feature_list.append(features) label_list.append(label) # 连续数值离散化 # 从后面开始向前面遍历,第一行数据需要舍弃,range只包含第一个元素,不包含第二个元素 for index in range(len(feature_list) - 1, 0, -1): # SMA if feature_list[index][0][0] < feature_list[index][-1][0]: feature_list[index][0][0] = 1 feature_list[index][1][0] = 0 else: feature_list[index][0][0] = 0 feature_list[index][1][0] = 1 # WMA if feature_list[index][2][0] < feature_list[index][-1][0]: feature_list[index][2][0] = 1 feature_list[index][3][0] = 0 else: feature_list[index][2][0] = 0 feature_list[index][3][0] = 1 # MOM if feature_list[index][4][0] > 0: feature_list[index][4][0] = 1 feature_list[index][5][0] = 0 else: feature_list[index][4][0] = 0 feature_list[index][5][0] = 1 # STCK if feature_list[index][6][0] > feature_list[index - 1][6][0]: feature_list[index][6][0] = 1 feature_list[index][7][0] = 0 else: feature_list[index][6][0] = 0 feature_list[index][7][0] = 1 # STCD if feature_list[index][8][0] > feature_list[index - 1][8][0]: feature_list[index][8][0] = 1 feature_list[index][9][0] = 0 else: feature_list[index][8][0] = 0 feature_list[index][9][0] = 1 # MACD if feature_list[index][10][0] > feature_list[index - 1][10][0]: feature_list[index][10][0] = 1 feature_list[index][11][0] = 0 else: feature_list[index][10][0] = 0 feature_list[index][11][0] = 1 # RSI if feature_list[index][12][0] > 70: feature_list[index][12][0] = 0 feature_list[index][13][0] = 1 elif feature_list[index][12][0] < 30: feature_list[index][12][0] = 1 feature_list[index][13][0] = 0 else: if feature_list[index][12][0] > feature_list[index - 1][12][0]: feature_list[index][12][0] = 1 feature_list[index][13][0] = 0 else: feature_list[index][12][0] = 0 feature_list[index][13][0] = 1 # WILLR if feature_list[index][14][0] > feature_list[index - 1][14][0]: feature_list[index][14][0] = 1 feature_list[index][15][0] = 0 else: feature_list[index][14][0] = 0 feature_list[index][15][0] = 1 # CCI if feature_list[index][16][0] > 200: feature_list[index][16][0] = 0 feature_list[index][17][0] = 1 elif feature_list[index][16][0] < -200: feature_list[index][16][0] = 1 feature_list[index][17][0] = 0 else: if feature_list[index][16][0] > feature_list[index - 1][16][0]: feature_list[index][16][0] = 1 feature_list[index][17][0] = 0 else: feature_list[index][16][0] = 0 feature_list[index][17][0] = 1 # MFI if feature_list[index][18][0] > 90: feature_list[index][18][0] = 0 feature_list[index][19][0] = 1 elif feature_list[index][18][0] < 10: feature_list[index][18][0] = 1 feature_list[index][19][0] = 0 else: if feature_list[index][18][0] > feature_list[index - 1][18][0]: feature_list[index][18][0] = 1 feature_list[index][19][0] = 0 else: feature_list[index][18][0] = 0 feature_list[index][19][0] = 1 # OBV if feature_list[index][20][0] > feature_list[index - 1][20][0]: feature_list[index][20][0] = 1 feature_list[index][21][0] = 0 else: feature_list[index][20][0] = 0 feature_list[index][21][0] = 1 # ROC if feature_list[index][22][0] > 0: feature_list[index][22][0] = 1 feature_list[index][23][0] = 0 else: feature_list[index][22][0] = 0 feature_list[index][23][0] = 1 # CMO if feature_list[index][24][0] > 50: feature_list[index][24][0] = 0 feature_list[index][25][0] = 1 elif feature_list[index][24][0] < -50: feature_list[index][24][0] = 1 feature_list[index][25][0] = 0 else: if feature_list[index][24][0] > feature_list[index - 1][24][0]: feature_list[index][24][0] = 1 feature_list[index][25][0] = 0 else: feature_list[index][24][0] = 0 feature_list[index][25][0] = 1 # 删除价格 feature_list[index] = np.delete(feature_list[index], -1, axis=0) for i in range(1, len(feature_list)): sample_term = (feature_list[i], label_list[i]) if 1 + i + start_date_index < cut_date_index: training_data.append(sample_term) elif 1 + i + start_date_index >= cut_date_index: testing_data.append(sample_term) print("Data prepared. training data size: {0}, testing data size: {1}". format(len(training_data), len(testing_data))) return training_data, testing_data