趋势跟随:如何在六成时间都在亏钱的情况下赚钱

Read in English

多数趋势跟随系统在 55% 至 65% 的交易中亏钱。然而它们为理查德·丹尼斯、艾德·塞柯塔、比尔·邓恩这些传奇交易者赚下了数十亿美元。秘诀是什么?狠心止损,并让盈利的仓位一直跑到趋势结束。下面讲这套数学如何成立——以及为什么多数交易者受不了它。

📚 预备知识

在深入趋势跟随之前,请先读过:

什么是趋势跟随?

趋势跟随简单得有些欺骗性:

  1. 识别新趋势何时启动 (突破、均线交叉等)
  2. 按趋势方向 建立仓位
  3. 使用追踪止损 在趋势延续时锁定收益
  4. 趋势反转时离场 (触及止损或出现反转信号)

核心原则: 快速止损(每笔承担 2% 至 3% 的风险),让盈利奔跑(20%、50%、100% 以上)。你在多数交易上都会亏钱,但少数几笔大赢足以补回来还有余。

⚠️ 残酷的现实

趋势跟随系统通常具有:

  • 胜率: 35-45% (你会在 55% 至 65% 的交易中亏钱)
  • 平均盈利 / 平均亏损:2.5:1 到 4:1 (赢的时候赢得很大)
  • 连亏:5 到 10 笔 (很常见,而且在心理上极其煎熬)
  • 回撤:20% 至 35% (你会多次亏损 25% 以上)

你受得了六成时间都是错的吗? 多数交易者受不了。这正是趋势跟随有效的原因——它要求一种多数人并不具备的情绪纪律。

趋势跟随为何有效

市场的趋势比你以为的多

学术研究显示,市场有 30% 至 40% 的时间处于强趋势中。剩下的 60% 至 70% 呢?震荡、区间内的噪音。

趋势跟随者的优势:

  • 抓住大级别行情: 2009-2020 年的牛市、2022 年的熊市、商品超级周期
  • 在震荡中接受小亏: 区间行情中每笔失败交易吐回 1% 至 2%
  • 最终结果: 大赢压倒众多小亏

行为层面的优势(它为何持续有效)

趋势跟随利用了人的三种偏差:

  1. 锚定: 投资者锚定在近期价格上("不可能再涨了"),而趋势仍在延续
  2. 处置效应: 投资者过早卖出赢家(趋势跟随者继续骑着),过久持有输家(趋势跟随者快刀斩断)
  3. 羊群效应: 趋势展开时更多投资者涌入,把行情推得更远

三种经过验证的趋势跟随方法

方法一:均线交叉(经典款)

50/200 日均线"金叉":

买入信号: 50 日均线上穿 200 日均线(金叉)

卖出信号: 50 日均线下穿 200 日均线(死叉)

📊 金叉策略表现(标普 500,2000-2024)

  • 策略回报: 年化 +8.2%,买入持有为 +9.8%
  • 最大回撤: -28.4%,买入持有为 -55.2%(躲过了 2008 年崩盘!)
  • 夏普比率: 0.68 对 0.52(风险调整后回报更好)
  • 胜率: 42%(多数交叉都是来回打脸)
  • 平均盈亏比: 3.2:1(赢时很大,亏时很快)

结论: 原始回报更低,但过程平稳得多,避开了灾难性回撤。

它为何有效: 50/200 交叉很慢。它错过趋势最初的 10% 至 20%,但吃到了中段最肥的 50% 至 70%。它离场也晚,从峰值吐回 10% 至 15%。但它在熊市里空仓,从而躲开了 40% 至 50% 的崩盘。

更好的替代:20/50 EMA(指数移动平均线)

  • 对趋势变化反应更快(EMA 给近期价格更高权重)
  • 更早捕捉趋势,但来回打脸也更多
  • 回测显示年化 9.4%,最大回撤 -22.1%(2000-2024)
  • 胜率降到 38%,但平均盈亏比改善到 3.8:1

方法二:唐奇安通道突破(海龟系统)

这套策略让理查德·丹尼斯的"海龟"们把 1,000 美元变成了超过 1 亿美元:

设置:

  • 唐奇安通道: 过去 N 天的最高价与最低价(通常取 20 或 55 天)
  • 买入信号: 价格突破 20 日高点(创新高 = 趋势启动)
  • 卖出信号: 价格跌破 10 日低点(趋势反转)
  • 做空信号: 价格跌破 20 日低点(用于下降趋势)

