追踪历史新高的量化交易策略


创建日期: 2024-01-22 08:59:34 最后修改: 2024-01-22 08:59:34
复制: 0 点击次数: 327
1
关注
1105
关注者

追踪历史新高的量化交易策略

概述

该策略主要是追踪证券的历史最高价格,当价格回落到最高价格的一定百分比时买入,当价格重新突破历史最高价时卖出,属于趋势跟踪策略。

策略原理

该策略首先记录证券自2011年1月1日至今的最高价格,定义为highestHigh变量。然后它绘制该最高价格的水平线allTimeHigh。

在运行过程中,每天判断当日的最高价格是否创新高,如果创新高,则更新highestHigh变量和重绘allTimeHigh水平线。

该策略有3条重要的水平线:

  1. buyzone=highestHigh*0.9:最高价的90%水平,代表强势回吸机会

  2. buyzone2=highestHigh*0.8:最高价的80%水平,代表比较有吸引力的回吸位置

  3. sellzone=highestHigh*0.99:最高价的99%水平,代表判断趋势反转的机会

当价格下跌至80%水平线(buyzone2)时发出买入信号;当价格重新突破历史最高价的99%水平线(sellzone)时发出卖出平仓信号。

该策略的主要判断依据就是追踪历史最高价以及不同比例水平线,属于典型的趋势跟踪策略。

优势分析

该策略最大的优势在于能捕捉长期的上涨趋势,通过等待回吸再入场,达到低买高卖的效果。具体优势如下:

  1. 能抓住股票长期上涨趋势的机会,追踪最高价是判断趋势的重要依据

  2. 回吸最高价的80%这个位置代表风险回报比最优,既能确保上涨后的利润空间,也限制了下跌的风险

  3. 99%的历史最高价作为止损线,让利润最大化同时控制风险

  4. 可用来检验股票是否进入结构性上涨机会,最高新高代表企业实力增强

  5. 参数可调整空间大,可针对不同股票个性化优化

所以该策略最大限度利用股票上涨趋势带来的收益,而避开短期调整的风险,属于风险收益比很好的趋势跟踪策略。

风险分析

该策略的主要风险在于买入后价格可能再创新低,继续下跌的概率。主要风险包括:

  1. 买入后价格继续下跌急跌停的概率,可能面临亏损

  2. 最高价其实代表着热点追涨杀跌的高点,继续上涨动力可能不足

  3. 如果参数设置不当,止损点过高过低都存在不同问题

  4. 交易频率可能较低,容易受外部环境影响比如大盘走势

  5. 没有考虑个股的基本面与估值情况,选择买入股票的依据较弱

主要的解决方法是:合理评估股票的基本面,确保选股质量;调整参数如买入比例,止损点以优化策略;考虑与其他策略合并实施等。

优化方向

该策略的主要优化方向在于参数调整,选股规则,止损方式的改进。具体如下:

  1. 优化买入和止损的技术指标,如考虑KD,MACD等指标避开高位

  2. 改进选股规则,加入基本面与估值指标,确保选股质量

  3. 动态调整参数比例,和大盘联动确保参数的合理性

  4. 设置移动止损或时间止损,优化止损方式与止损位置

  5. 考虑与其他因子策略合并,形成多因子模型,提高稳定性

  6. 加入量能指标判断力度,避免选择股票上涨后期低迷期

因此该策略的优化方向主要在于选股规则,参数调整,止损方式的改进,在原有追踪趋势的基础上,进一步提高稳定性和风险调整收益。

总结

该策略属于典型的追踪历史新高进行趋势跟踪的策略。它能有效抓住股票长期上涨趋势,通过技术回吸的方式获得较优的风险收益比。但由于没有考虑基本面因素,稳定性和抗风险能力较弱。关键的优化方向在于改进选股规则,调整参数止损,优化止损机制等方法。如果通过多因子模型与其他策略联合使用,则可以形成一个风险收益比极佳的量化选股与交易策略。

策略源码
                
                    /*backtest
start: 2023-01-21 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("All-time-high", "ATH", overlay=true, initial_capital=10000, default_qty_value=100, default_qty_type=strategy.percent_of_equity, pyramiding=1, commission_type=strategy.commission.cash_per_contract, commission_value=0.000)

// input
Athlw = input(title="All-time-high line widths", type=input.integer, defval=4, minval=0, maxval=4)
Athlc = input(title="All-time-high line color", type=input.color, defval=color.new(color.fuchsia,50))
years = input(title="Years back to search for an ATH", type=input.integer, defval=6,minval=0, maxval=100)

var float   highestHigh = 0
// var line    allTimeHigh = line.new(na, na, na, na, extend=extend.both, color=Athlc, width=Athlw)

if high > highestHigh
    highestHigh := high

// if barstate.islast
//     line.set_xy1(allTimeHigh, bar_index-1, highestHigh)
//     line.set_xy2(allTimeHigh, bar_index,   highestHigh)

plot(highestHigh)
buyzone=highestHigh*0.9
buyzone2=highestHigh*0.8
buyzone3=highestHigh*0.7
sellzone=highestHigh*0.99

plot(buyzone, color=color.red)
plot(buyzone2, color=color.white)
plot(buyzone3, color=color.green)

begin = timestamp(2011,1,1,0,0)
end = timestamp(2022,4,19,0,0)

longCondition = close<buyzone2
if (longCondition)
    strategy.entry("Buy", strategy.long)
closeCondition = close>sellzone
if (closeCondition)
    strategy.close("Buy", strategy.long)

                
            
更多内容