- Published on
Simple Trendlines
- Authors

- Name
- CoresightQuant
NOTE
本文为公开交易策略的技战术复盘,聚焦方法逻辑、交易场景与风险边界。
策略解读
趋势线大概是技术分析世界中最古老、最直观、也最容易被滥用的工具之一。几乎每一位交易者都曾在图表上徒手画过一条斜向上的直线,试图捕捉价格回撤的支撑,或者在价格创新高时连接那些低点,期待新一轮上涨的延续。然而,当交易者试图把趋势线“程序化”、做成可回测的规则时,困难立刻浮现:应该连接哪些点?斜率如何计算?什么时候算有效突破?更麻烦的是,不同周期、不同级别的趋势线往往相互交叉,极易产生信号冲突——也就是脚本描述中提到的“泄漏”问题。
上述脚本标题为“Simple Trendlines”,作者是 HoanGhetti。它试图解决的,正是趋势线绘制在程序化实现中的几个核心痛点:简化接口、封装斜率计算、避免提前“画线”带来的未来函数。整篇文章将围绕这一思路展开,讨论趋势线的底层逻辑、实战应用以及值得改进的方向。需要说明的是,原文是一个工具库的说明文档,其核心价值在于工程实现上的精巧,而本文更希望挖掘其背后的交易理念与通用方法。
首先,我们来看“10 个属性和 2 个方法”意味着什么。在面向对象的设计中,属性是描述对象状态的数据,方法则是对象可以执行的操作。将趋势线抽象为一个对象,那么它的属性可能包括:起点价格、终点价格、起点时间、终点时间、斜率、截距、当前是否有效、所属时间级别等等。而两个方法,可能一个是“更新”或“确认”某条趋势线,另一个是“绘制”或“判断价格与该线的关系”。这种极简的设计告诉我们,趋势线的本质并不复杂:它不过是一条由两个关键点确定的直线,其斜率决定了方向,其位置决定了支撑或压力的强度。
值得强调的是,脚本中特别提到“确保没有泄漏”。这在量化中是一个极其重要的警示。“泄漏”通常指未来数据被无意中用于当前决策,例如在今天的信号中悄悄使用了明天的价格。对于趋势线来说,最常见的泄漏是在趋势线尚未完全形成时,就假设它早已存在于图表上。比如,当价格第三次触碰某条上升趋势线时,这条线看起来很完美,但在第一次触碰时,我们其实无法预知后面还会有两次触碰。如果一个策略在回测中“知道”未来会形成一条有效的趋势线,从而在第一次触碰时就下单,那么回测结果必然失真。脚本作者通过精心的设计来避免这种前视偏差,这一思想值得所有策略开发者借鉴。
从交易理念上看,趋势线的使用本质上是在追随“动量”与“趋势”。动量指的是价格变化的速度和力度,趋势则是价格在一段时间内持续向同一方向移动的现象。上升趋势线通过连接向上的波谷,描绘出市场每一次回调都在更高位置被买盘接住的事实;下降趋势线则连接向下的波峰,反映出每次反弹都会遭遇更强的卖压。当价格在趋势线附近获得支撑或阻力时,说明市场参与者的行为模式仍在延续,因此我们可以将趋势线视为一个动态的支撑/阻力位。相比于水平支撑阻力,趋势线能够捕捉到市场状态的渐变,例如加速上涨或减速下跌,这就为交易者提供了更早的介入时机。
但是,任何工具都有其局限性。趋势线最大的问题在于主观性。不同的人在同一张图表上可能画出完全不同的趋势线,因为选取的波峰波谷不同,或者对触碰次数的要求不同。即使程序化后,也需要预先定义“什么是有效的波峰波谷”,这往往需要引入额外的指标(如分形、摆动指标)来识别。此外,趋势线在震荡市中几乎毫无用处,频繁的假突破会不断止损。因此,一个成熟的趋势线策略必须搭配过滤条件,例如平均方向性指数(ADX)来判定趋势强度,或者成交量与持仓量的配合。
在实战应用中,我们可以把趋势线策略简化为以下步骤:先识别主要趋势方向(上升、下降或横盘);在趋势方向上确认至少两个有效的回调点(或反弹点),连线形成趋势线;当价格第三次回调至趋势线附近且出现止跌信号(如十字星、看涨吞没)时,视为做多机会;当价格有效跌破趋势线(通常以收盘价为准,或超过一定百分比/波动幅度)时,视为趋势反转,平仓或反向操作。更精细的做法是同时绘制多条趋势线,例如短期趋势线和长期趋势线,形成类似“通道”的结构,从而在通道上轨卖出、下轨买入。
回到脚本的设计初衷,它把斜率计算封装起来,对开发者来说是一个极大的便利。手动计算斜率不仅繁琐,还容易出错,尤其是在处理不同时间周期时,坐标尺度可能剧烈变化。如果工具库能自动根据价格和时间坐标计算出斜率,并处理好对数坐标或线性坐标的差异,就能让使用者专注于更高层次的逻辑,例如信号触发条件、仓位管理等。这正是“简单”二字的真正含义:不是功能简单,而是让复杂的事情变得易于使用。
然而,趋势线策略也并非万能的。它的优点非常显著,但缺点同样不容忽视。我们将在后续章节详细展开。
名词解释
-
趋势线(Trendline):在价格图表上连接两个或更多显著高点或低点的直线,用来表示价格运动的总体方向。上升趋势线连接波谷,下降趋势线连接波峰。
-
斜率(Slope):直线的倾斜程度,数值上等于价格变动量与时间变动量的比值。斜率越大,说明价格变动越快,趋势越陡峭;斜率接近于零,则说明市场处于横盘状态。
-
动量(Momentum):衡量价格变动速度和加速度的概念。高动量意味着价格在短时间内大幅波动,趋势延续的可能性较大;动量衰竭则常常预示着反转。
-
数据泄漏(Data Leakage):在策略回测或信号计算中,意外地用到了当前时刻之后才产生的数据。例如用未来形成的趋势线来判定过去的买卖点。它会高估策略的盈利能力,是回测中的大忌。
-
面向对象结构(Object-Oriented Structure):一种软件设计范式,将数据和行为封装在“对象”中。在趋势线工具中,每条趋势线可以视为一个对象,带有自己的属性(如起点、终点、斜率)和方法(如判断价格触碰)。
-
属性(Property):对象所拥有的特征或数据。对于趋势线对象,属性包括支撑位/压力位的价格、形成时间、斜率等。
-
方法(Method):对象能够执行的操作或功能。在趋势线库中,方法可能包括“更新趋势线”“计算触碰信号”等。
-
支撑位与阻力位(Support and Resistance):价格下跌时可能止跌反弹的价位称为支撑位;价格上涨时可能遇阻回落的价位称为阻力位。趋势线是动态变化的支撑/阻力位。
策略思路讲解
趋势线策略的核心思路可以概括为“趋势跟踪 + 动态支撑阻力”。它默认一个前提:市场一旦形成趋势,更大概率会延续而不是立即反转。因此,交易者的任务是找到趋势线,并等待价格回落到趋势线附近时顺势入场。
具体逻辑大致分为以下五个步骤:
第一,定义趋势。一般来说,上升趋势需要至少两个依次抬高的低点,下降趋势则需要两个依次降低的高点。这两个点连线便构成了初始趋势线。为了确认趋势线的有效性,通常还需要第三个点来“验证”——当价格第三次触及趋势线并发生明显反弹时,这条趋势线的可信度才会显著提高。
第二,确定入场时机。价格沿着趋势线运行的过程中,每次回调到趋势线附近都是一个潜在的入场点。但仅凭趋势线本身是不够的,因为价格可能直接击穿趋势线。因此,实战中需要结合其他确认手段,如K线形态(锤子线、倒锤子、看涨吞没)、技术指标(相对强弱指标RSI的超卖区域、MACD柱状图缩短),或者成交量变化(缩量回调后又放量回升)。如果价格在趋势线附近没有出现任何止跌迹象,则不能盲目入场。
第三,设定止损。止损位通常放在趋势线下方(对于上升趋势线)一定距离处,或者放在最近一个摆动低点的下方。由于趋势线是动态的,止损也可以随着趋势线的上升而不断上移,例如采用“移动止损”或“追踪止损”。这种做法的好处是能在趋势延续时锁定利润,同时防止趋势反转导致过大亏损。
第四,管理仓位与盈利目标。盈利目标可以设定为前一个高点,或者使用固定盈亏比(如2:1或3:1)。也有一些策略会把趋势线本身作为出场信号:当价格收盘跌破趋势线时,无条件平仓。这被称为“线性退出规则”,简单直接,但同时也会因假突破而过早离场。
第五,过滤震荡市场。趋势线在震荡市中的表现通常糟糕,因为价格会反复穿越趋势线。一个有效的过滤器是使用平均方向性指数(ADX)。当ADX低于某一阈值(如20或25)时,表明市场没有明确的趋势,此时应关闭趋势线策略;当ADX升高并稳定在30以上时,才开启信号。另一种过滤方式是观察趋势线的斜率:过于平缓的趋势线(斜率接近0)意味着市场动能不足,不宜交易。
此外,脚本中提到“没有泄漏”的设计为策略回测提供了公平的环境。在手动交易中,人们常常会在事后看到一条完美的趋势线,误以为自己当时也能画出来。事实上,在价格第三次触线之前,那条线并不存在。因此,程序化实现必须严格规定趋势线的形成条件——比如至少需要两个已确认的波谷(且第二个波谷高于第一个),只有在这两个波谷都成为历史数据之后,才允许画出趋势线。任何在第一个波谷刚出现时就假设第二个波谷也会出现的行为,都属于未来函数。这一点对于策略的可信度至关重要。
优点
第一,逻辑简单直观。趋势线是技术分析中最基础、最容易被理解的概念之一,不需要复杂的数学公式。投资者能够很快接受并应用,即使没有任何编程经验也能理解其含义。
第二,动态适应市场结构。不同于固定价格的水平支撑/阻力,趋势线会随着价格的波动而变化,能够及时反映市场重心的移动。尤其在趋势加速或减速的过程中,趋势线的斜率变化可以帮助交易者感知市场情绪。
第三,可与其他指标良好结合。趋势线不排斥任何其他技术工具,它可以与移动平均线、成交量、MACD、RSI等指标组合使用,互相验证。这种开放性使得趋势线策略具有极高的扩展性。
第四,能有效控制回撤。通过追踪趋势线进行移动止损,交易者可以在趋势持续时持有较长时间,并在趋势反转时果断离场,从而在牛市中赚取可观利润,同时避免在熊市中深套。
第五,对趋势市场具有很强的适应性。在强劲的上升或下降趋势中,趋势线策略往往能抓到大段行情。它的核心思想顺势而为,符合“让利润奔跑,截断亏损”的交易格言。
缺点
第一,滞后性。趋势线的形成需要至少两个已确认的波谷或波峰,因此它天然滞后于价格。当一条趋势线被清晰画出时,趋势可能已经走完大半,此时入场可能需要承担较大的回调风险。
第二,主观性强。虽然程序化可以固定算法,但在算法设计过程中,如何选取波峰波谷、如何判断触碰、如何定义突破,每个环节都存在主观选择。不同的参数设定会产生截然不同的信号,这使得策略的稳定性和普适性面临挑战。
第三,在震荡市中极易亏损。横盘市场里,价格上下假突破频繁,趋势线会不断被击穿再重新形成,导致策略频繁止损。若没有有效的过滤条件,趋势线策略几乎无法在震荡市中幸存。
第四,没有提供交易强度或止损幅度的标准答案。趋势线只给出方向性信息,不包含任何关于仓位大小、风险收益比或时间框架的指导。使用者需要自行解决这些关键问题,否则很容易因仓位过重或止损过窄而提前出局。
第五,对突变事件无能为力。全球宏观新闻、央行决议、不可预见的黑天鹅事件会瞬间打破任何技术形态,趋势线亦不能幸免。跳空缺口可能直接穿越趋势线,导致止损执行困难或滑点扩大。
起源年份考证
需要说明的是,这里考证的对象是“趋势线”这一技术分析方法,而非具体脚本的发布时间。该脚本作者 HoanGhetti 的库发布于近年,但由于没有明确披露年份,我们无法确定精确日期。作为一类方法,趋势线的历史可以追溯到技术分析早期。
-
19世纪末至20世纪初:查尔斯·道(Charles Dow)创立了道氏理论,提出股票价格运动包含主要趋势、次级趋势和小幅波动。虽然道氏理论并未直接使用“趋势线”一词,但其对“趋势”的强调为后续画线技术奠定了基础。通常认为道氏理论的核心形成于 1900 年前后,查尔斯·道于 1902 年逝世后,其思想由威廉·汉密尔顿(William Hamilton)等人整理传播。
-
20世纪20至30年代:理查德·沙贝克(Richard Schabacker)在《技术分析与股票市场利润》等著作中系统研究了图表形态,明确提出了支撑、阻力以及趋势线的画法。沙贝克被视为技术分析图表派的先驱之一,他活跃于 20 世纪 20 年代和 30 年代。
-
20世纪40至50年代:约翰·马吉(John Magee)与爱德华兹(Robert Edwards)合著的《股票趋势技术分析》于 1948 年首次出版,该书将趋势线的绘制规则进一步标准化,成为技术分析领域的经典教科书。趋势线由此在西方证券分析界广泛流行。
-
20世纪70至80年代:随着计算机技术的普及,趋势线开始被编写为程序化指标。早期的技术分析软件如 MetaStock等提供了画线工具,但程序化识别趋势点仍属于前沿尝试。这一阶段出现了诸如“自动趋势线”之类的概念,但在自动化处理波峰波谷识别方面仍较为粗糙。
-
21世纪初至今:量化交易兴起后,趋势线识别算法逐渐成熟。包括分形算法、摆动系统、线性回归通道等工具被用于自动生成趋势线,同时严格的前视偏差控制成为程序化实现的基本要求。本文讨论的“Simple Trendlines”库正是这一时期的代表作品,它体现了现代交易者对封装性、易用性和数据安全性的追求。
可以看出,趋势线本身经历了从手工绘制到规则标准化、再到程序化实现的漫长演变。今天的趋势线工具虽然形式简单,但其背后沉淀了逾百年的市场智慧。
改进建议
第一,引入多重时间框架确认。单条趋势线在不同周期上的有效性差异很大。建议在策略中加入日线、小时线等大周期趋势线作为过滤条件,只有当多个周期趋势方向一致时才交易。例如,大周期为上升趋势,小周期价格回调至小趋势线附近时买入,胜率会明显提升。
第二,使用自适应趋势线。固定斜率的趋势线在波动率变化时容易失效。可以引入平均真实波幅(ATR)来计算“趋势线通道”,即将趋势线上下平移一定倍数的ATR,形成一个动态通道。价格触及通道下轨视为超卖,触及上轨视为超买,这样可减少假突破。
第三,添加动量确认指标。趋势线只回答“方向”问题,不回答“力度”问题。建议与MACD、RSI或动量震荡指标结合。例如,当价格接触上升趋势线时,若RSI处于30以下且出现底背离,则买入信号更可靠;如果RSI仍然高企且持续钝化,则说明上升趋势极强,反而可以继续持有多单。
第四,设置基于波动率的止损与止盈。固定点数止损在不同波动率环境下效果差异极大。可以使用“ATR倍数”止损,例如收盘价低于趋势线下方 1.5 倍 ATR 时离场。这样的止损既能容纳正常波动,又可避免突如其来的小波动触发不必要的止损。
第五,建立趋势线失效判定规则。一个有效的趋势线被跌破后,并不一定立刻反转,有时只是从一条趋势线过渡到另一条更平缓的趋势线。建议定义“重新画线”的条件:当价格跌破趋势线后,如果在 2 根K线内收回该线之上,则视为假突破,继续沿用原趋势;如果连续 3 根K线收于趋势线下方,则视为有效突破,平仓并考虑反向操作。
第六,考虑加入成交量确认。成交量是趋势可信度的重要参考。上升趋势中,回调到趋势线附近时成交量应萎缩,而反弹时成交量应放大。程序化实现时,可以读取关键K线(触碰趋势线的那根)的成交量,当其低于前五根平均成交量且随后一根阳线放量时,认定支撑有效。
第七,使用机器学习优化参数。如果允许更复杂的方法,可以用遗传算法或网格搜索来优化趋势线的形成参数(如波峰波谷的回溯窗口、触碰次数、突破确认阈值)。但要注意防止过拟合,务必使用样本外数据验证。
第八,增加无未来函数的严格检测。在代码逻辑中,务必确保趋势线只使用过去的数据点。可以设计一种“时间轴校验”机制,每次生成信号时都记录当时已确认的波峰波谷列表,并在复盘时逐条比对该列表是否与历史一致。这能有效规避因编程疏漏导致的数据泄漏。
总结
趋势线,仿佛一张连接过去与未来的地图。它用最简洁的线条勾勒出市场多空力量的对比,让交易者从杂乱的价格波动中提炼出秩序。然而,“简单”并不等于“容易”。任何一条看似优美的趋势线,背后都涉及点位的选择、斜率的计算、突破的确认,以及对未来的假设。脚本“Simple Trendlines”通过面向对象的封装设计,将复杂的斜率计算和防泄漏机制隐藏起来,让使用者可以专注于策略逻辑本身,这种“把复杂留给自己,把简单留给他人”的工程理念,确实值得赞赏。
从交易实操的角度来看,趋势线永远不应当孤立存在。一个成熟的交易系统需要融合趋势识别、入场确认、仓位管理和风险控制等多个环节。趋势线提供的是“骨架”,而均线、成交量、K线形态、动量指标等则是填充其上的血肉。只有当趋势线被严格的市场逻辑所支持,它才能真正成为一座可靠的灯塔。
最后需要清醒认识到,任何技术工具都存在失效的时刻。趋势线在趋势市中大放异彩,在震荡市中却可能反复打脸。策略改进的核心不是追求完美胜率,而是建立一套具备正期望值的规则,并严格遵守纪律。无论你采用简单的手工画线,还是依靠精心设计的程序化库,都应牢牢记住那句古老的交易箴言:“让趋势存在时遵从趋势,在趋势缺席时保持谦逊。”这或许正是“趋势线,从此简单”这句话背后真正的深意。