仓位管理(海龟的秘密武器):

  • 每笔风险: 组合的 2%
  • 止损: 入场价下方 2 × ATR(平均真实波幅)
  • 仓位规模: (组合 × 2%)÷(2 × ATR)

示例(SPY 突破):

  • 组合:100,000 美元
  • SPY 价格:450 美元
  • ATR(14 日):6.00 美元
  • 止损:2 × 6 = 入场价下方 12 美元 = 438 美元
  • 每股风险:12 美元
  • 目标风险:100,000 × 2% = 2,000 美元
  • 仓位规模:2,000 ÷ 12 = 166 股(约 75,000 美元的仓位)

✅ 唐奇安突破表现(多资产,1990-2024)

  • 年化复合增长率: 12.8%(涵盖股票、债券、商品、货币)
  • 夏普比率: 0.82
  • 最大回撤: -32.1%(2008-2009 年,18 个月内收复)
  • 胜率: 38%(62% 的交易是亏钱的!)
  • 平均盈亏比: 4.2:1(盈利平均 21%,亏损平均 5%)
  • 最长连亏: 连续 13 笔亏损(2015 年 3 月至 6 月)

现实情况 check: 你会连续输 13 笔。你还能继续执行这套系统吗?

方法三:ATR 追踪止损(随波动率自适应)

固定止损的问题: 对低波动股票设 2% 止损,正常噪音就会把你扫出局;对高波动股票设 2% 止损,则完全不给交易留出空间。

解决方案:基于 ATR 的追踪止损

运作方式:

  1. 计算 ATR(14): 14 天的平均真实波幅(衡量波动率)
  2. 入场: 在突破时买入(唐奇安、均线交叉等)
  3. 初始止损: 入场价 -(3 × ATR)
  4. 追踪止损: 价格上涨时,把止损上移到:最高收盘价 -(3 × 当前 ATR)
  5. 离场: 当价格收在追踪止损之下时

为什么是 3 × ATR?

  • 2 × ATR: 太紧,正常波动就会止损出局(胜率约 30%)
  • 3 × ATR: 最佳平衡(经 30 年检验,胜率约 40%)
  • 4 × ATR: 太松,吐回太多利润(夏普更低)

💡 真实示例:特斯拉的一段趋势(2023 年 10 月至 2024 年 1 月)

  • 入场(2023 年 10 月 27 日): 220 美元(突破 20 日高点)
  • ATR(14 日): $8.50
  • 初始止损: $220 - (3 × $8.50) = $194.50
  • 峰值(2023 年 12 月 28 日): 261 美元(上涨 18.6%)
  • 峰值时的 ATR: 11.20 美元(波动率上升)
  • 追踪止损: $261 - (3 × $11.20) = $227.40
  • 离场(2024 年 1 月 24 日): 226 美元(收在止损之下)
  • 最终收益: +2.7% ($226 - $220)

教训: 趋势跟随把大部分利润吐了回去(18.6% → 2.7%)。但它在这笔交易中待了三个月,扛住了波动。多数交易者会在 +5% 或第一次回调时就跑掉。

不同市场环境下的表现

When 趋势跟随 Dominates

时期 市场环境 趋势跟随 S&P 500
2008-2009 熊市崩盘 +22.4% (顺势做空) -50.9%
2009-2012 强劲的牛市趋势 +18.2% CAGR +16.8% CAGR
2020 年(新冠) V 形崩盘 + 反弹 -8.4%(被来回打脸打得很惨) +18.4%
2022 熊市的磨人下跌 +4.2% (转为持有现金) -18.1%

When 趋势跟随 Struggles

震荡横盘的市场(2015-2016、2018、2023):

  • 价格来回拉锯
  • 每次突破都失败(反复被止损)
  • 胜率降到 25% 至 30%
  • 年度回报:-5% 到 +2%(令人抓狂!)

V 形反弹(2020 年新冠):

  • 市场急速崩盘(趋势跟随者转现金或做空 = 正确)
  • 市场急速反转(趋势跟随者仍持现金 = 错过反弹最初的 20%)
  • 在假启动中被反复打脸
  • 最后迟迟入场,结果下一次回调就被止损

⚠️ 2013-2017 年的噩梦

