散户做比特币方向性交易,会怎样?

2026-04-19

今天把比特币方向性交易研究了一遍,从基础概念到写回测代码跑结果,结论是:用经典策略做方向性交易,大概率亏钱。记录一下整个思路。


套利 vs 方向性交易

我之前的项目是做资金费率套利,最近市场冷清,费率太低没得套,就想转去做方向性交易。

两种策略的区别:

资金费率套利方向性交易
风险低,市场中性高,方向错就亏
收益稳定,年化10~30%不稳定,可能很高也可能归零
技术门槛高,需要系统低,开仓就行
长期胜率>90%散户普遍<50%

套利赚的是市场结构的钱,不需要预测涨跌。方向性交易赚的是"我比别人更准"的钱——这很难。


基础概念

K线是什么

每根K线代表一段时间内的价格变化,包含四个数据:

      │  ← 最高价
     ███
     ███  ← 实体(开盘价~收盘价)
     ███
      │  ← 最低价
  • 开盘价:这段时间第一笔成交价
  • 收盘价:最后一笔成交价
  • 最高价/最低价:期间极值

1H K线 = 每小时一根,4H K线 = 每4小时一根。周期越长,噪音越少,信号越可靠。


EMA(指数移动平均线)

EMA = Exponential Moving Average,理解为"近期价格的加权平均",越近的价格权重越大。

  • EMA20:近20根K线均价,反应快,贴近当前价格
  • EMA60:近60根K线均价,反应慢,代表中期趋势

经典用法是双均线交叉

  • EMA20 上穿 EMA60 = 金叉 → 做多信号
  • EMA20 下穿 EMA60 = 死叉 → 做空或离场信号

ATR(平均真实波幅)

ATR = Average True Range,衡量市场波动有多剧烈。

ATR = 近14根K线的平均波动幅度

主要用来设止损:

做多止损 = 入场价 - 2×ATR
做空止损 = 入场价 + 2×ATR

波动大时止损宽,波动小时止损窄,避免被正常震荡扫出局。


胜率和赔率

光有高胜率不够,关键是期望值

期望值 = 胜率 × 平均盈利 - 败率 × 平均亏损

例子:胜率45%,赔率2:1(平均赚2元、平均亏1元)

期望值 = 0.45×2 - 0.55×1 = +0.35  ✅ 值得做

胜率低没关系,赔率高就行。专业量化基金胜率能到55~60%就算很好了。


用Rust写了个回测框架

有了这些概念,就可以用历史数据验证策略,而不是用真钱做实验。

框架结构

src/backtest/
  kline.rs      ← 从OKX拉历史K线数据
  indicators.rs ← 计算EMA和ATR
  engine.rs     ← 模拟交易,统计结果
  mod.rs        ← 输出报告

运行方式:

cargo run -- backtest

拉K线数据

OKX有公开API,不需要鉴权:

// 拉BTC-USDT 4H K线,获取540根(约90天)
let klines = fetch_klines("BTC-USDT", "4H", 540).await?;

OKX每次最多返回100根,需要分页,用 after 参数传入最早那根的时间戳,循环拉取。

API返回的是从新到旧,最后要 reverse() 变成时间正序。

指标计算

EMA的核心是递推公式,k = 2/(period+1):

pub fn ema(prices: &[f64], period: usize) -> Vec<f64> {
    let k = 2.0 / (period as f64 + 1.0);
    // 前period个均值作为初始值
    let init = prices[..period].iter().sum::<f64>() / period as f64;
    result[period - 1] = init;
    for i in period..prices.len() {
        result[i] = prices[i] * k + result[i - 1] * (1.0 - k);
    }
    result
}

ATR用真实波幅(考虑跳空)的EMA:

// 真实波幅 = max(最高-最低, |最高-昨收|, |最低-昨收|)
let tr = high_low.max(high_prev).max(low_prev);

模拟引擎

策略逻辑很简单:金叉入场,死叉或止损出场。

// 金叉做多
let long_signal = prev_fast < prev_slow && curr_fast >= curr_slow;

if long_signal {
    entry_price = price;
    stop_price = price - 2.0 * atr;  // ATR止损
}

// 止损或死叉出场
let hit_stop = price <= stop_price;
let cross_exit = prev_fast >= prev_slow && curr_fast < curr_slow;

手续费按OKX taker费率0.05%单边计算,杠杆3x:

let pnl_pct = (price - entry_price) / entry_price * LEVERAGE
    - FEE_RATE * 2.0 * LEVERAGE;

回测结果:亏了

1H周期,做多+做空

总收益率:   -54.52%
胜率:       18.2%
盈亏比:     0.18
总交易次数: 22

惨。原因是1H周期信号太频繁,大量假信号,手续费也在持续消耗。

4H周期,只做多

总收益率:   -13.11%
胜率:       0.0%
总交易次数: 3

好一点,但3笔交易全亏,样本太少没有参考意义。


为什么经典策略不好使

EMA双均线是最公开的策略,正因为太多人用:

  • 金叉时大家都买 → 主力拉高诱多 → 砸盘
  • 止损位置大家都差不多 → 主力精准扫损

这叫"猎杀止损",是真实存在的市场行为。散户策略越公开越容易被针对,真正赚钱的量化策略都是私密的、非对称的。


人民币怎么买比特币

在OKX上看起来是直接用人民币买,实际流程是:

人民币 → 场外P2P撮合 → USDT → BTC

OKX把中间的USDT环节包装得很顺滑,但本质是P2P场外交易。

手续费估算(1万元为例):

环节费用
人民币→USDT(P2P差价)0.5~1%
USDT买BTC(现货)0.1%
BTC卖回USDT0.1%
USDT→人民币(P2P差价)0.5~1%
合计约1.2~2.2%

最大的风险不是手续费,而是银行卡被冻结——收到"来源不明"的资金是常见原因。


下一步

方向性交易难度很高,下一步考虑转变思路:不预测方向,而是跟踪主力行为——监控合约未平仓量(OI)和链上大额转账,作为辅助信号。等资金费率市场变热,还是回到套利策略更稳。