欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 我们提供了精选的国内外量化投研的 120+ 篇高质量文章,并每日更新最新研究成果,涵盖策略开发、因子分析、风险管理等核心领域。 无论您是量化投资新手还是经验丰富的研究者,星球社区都能帮您少走弯路,事半功倍,共同探索数据驱动的投资世界!
引言
K线图是交易者的必备工具。大多数人使用传统的OHLC(开盘价、最高价、最低价、收盘价)K线,但还有一种流行的替代方案:Heikin-Ashi(平均K线),它通过平滑价格走势来减少噪音并突出趋势。
乍看之下,Heikin-Ashi似乎提供了额外优势——更少的虚假信号、更平滑的走势、更容易的入场点。但它真的能改进系统化策略吗?还是平滑处理只会增加交易频率并在现实成本下消耗利润?
今天,我们将通过Python量化分析对比这两种K线策略的表现,重点关注:
策略设计
我们将测试两种变体:
1. 传统K线(严格的实体/影线规则)
- 要求3个连续看涨K线(收盘价 > 开盘价,实体 ≥ 60%的范围,每个影线 ≤ 20%)
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线进行回测。交易成本设置:
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
结论:
- Heikin-Ashi:交易次数几乎翻倍,但表现略微转为负面
2. 交易频率
Heikin-Ashi的交易次数几乎是传统K线的两倍。这可能感觉"更活跃",但更多的交易意味着更多的成本。
3. 滑点/佣金敏感度
我们将总往返成本从5个基点逐步提高到35个基点:
- Heikin-Ashi衰减更快,因为更高的交易频率放大了成本影响
结果:任何摩擦成本都会更快地杀死Heikin-Ashi策略的表现。
经验教训
更多交易≠更多利润:Heikin-Ashi的平滑外观并没有转化为更稳健的交易——只是产生了更多交易。
交易成本起主导作用:在规模上,5-10个基点听起来很小,但乘以187笔交易,性能就会崩溃。
传统K线更健壮:更严格的过滤器产生更少但更有弹性的交易,对成本敏感度更低。
下一步探索
- 测试其他市场:外汇和加密货币可能从Heikin-Ashi中受益更多
- 将Heikin-Ashi用作过滤器(趋势确认),而不是独立触发器
总结
Heikin-Ashi并非灵丹妙药。它确实会更频繁地交易,但在我们的AAPL日线回测中,这些额外的交易只会增加对滑点和佣金的敏感度。传统K线虽然规则更严格,但产生的交易更少且更稳健。
在开发Python量化交易策略时,我们需要权衡交易频率与成本之间的关系,而不仅仅追求"看起来更好"的指标。实际上,经常是那些过滤条件更严格、交易次数更少的策略在考虑现实交易成本后表现更好。
参考文章
加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。财经数据与量化投研知识社区
核心权益如下:
-
赠送《财经数据宝典》完整文档,汇集多年财经数据维护经验
- 赠送《量化投研宝典》完整文档,汇集多年量化投研领域经验
- 赠送《PyBroker-入门及实战》视频课程,手把手学习量化策略开发
- 每日分享高质量量化投研文章(已更新120+篇)、代码和相关资料
星球已有丰富内容积累,包括量化投研论文、财经高频数据、 PyBroker 视频教程、定期直播、数据分享和答疑解难。适合对量化投研和财经数据分析有兴趣的学习者及从业者。欢迎加入我们!