在 2013 至 2017 年那段平稳、缓慢爬升的牛市中:

  • S&P 500: 年化 +15.8%(稳定、低波动的上涨)
  • 趋势跟随: 年化 +3.2%(不断被打脸,没有大趋势)
  • 回撤: 2015 年回撤 18%,而标普基本持平

一个连续五年每年跑输 12% 的策略,你坚持得下去吗? 多数趋势跟随者在这段时间放弃了。然后 2020 至 2022 年来了,他们又跑赢了。

交易成本:沉默的杀手

趋势跟随系统交易频繁(每年 20 至 60 笔)。成本很重要。

成本拆解(每笔来回交易):

  • 佣金: 0 至 1 美元(在 Robinhood、盈透证券基本免费)
  • 买卖价差: 0.02% 至 0.10%(SPY、QQQ 这类流动性好的 ETF)
  • 滑点: 0.05% 至 0.15%(高波动股票上的市价单)
  • 总成本: 每笔来回约 0.10% 至 0.25%

年度影响(每年 40 笔):

  • 40 笔 × 0.15% = 每年 6% 的拖累
  • 一个毛回报 15% 的策略,净回报只剩 9%(缩水 40%!)

如何把它压到最低:

  • 交易流动性好的品种: SPY/QQQ(价差 0.01%)对比个别小盘股(价差 0.5%)
  • 使用限价单: 每笔省下 0.05% 至 0.10%(但可能错过入场)
  • 在收盘时段交易: 避开盘中反复,降低交易频率
  • 止损放宽: 3 × ATR 相比 2 × ATR,可把打脸次数减少约 30%

何时该放弃这套策略

趋势跟随并非永远有效。要知道什么时候该退到一边。

警告信号(该降低仓位或转为现金):

  1. 低波动环境(VIX < 12):
    • 平稳缓慢的市场 = 频繁被打脸
    • 止损相对太宽(ATR 很小时用 3 × ATR = 风险回报比很差)
    • 行动: 把仓位减半,或等波动率回来
  2. 被打脸过于频繁(连续 6 笔以上亏损):
    • 说明市场在区间内震荡,而非趋势行情
    • 行动: 停止交易,等 4 至 8 周看环境是否切换
  3. 回撤超过 25%:
    • 对趋势跟随来说属正常,但很痛苦
    • 行动: 把仓位减半,在艰难时期保住本金

🚨 什么时候该彻底退出

如果经过三年**实盘**(不是回测)之后:

  • 你无法坚守规则(情绪纪律崩溃)
  • 你不断调参数去"修补"亏损(曲线拟合)
  • 你在心理上扛不住连续 10 笔以上的亏损

那么趋势跟随就不适合你。 承认这一点并不丢人。可以改试均值回归、配对交易,或者干脆做被动指数投资。

Python 实现:50/200 日均线趋势跟随

下面是一套完整的趋势跟随系统,你可以拿去回测:

"""
Trend Following System: 50/200 SMA Golden Cross
Author: Plan My Retire Finance University
Date: 2026-02-22

Strategy:
- Buy when 50-day SMA crosses above 200-day SMA (golden cross)
- Sell when 50-day SMA crosses below 200-day SMA (death cross)
- Risk management: 2% max loss per trade using ATR-based stops
"""

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
from datetime import datetime

