Py学习  »  Python

Heikin-Ashi vs 传统K线:哪种更适合Python量化交易策略?

数据科学实战 • 1 周前 • 47 次点击  

欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 我们提供了精选的国内外量化投研的 120+ 篇高质量文章,并每日更新最新研究成果,涵盖策略开发、因子分析、风险管理等核心领域。 无论您是量化投资新手还是经验丰富的研究者,星球社区都能帮您少走弯路,事半功倍,共同探索数据驱动的投资世界!

引言

K线图是交易者的必备工具。大多数人使用传统的OHLC(开盘价、最高价、最低价、收盘价)K线,但还有一种流行的替代方案:Heikin-Ashi(平均K线),它通过平滑价格走势来减少噪音并突出趋势。

乍看之下,Heikin-Ashi似乎提供了额外优势——更少的虚假信号、更平滑的走势、更容易的入场点。但它真的能改进系统化策略吗?还是平滑处理只会增加交易频率并在现实成本下消耗利润?

今天,我们将通过Python量化分析对比这两种K线策略的表现,重点关注:

  • 交易频率
  • 零成本假设下的权益曲线
  • 对滑点和佣金的敏感度

策略设计

我们将测试两种变体:

1. 传统K线(严格的实体/影线规则)

  • 要求3个连续看涨K线(收盘价 > 开盘价,实体 ≥ 60%的范围,每个影线 ≤ 20%)
  • 做空逻辑与之相反
  • 确认后入场,使用5%追踪止损
class ClassicTrendStrategy(bt.Strategy):
    params = dict(consecutive_candles=3, trail_percent=0.05,
                 min_body_pct=0.60, max_wick_pct=0.20)
                 
    def  _is_bull_fullish(self, i=0):
        o,h,l,c = float(self.data.open[-i]), float(self.data.high[-i]), float(self.data.low[-i]), float(self.data.close[-i])
        rng = max(h-l, 1e-12); body = abs(c-o)  # 计算范围和实体
        upper, lower = h-max(c,o), min(c,o)-l   # 计算上下影线
        return (c > o) and (body/rng >= self.p.min_body_pct) and (upper/rng <= self.p.max_wick_pct) and (lower/rng <= self.p.max_wick_pct)
        
    def _is_bear_fullish(self, i=0):
        o,h,l,c = float(self.data.open[-i]), float(self.data.high[-i]), float(self.data.low[-i]), float(self.data.close[-i])
        rng = max(h-l, 1e-12); body = abs(c-o)  # 计算范围和实体
        upper, lower = h-max(c,o), min(c,o)-l   # 计算上下影线
        return (c < o) and (body/rng >= self.p.min_body_pct) and (lower/rng <= self.p.max_wick_pct) and (upper/rng <= self.p.max_wick_pct)
    
    def notify_order(self, order):
        if order.status == order.Completed:
            if order.isbuy():
                self.sell(exectype=bt.Order.StopTrail, trailpercent=self.p.trail_percent)  # 买入后设置追踪止损
            elif order.issell():
                self.buy(exectype=bt.Order.StopTrail, trailpercent=self.p.trail_percent)   # 卖出后设置追踪止损
    
    def next(self):
        if len(self) < self.p.consecutive_candles: return
        if not self.position:
            if all(self._is_bull_fullish(i) for i in range(self.p.consecutive_candles)):
                self.buy()  # 连续多根看涨K线后做多
            elif all(self._is_bear_fullish(i) for i in range(self.p.consecutive_candles)):
                self.sell()  # 连续多根看跌K线后做空

2. Heikin-Ashi趋势策略

Heikin-Ashi重新定义OHLC值:

  • HA_Close = (O + H + L + C) / 4
  • HA_Open = (prev_HA_Open + prev_HA_Close) / 2
  • HA_High = max(H, HA_Open, HA_Close)
  • HA_Low = min(L, HA_Open, HA_Close)

这种平滑处理倾向于减少噪音,但生成更具趋势性的K线。

回测框架

我们使用Backtrader结合yfinance数据,对AAPL(苹果公司)自2015年以来的日线K线进行回测。交易成本设置:

  • 基本情况:5个基点佣金,零滑点
  • 敏感度测试:从5到35个基点(佣金+滑点综合)
