def get_prediction_data(klines, n): """获取用于随机森林的n个输入数据(n为数据长度): n天中每天的特征参数及其涨跌情况""" close_prices = klines.close[- 30 - n:] # 获取本交易日及以前的收盘价(此时在预定的收盘时间: 认为本交易日已收盘) # 计算所需指标 sma_data = sma(close_prices, 30, 0.02)[-n:] # SMA指标, 函数默认时间周期参数:30 wma_data = ema2(close_prices, 30)[-n:] # WMA指标 mom_data = trma(close_prices, 30)[-n:] # MOM指标 x_all = list(zip(sma_data, wma_data, mom_data)) # 样本特征组 y_all = list(klines.close.iloc[i] >= klines.close.iloc[i - 1] for i in list(reversed(range(-1, -n - 1, -1)))) # 样本标签组 # x_all: 大前天指标 前天指标 昨天指标 (今天指标) # y_all: (大前天) 前天 昨天 今天 -明天- # 准备算法需要用到的数据 x_train = x_all[: -1] # 训练数据: 特征 x_predict = x_all[-1] # 预测数据(用本交易日的指标预测下一交易日的涨跌) y_train = y_all[1:] # 训练数据: 标签 (去掉第一个数据后让其与指标隔一位对齐(例如: 昨天的特征 -> 对应预测今天的涨跌标签)) return x_train, y_train, x_predict
end_dt=date(2020, 1, 15)), web_gui="http://127.0.0.1:61122/") #接收行情设置持仓目标 klines = api.get_kline_serial(SYMBOL, 60 * 60) # 1小时K线 klines_long = api.get_kline_serial(SYMBOL, 60 * 60 * 24) # 日K线 quote = api.get_quote(SYMBOL) position = api.get_position(SYMBOL) target_pos = TargetPosTask(api, SYMBOL) #计算MACD macd = MACD(klines, 12, 26, 9) macd_long = MACD(klines_long, 12, 26, 9) #计算EMA2的值,看看这个值是增长还是降低。来判断趋势的方向 direction = tafunc.ema2(klines.close, EMA2_long) direction_long = tafunc.ema2(klines_long.close, EMA2_long) #下面是开仓的条件,都是在小周期上开仓的. def short_buyopen(): #在小周期上开多仓 if direction.iloc[-1] > direction.iloc[-2] and macd['bar'].iloc[ -1] > 0: #参见下面一条,与其相反. return 1 else: return 0 def short_sellopen(): #在小周期上开空仓 if direction.iloc[-1] < direction.iloc[-2] and macd['bar'].iloc[ -1] < 0: #小周期长均线下行macd变绿开空仓.
#下面是回测用api,实盘时候记得注释掉。 api = TqApi(TqSim(200000), backtest=TqBacktest(start_dt=date(2019, 7, 15), end_dt=date(2020, 1, 15)), web_gui="http://127.0.0.1:61000/") #接收行情设置持仓目标 klines = api.get_kline_serial(SYMBOL, 60 * 60 * 24) # 1小时K线 klines_long = api.get_kline_serial(SYMBOL, 60 * 60 * 24) # 日K线 quote = api.get_quote(SYMBOL) position = api.get_position(SYMBOL) target_pos = TargetPosTask(api, SYMBOL) # 使用BOLL指标计算中轨、上轨和下轨,其中26为周期N ,2为参数p atr = ATR(klines, 26) midline = tafunc.ema2(klines.close, MA_FAST) topline = midline + atr.atr bottomline = midline - atr.atr #print("策略运行,中轨:%.2f,上轨为:%.2f,下轨为:%.2f" % (midline, topline, bottomline)) while True: api.wait_update() # 每次生成新的K线时重新计算BOLL指标 if api.is_changing(klines.iloc[-1], "datetime") or api.is_changing( quote, "last_price"): atr.atr = ATR(klines, 26) midline = tafunc.ema2(klines.close, MA_FAST) topline = midline + atr.atr bottomline = midline - atr.atr