class TrendFollowingSystem:
    """
    Moving average crossover trend following system

    Parameters:
    -----------
    fast_period : int
        Fast moving average period (default 50)
    slow_period : int
        Slow moving average period (default 200)
    atr_period : int
        ATR period for volatility (default 14)
    atr_multiplier : float
        Stop loss = ATR × multiplier (default 3.0)
    risk_per_trade : float
        Portfolio risk per trade (default 0.02 = 2%)
    """

    def __init__(self, fast_period=50, slow_period=200,
                 atr_period=14, atr_multiplier=3.0, risk_per_trade=0.02):
        self.fast_period = fast_period
        self.slow_period = slow_period
        self.atr_period = atr_period
        self.atr_multiplier = atr_multiplier
        self.risk_per_trade = risk_per_trade

    def calculate_atr(self, data):
        """Calculate Average True Range (ATR) for volatility"""
        high = data['High']
        low = data['Low']
        close = data['Close']

        tr1 = high - low
        tr2 = abs(high - close.shift())
        tr3 = abs(low - close.shift())

        tr = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1)
        atr = tr.rolling(window=self.atr_period).mean()

        return atr

    def generate_signals(self, data):
        """Generate buy/sell signals based on MA crossover"""
        df = data.copy()

        # Calculate moving averages
        df['SMA_Fast'] = df['Close'].rolling(window=self.fast_period).mean()
        df['SMA_Slow'] = df['Close'].rolling(window=self.slow_period).mean()

        # Calculate ATR for stops
        df['ATR'] = self.calculate_atr(df)

        # Generate signals
        df['Signal'] = 0
        df.loc[df['SMA_Fast'] > df['SMA_Slow'], 'Signal'] = 1  # Long
        df.loc[df['SMA_Fast'] < df['SMA_Slow'], 'Signal'] = -1  # Flat/Cash

        # Detect crossovers
        df['Position'] = df['Signal'].diff()
        df.loc[df['Position'] == 2, 'Buy'] = df['Close']  # Golden cross
        df.loc[df['Position'] == -2, 'Sell'] = df['Close']  # Death cross

        return df

    def backtest(self, data, initial_capital=100000, transaction_cost=0.001):
        """
        Run backtest with proper position sizing and transaction costs

        Parameters:
        -----------
        data : DataFrame
            Price data with OHLC columns
        initial_capital : float
            Starting portfolio value
        transaction_cost : float
            Cost per trade as percentage (0.001 = 0.1%)

        Returns:
        --------
        results : dict
            Performance metrics and equity curve
        """
        df = self.generate_signals(data)

        # Initialize tracking
        portfolio_value = initial_capital
        cash = initial_capital
        shares = 0
        equity_curve = []
        trades = []

        for i in range(len(df)):
            row = df.iloc[i]
            date = df.index[i]

            # Track portfolio value
            if shares > 0:
                portfolio_value = cash + (shares * row['Close'])
            else:
                portfolio_value = cash

            equity_curve.append({
                'Date': date,
                'Portfolio_Value': portfolio_value,
                'Position': 'Long' if shares > 0 else 'Cash'
            })

            # Execute trades
            if pd.notna(row.get('Buy')) and shares == 0:
                # Calculate position size based on ATR stop
                atr = row['ATR']
                if pd.notna(atr) and atr > 0:
                    # Stop loss = 3 × ATR below entry
                    stop_loss = row['Close'] - (self.atr_multiplier * atr)
                    risk_per_share = row['Close'] - stop_loss

                    # Position size = (Portfolio × Risk%) ÷ Risk per share
                    target_risk = portfolio_value * self.risk_per_trade
                    shares_to_buy = int(target_risk / risk_per_share)

                    # Don't use more than 95% of capital
                    max_shares = int((cash * 0.95) / row['Close'])
                    shares = min(shares_to_buy, max_shares)

                    if shares > 0:
                        cost = shares * row['Close']
                        commission = cost * transaction_cost
                        cash -= (cost + commission)

                        trades.append({
                            'Date': date,
                            'Type': 'BUY',
                            'Price': row['Close'],
                            'Shares': shares,
                            'Stop': stop_loss,
                            'Portfolio_Value': portfolio_value
                        })

            elif pd.notna(row.get('Sell')) and shares > 0:
                # Sell position
                proceeds = shares * row['Close']
                commission = proceeds * transaction_cost
                cash += (proceeds - commission)

                trades.append({
                    'Date': date,
                    'Type': 'SELL',
                    'Price': row['Close'],
                    'Shares': shares,
                    'Portfolio_Value': portfolio_value
                })

                shares = 0

        # Convert to DataFrames
        equity_df = pd.DataFrame(equity_curve).set_index('Date')
        trades_df = pd.DataFrame(trades)

        # Calculate performance metrics
        returns = equity_df['Portfolio_Value'].pct_change()

        # Calculate metrics
        total_return = (portfolio_value - initial_capital) / initial_capital
        years = (df.index[-1] - df.index[0]).days / 365.25
        cagr = (portfolio_value / initial_capital) ** (1 / years) - 1

        volatility = returns.std() * np.sqrt(252)
        sharpe_ratio = (cagr - 0.04) / volatility if volatility > 0 else 0

        # Drawdown analysis
        cumulative = (1 + returns).cumprod()
        running_max = cumulative.expanding().max()
        drawdown = (cumulative - running_max) / running_max
        max_drawdown = drawdown.min()

        # Win rate
        if len(trades_df) > 0:
            buy_trades = trades_df[trades_df['Type'] == 'BUY'].copy()
            sell_trades = trades_df[trades_df['Type'] == 'SELL'].copy()

            if len(buy_trades) == len(sell_trades):
                buy_trades = buy_trades.reset_index(drop=True)
                sell_trades = sell_trades.reset_index(drop=True)
                pnl = (sell_trades['Price'].values - buy_trades['Price'].values) / buy_trades['Price'].values
                win_rate = (pnl > 0).sum() / len(pnl)
                avg_win = pnl[pnl > 0].mean() if (pnl > 0).any() else 0
                avg_loss = abs(pnl[pnl < 0].mean()) if (pnl < 0).any() else 0
                win_loss_ratio = avg_win / avg_loss if avg_loss > 0 else 0
            else:
                win_rate = 0
                avg_win = 0
                avg_loss = 0
                win_loss_ratio = 0
        else:
            win_rate = 0
            avg_win = 0
            avg_loss = 0
            win_loss_ratio = 0

        results = {
            'final_value': portfolio_value,
            'total_return': total_return,
            'cagr': cagr,
            'volatility': volatility,
            'sharpe_ratio': sharpe_ratio,
            'max_drawdown': max_drawdown,
            'win_rate': win_rate,
            'avg_win': avg_win,
            'avg_loss': avg_loss,
            'win_loss_ratio': win_loss_ratio,
            'num_trades': len(trades_df),
            'equity_curve': equity_df,
            'trades': trades_df,
            'signals': df
        }

        return results

    def plot_results(self, results):
        """Visualize backtest results"""
        fig, axes = plt.subplots(3, 1, figsize=(14, 10))

        # Equity curve
        equity = results['equity_curve']
        axes[0].plot(equity.index, equity['Portfolio_Value'], linewidth=2, color='#2e7d32')
        axes[0].set_title('Portfolio Value Over Time', fontsize=14, fontweight='bold')
        axes[0].set_ylabel('Portfolio Value ($)', fontsize=12)
        axes[0].grid(alpha=0.3)
        axes[0].axhline(y=100000, color='gray', linestyle='--', alpha=0.5, label='Initial Capital')
        axes[0].legend()

        # Drawdown
        returns = equity['Portfolio_Value'].pct_change()
        cumulative = (1 + returns).cumprod()
        running_max = cumulative.expanding().max()
        drawdown = (cumulative - running_max) / running_max

        axes[1].fill_between(drawdown.index, drawdown * 100, 0, color='#c62828', alpha=0.3)
        axes[1].plot(drawdown.index, drawdown * 100, color='#c62828', linewidth=2)
        axes[1].set_title('Drawdown (%)', fontsize=14, fontweight='bold')
        axes[1].set_ylabel('Drawdown (%)', fontsize=12)
        axes[1].grid(alpha=0.3)

        # Price with signals
        signals = results['signals']
        axes[2].plot(signals.index, signals['Close'], label='Price', color='black', linewidth=1.5)
        axes[2].plot(signals.index, signals['SMA_Fast'], label=f'{self.fast_period}-day SMA',
                    color='#1976d2', linewidth=1.5, alpha=0.7)
        axes[2].plot(signals.index, signals['SMA_Slow'], label=f'{self.slow_period}-day SMA',
                    color='#f57c00', linewidth=1.5, alpha=0.7)

        # Plot buy/sell signals
        buy_signals = signals[signals['Buy'].notna()]
        sell_signals = signals[signals['Sell'].notna()]
        axes[2].scatter(buy_signals.index, buy_signals['Buy'], color='green',
                       marker='^', s=100, label='Buy', zorder=5)
        axes[2].scatter(sell_signals.index, sell_signals['Sell'], color='red',
                       marker='v', s=100, label='Sell', zorder=5)

        axes[2].set_title('Price with Moving Averages and Signals', fontsize=14, fontweight='bold')
        axes[2].set_ylabel('Price ($)', fontsize=12)
        axes[2].legend(loc='upper left')
        axes[2].grid(alpha=0.3)

        plt.tight_layout()
        plt.show()