def run_backtest(strategy, df, cash=100000, commission=0.0005, slippage=0):
    cerebro = bt.Cerebro()
    cerebro.adddata(bt.feeds.PandasData(dataname=df))
    cerebro.addstrategy(strategy, **kwargs)
    cerebro.broker.setcash(cash)
    cerebro.broker.setcommission(commission=commission)  # 设置佣金
    cerebro.broker.set_slippage_perc(slippage)          # 设置滑点
    
    # 添加分析器
    cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name="trades")
    cerebro.addanalyzer(bt.analyzers.Returns, _name="returns")
    cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name="sharpe")
    
    res = cerebro.run()[0]
    trades = res.analyzers.trades.get_analysis()
    total = trades.get("total", {}).get("closed"0)
    wins = trades.get("won", {}).get("total"0)
    
    return dict(
        final=cerebro.broker.getvalue(),
        cagr=res.analyzers.returns.get_analysis().get("rnorm100", np.nan),
        sharpe=res.analyzers.sharpe.get_analysis().get("sharperatio", np.nan),
        ntrades=total,
        winrate=(wins/total*100 if total else np.nan)
    )

结果分析

1. 基本情况(AAPL日线,2015-2025)

  • 传统K线:最终资金 $100,062 | 年复合增长率 0.01% | 夏普比率 -33.80 | 交易次数 93
  • Heikin-Ashi:最终资金 $99,927 | 年复合增长率 -0.01% | 夏普比率 -32.20 | 交易次数 187

结论:

  • 传统K线:交易较少,略微正向漂移
  • Heikin-Ashi:交易次数几乎翻倍,但表现略微转为负面

2. 交易频率

Heikin-Ashi的交易次数几乎是传统K线的两倍。这可能感觉"更活跃",但更多的交易意味着更多的成本。

3. 滑点/佣金敏感度

我们将总往返成本从5个基点逐步提高到35个基点:

  • 传统K线性能缓慢下降
  • Heikin-Ashi衰减更快,因为更高的交易频率放大了成本影响

结果:任何摩擦成本都会更快地杀死Heikin-Ashi策略的表现。

经验教训

  1. 更多交易≠更多利润:Heikin-Ashi的平滑外观并没有转化为更稳健的交易——只是产生了更多交易。

  2. 交易成本起主导作用:在规模上,5-10个基点听起来很小,但乘以187笔交易,性能就会崩溃。

  3. 传统K线更健壮:更严格的过滤器产生更少但更有弹性的交易,对成本敏感度更低。

下一步探索

  • 测试其他市场:外汇和加密货币可能从Heikin-Ashi中受益更多
  • 探索日内时间框架,交易频率自然上升的场景
  • 将Heikin-Ashi用作过滤器(趋势确认),而不是独立触发器

总结

Heikin-Ashi并非灵丹妙药。它确实会更频繁地交易,但在我们的AAPL日线回测中,这些额外的交易只会增加对滑点和佣金的敏感度。传统K线虽然规则更严格,但产生的交易更少且更稳健。

在开发Python量化交易策略时,我们需要权衡交易频率与成本之间的关系,而不仅仅追求"看起来更好"的指标。实际上,经常是那些过滤条件更严格、交易次数更少的策略在考虑现实交易成本后表现更好。

参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。

财经数据与量化投研知识社区

核心权益如下:

  1. 赠送《财经数据宝典》完整文档,汇集多年财经数据维护经验
  2. 赠送《量化投研宝典》完整文档,汇集多年量化投研领域经验
  3. 赠送《PyBroker-入门及实战》视频课程,手把手学习量化策略开发
  4. 每日分享高质量量化投研文章(已更新120+篇)、代码和相关资料
  5. 定期更新高频财经数据
  6. 参与年度不少于 10 次专属直播与录播课程
  7. 与核心开发者直接交流,解决实际问题
  8. 获取专业微信群交流机会和课程折扣

星球已有丰富内容积累,包括量化投研论文、财经高频数据、 PyBroker 视频教程、定期直播、数据分享和答疑解难。适合对量化投研和财经数据分析有兴趣的学习者及从业者。欢迎加入我们!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐

《Python编程:从入门到实践(第3版)》是一本广受欢迎的 Python 入门经典教材,由经验丰富的程序员 Eric Matthes 编写。该书采用循序渐进的教学方式,从基础语法讲解到实战项目开发,内容编排合理,实例丰富,语言通俗易懂。全书配有大量练习题和完整项目实战,包括数据可视化、网络爬虫、Web 应用开发等,让读者在实践中掌握编程技巧。第3版还增加了 f-string、海龟绘图等最新的 Python 特性内容。这本书不仅适合零基础读者入门学习,也非常适合想系统掌握 Python 的编程爱好者以及数据分析、人工智能等领域的学习者。它不仅教授编程知识,更注重培养读者的编程思维,是一本非常值得投资的 Python 学习指南。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/186062
 
47 次点击