自动扶梯是一个名字很有趣的策略,它的核心思想是通过单一合约的前后两根K线的走势来进行多头、空头、止损和止盈操作,该策略在多个平台的历史战绩中均有不错的表现。
开仓策略
多头开仓思路
找到K线先收弱再收强的的特性作为上升趋势的做多点
具体计算公式如下(策略源码在最下方):
示例策略中设置默认参数为短期均线:8,长期均线:40
1.判断当前K线位置在长短期均线上方
2.前一根K线的波动范围在前根K线整个波动浮动的底部25%
3.后一根K线的波动范围在后根K线整个波动浮动的顶部25%
# 开仓判断 if position.pos_long == 0 and position.pos_short == 0: # 计算前后两根K线在当时K线范围波幅 kl_range_cur = kline_range(-2) kl_range_pre = kline_range(-3) # 开多头判断,最近一根K线收盘价在短期均线和长期均线之上,前一根K线收盘价位于K线波动范围底部25%,最近这根K线收盘价位于K线波动范围顶部25% if klines.iloc[-2].close > max(ma_slow, ma_fast) and kl_range_pre <= 0.25 and kl_range_cur >= 0.75: print("最新价为:%.2f 开多头" % quote.last_price) target_pos.set_target_volume(100)
空头开仓思路
找到K线先收强再收弱的的特性作为下降趋势的做空点
具体计算公式如下:
1.判断当前K线位置在长短期均线下方
2.前一根K线的波动范围在前根K线整个波动浮动的顶部25%
3.后一根K线的波动范围在后根K线整个波动浮动的底部25%
# 开空头判断,最近一根K线收盘价在短期均线和长期均线之下,前一根K线收盘价位于K线波动范围顶部25%,最近这根K线收盘价位于K线波动范围底部25% elif klines.iloc[-2].close < min(ma_slow, ma_fast) and kl_range_pre >= 0.75 and kl_range_cur <= 0.25: print("最新价为:%.2f 开空头" % quote.last_price) target_pos.set_target_volume(-100)
清仓策略
之前的开仓思路是根据前后两根K线的走势来判断,而对应止损则是根据两根K线中的最高点或最低点加一跳或减一跳
多头止损
多头的止损策略是根据两根K线的最低点减一跳价格来判断止损,其中价格的跳数是可以自己根据合约特性进行设置
# 多头持仓止损策略 elif position.pos_long > 0: # 在两根K线较低点减一跳,进行多头止损 kline_low = min(klines.iloc[-2].low, klines.iloc[-3].low) if klines.iloc[-1].close <= kline_low - quote.price_tick: print("最新价为:%.2f,进行多头止损" % (quote.last_price)) target_pos.set_target_volume(0)
空头止损
空头的止损策略是根据两根K线的最高点加一跳价格来判断止损,其中价格的跳数是可以自己根据合约特性进行设置
# 空头持仓止损策略 elif position.pos_short > 0: # 在两根K线较高点加一跳,进行空头止损 kline_high = max(klines.iloc[-2].high, klines.iloc[-3].high) if klines.iloc[-1].close >= kline_high + quote.price_tick: print("最新价为:%.2f 进行空头止损" % quote.last_price) target_pos.set_target_volume(0)
回测
回测初始设置
初始账户资金:1000万
回测日期:2019.7.30 —— 2019.9.6
策略参数:短期均线8,长期均线40
多、空头开仓手数:100手
合约:SHFE.au1912
自动扶梯策略回测结果 | |||||
合约代码 | 合约品种 | 收益率 | 风险度 | 最大回撤 | 年化夏普率 |
SHFE.au1912 | 黄金 | 20.83% | 5.52% | 7.28% | 3.6625 |
天勤量化内该策略源码
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = "Ringo" from tqsdk import TqApi, TargetPosTask from tqsdk.ta import MA # 设置合约 SYMBOL = "SHFE.au1912" # 设置均线长短周期 MA_SLOW, MA_FAST = 8, 40 api = TqApi() quote = api.get_quote(SYMBOL) klines = api.get_kline_serial(SYMBOL, 60 * 60 * 24) quote = api.get_quote(SYMBOL) position = api.get_position(SYMBOL) target_pos = TargetPosTask(api, SYMBOL) # K线收盘价在这根K线波动范围函数 def kline_range(num): kl_range = (klines.iloc[num].close - klines.iloc[num].low) / (klines.iloc[num].high - klines.iloc[num].low) return kl_range # 获取长短均线值 def ma_caculate(klines): ma_slow = MA(klines, MA_SLOW).iloc[-1].ma ma_fast = MA(klines, MA_FAST).iloc[-1].ma return ma_slow, ma_fast ma_slow, ma_fast = ma_caculate(klines) print("慢速均线为%.2f,快速均线为%.2f" % (ma_slow, ma_fast)) while True: api.wait_update() # 每次k线更新,重新计算快慢均线 if api.is_changing(klines.iloc[-1], "datetime"): ma_slow, ma_fast = ma_caculate(klines) print("慢速均线为%.2f,快速均线为%.2f" % (ma_slow, ma_fast)) if api.is_changing(quote, "last_price"): # 开仓判断 if position.pos_long == 0 and position.pos_short == 0: # 计算前后两根K线在当时K线范围波幅 kl_range_cur = kline_range(-2) kl_range_pre = kline_range(-3) # 开多头判断,最近一根K线收盘价在短期均线和长期均线之上,前一根K线收盘价位于K线波动范围底部25%,最近这根K线收盘价位于K线波动范围顶部25% if klines.iloc[-2].close > max(ma_slow, ma_fast) and kl_range_pre <= 0.25 and kl_range_cur >= 0.75: print("最新价为:%.2f 开多头" % quote.last_price) target_pos.set_target_volume(100) # 开空头判断,最近一根K线收盘价在短期均线和长期均线之下,前一根K线收盘价位于K线波动范围顶部25%,最近这根K线收盘价位于K线波动范围底部25% elif klines.iloc[-2].close < min(ma_slow, ma_fast) and kl_range_pre >= 0.75 and kl_range_cur <= 0.25: print("最新价为:%.2f 开空头" % quote.last_price) target_pos.set_target_volume(-100) else: print("最新价位:%.2f ,未满足开仓条件" % quote.last_price) # 多头持仓止损策略 elif position.pos_long > 0: # 在两根K线较低点减一跳,进行多头止损 kline_low = min(klines.iloc[-2].low, klines.iloc[-3].low) if klines.iloc[-1].close <= kline_low - quote.price_tick: print("最新价为:%.2f,进行多头止损" % (quote.last_price)) target_pos.set_target_volume(0) else: print("多头持仓,当前价格 %.2f,多头离场价格%.2f" % (quote.last_price, kline_low - quote.price_tick)) # 空头持仓止损策略 elif position.pos_short > 0: # 在两根K线较高点加一跳,进行空头止损 kline_high = max(klines.iloc[-2].high, klines.iloc[-3].high) if klines.iloc[-1].close >= kline_high + quote.price_tick: print("最新价为:%.2f 进行空头止损" % quote.last_price) target_pos.set_target_volume(0) else: print("空头持仓,当前价格 %.2f,空头离场价格%.2f" % (quote.last_price, kline_high + quote.price_tick))
点击了解天勤量化