# Example usage
if __name__ == "__main__":
    # Download S&P 500 data
    print("Downloading S&P 500 data...")
    ticker = 'SPY'
    data = yf.download(ticker, start='2000-01-01', end='2024-12-31', progress=False)

    # Initialize strategy
    strategy = TrendFollowingSystem(
        fast_period=50,
        slow_period=200,
        atr_period=14,
        atr_multiplier=3.0,
        risk_per_trade=0.02  # 2% risk per trade
    )

    # Run backtest
    print("\nRunning backtest...")
    results = strategy.backtest(data, initial_capital=100000, transaction_cost=0.001)

    # Print results
    print("\n" + "="*60)
    print("TREND FOLLOWING BACKTEST RESULTS (2000-2024)")
    print("="*60)
    print(f"Initial Capital:       ${100000:,.0f}")
    print(f"Final Value:           ${results['final_value']:,.0f}")
    print(f"Total Return:          {results['total_return']:.2%}")
    print(f"CAGR:                  {results['cagr']:.2%}")
    print(f"Volatility (annual):   {results['volatility']:.2%}")
    print(f"Sharpe Ratio:          {results['sharpe_ratio']:.2f}")
    print(f"Max Drawdown:          {results['max_drawdown']:.2%}")
    print(f"Number of Trades:      {results['num_trades']}")
    print(f"Win Rate:              {results['win_rate']:.2%}")
    print(f"Avg Win:               {results['avg_win']:.2%}")
    print(f"Avg Loss:              {results['avg_loss']:.2%}")
    print(f"Win/Loss Ratio:        {results['win_loss_ratio']:.2f}")
    print("="*60)

    # Calculate buy-and-hold comparison
    bh_return = (data['Close'][-1] - data['Close'][0]) / data['Close'][0]
    bh_cagr = (data['Close'][-1] / data['Close'][0]) ** (1 / 24.9) - 1
    print(f"\nBuy-and-Hold Comparison:")
    print(f"B&H CAGR:              {bh_cagr:.2%}")
    print(f"Strategy - B&H:        {(results['cagr'] - bh_cagr):.2%}")
    print("="*60)

    # Plot results
    strategy.plot_results(results)

    # Show recent trades
    if len(results['trades']) > 0:
        print("\nMost Recent Trades:")
        print(results['trades'].tail(10).to_string(index=False))

