散户做比特币方向性交易,会怎样?
今天把比特币方向性交易研究了一遍,从基础概念到写回测代码跑结果,结论是:用经典策略做方向性交易,大概率亏钱。记录一下整个思路。
套利 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卖回USDT | 0.1% |
| USDT→人民币(P2P差价) | 0.5~1% |
| 合计 | 约1.2~2.2% |
最大的风险不是手续费,而是银行卡被冻结——收到"来源不明"的资金是常见原因。
下一步
方向性交易难度很高,下一步考虑转变思路:不预测方向,而是跟踪主力行为——监控合约未平仓量(OI)和链上大额转账,作为辅助信号。等资金费率市场变热,还是回到套利策略更稳。