要点回顾

✅ 归根结底 on 趋势跟随

  1. 胜率很**低**(35% 至 45%): 你在多数交易上都会亏钱。接受它。
  2. 大赢来补偿: 2.5:1 到 4:1 的平均盈亏比,让这套系统整体盈利。
  3. 心理上的煎熬: 连亏 5 到 10 笔是常态。你受得了吗?
  4. 趋势中有效,震荡中失效: 要预期到 3 至 5 年的跑输期。
  5. 基于 ATR 的止损至关重要: 固定百分比止损无法适应波动率变化。
  6. 交易成本很重要: 若过度交易,每年可能吃掉 4% 至 6% 的回报。
  7. 不要曲线拟合: 坚持经典参数(50/200 日均线、20 日唐奇安)。为回测数据做优化,到了未来一定失效。

最适合: 有纪律、扛得住长时间连亏、时间跨度在三年以上、且在 25% 以上回撤中不会恐慌的交易者。

以下情况请避开: 你需要稳定的月度收益、受不了六成交易在亏钱,或者会在跑输时放弃这套系统。

下一步

在用真金白银交易趋势跟随系统之前:

  1. 彻底回测: 用 20 年以上的数据、多种资产、不同市场环境去测试
  2. 模拟交易 6 至 12 个月: 实时记录每个信号(不许用后见之明作弊)
  3. 从小做起: 第一年只用计划仓位的 25%,再慢慢放大
  4. 记交易日志: 记录每笔交易、你的情绪,以及你为何遵守或打破了规则
  5. 读经典:
    • 趋势跟随 作者:Michael Covel
    • Following the Trend 作者:Andreas Clenow
    • The Complete TurtleTrader 作者:Michael Covel

接下来: 回测方法论——避开那些坑 我们会讲如何正确地检验策略,避免曲线拟合、幸存者偏差和前视偏差。

⚠️ 风险提示

交易涉及重大亏损风险。多数交易者是亏钱的。过往业绩不保证未来结果。本文所述策略仅供教育用途,不构成投资建议。永远不要用输不起的钱去交易,务必做好仓位管理与风险控制,并在投入资金前充分回测任何策略。所有策略都会经历回撤。做出投资决定前请咨询持牌财务顾问。作者不对交易损失负责。