交易算法的本质:把“直觉”变成“可执行的规则”
很多人对交易算法的第一印象是“自动赚钱的机器”,但其实算法的核心是“规则化决策”——把你对市场的判断写成明确、可重复的规则,让计算机帮你执行。比如:
– 直觉版:“我觉得BTC要涨了”;
– 规则版:“当BTC的20日均线向上穿过60日均线(金叉),且过去24小时成交量比前7天均值高1.5倍时,用总资金的3%买入”。

算法不会“预测”市场,它只是帮你避开情绪干扰——比如你明明设定了“跌到5%止损”,但看着价格下跌又犹豫,算法会直接执行止损指令,避免“侥幸心理”导致的更大亏损。
举个简单的例子:假设你想做“BTC的双均线策略”,规则是“金叉买入,死叉卖出”。用Python写几行代码,就能让计算机自动监控价格、计算均线、生成交易信号——这就是最基础的交易算法。
最基础的3个策略:新手先搞懂这些再进阶
别一开始就碰“机器学习”“深度学习”,先把经典基础策略搞懂,再谈进阶。以下3个策略是新手的“入门砖”:
1. 双均线策略:最简单的“趋势跟踪”
逻辑:用短期均线(比如5日)和长期均线(比如20日)的交叉判断趋势——短期均线上穿长期均线(金叉),说明趋势向上,买入;短期均线下穿长期均线(死叉),说明趋势向下,卖出。
代码示例(Python+ccxt):
(ccxt是加密货币交易的常用库,支持100+交易所的API)
import ccxt
import pandas as pd
# 连接Binance交易所(用测试网练手!)
exchange = ccxt.binance({
'enableRateLimit': True,
'apiKey': '你的测试网API_KEY',
'secret': '你的测试网API_SECRET',
'urls': {'api': 'https://testnet.binance.vision'} # 测试网地址
})
# 获取BTC/USDT的1小时K线数据(最近200条)
ohlcv = exchange.fetch_ohlcv('BTC/USDT', '1h', limit=200)
df = pd.DataFrame(ohlcv, columns=['时间', '开盘价', '最高价', '最低价', '收盘价', '成交量'])
df['时间'] = pd.to_datetime(df['时间'], unit='ms') # 转换时间格式
# 计算5日和20日均线
df['MA5'] = df['收盘价'].rolling(window=5).mean()
df['MA20'] = df['收盘价'].rolling(window=20).mean()
# 生成交易信号:1=买入,-1=卖出
df['信号'] = 0
df.loc[df['MA5'] > df['MA20'], '信号'] = 1 # 金叉买入
df.loc[df['MA5'] < df['MA20'], '信号'] = -1 # 死叉卖出
# 查看最近10条数据(信号列就是算法给出的指令)
print(df[['时间', '收盘价', 'MA5', 'MA20', '信号']].tail(10))
运行这段代码,你会看到“信号”列出现1或-1——这就是算法给你的交易指令。
2. RSI策略:判断“超买超卖”
RSI(相对强弱指数)是衡量价格涨跌幅度的指标,范围0-100:
– RSI < 30:超卖,可能反弹,买入;
– RSI > 70:超买,可能下跌,卖出。
逻辑示例:当BTC的14日RSI低于30,且过去24小时的波动率(比如ATR)低于均值时,买入;当RSI高于70时,卖出。
3. 动量策略:“追涨杀跌”的规则化
逻辑:假设“涨得好的资产会继续涨”(动量效应),比如“买入过去7天涨幅前10的山寨币,持有3天后卖出”。
数据:算法交易的“粮食”,怎么选?怎么用?
没有数据,算法就是“无米之炊”。新手要搞懂3个问题:
1. 数据从哪来?
- 交易所API:比如Binance、Coinbase的官方API,免费获取实时/历史数据(推荐,数据最准);
- 第三方平台:比如CoinGecko(免费获取加密货币的价格、市值数据)、CryptoCompare(提供K线、成交量数据);
- 付费数据源:比如Kaiko(提供高分辨率的订单簿数据,适合高频交易)。
2. 数据类型有哪些?
- K线数据(OHLCV):开盘价、最高价、最低价、收盘价、成交量,最常用;
- 订单簿数据:买一价、卖一价、挂单量,适合高频交易;
- 成交量数据:比如逐笔成交记录(tick data),用于分析大额交易。
3. 数据要“清洗”吗?
必须!比如:
– 缺失值:比如某段时间交易所停盘,数据缺失,用Pandas的fillna()
填充(比如用前一天的收盘价);
– 异常值:比如某时刻价格突然暴涨100%(可能是乌龙指),用quantile()
去掉极值(比如去掉前1%和后1%的数据);
– 时间对齐:比如不同交易所的时间戳不一致,用to_datetime()
统一格式。
代码示例(数据清洗):
# 处理缺失值:用前一条数据填充
df = df.fillna(method='ffill')
# 处理异常值:去掉收盘价超过均值±3倍标准差的数据
mean = df['收盘价'].mean()
std = df['收盘价'].std()
df = df[(df['收盘价'] > mean - 3*std) & (df['收盘价'] < mean + 3*std)]
回测:别用“未来函数”骗自己
回测是用历史数据验证策略——比如你写了一个双均线策略,用2023年的BTC数据回测,看看能赚多少。但新手常犯的错误是“用未来数据”(比如用明天的价格计算今天的信号),导致回测结果虚高。
回测工具推荐
工具名称 | 优势 | 适合场景 |
---|---|---|
Backtrader | 开源、灵活,支持复杂策略 | 新手入门 |
VectorBT | 速度快(基于NumPy),适合高频交易 | 处理海量数据 |
Zipline | 量化巨头用的框架(比如Quantopian) | 美股/加密货币通用 |
回测的正确步骤
以Backtrader为例:
1. 导入数据:用Backtrader的CandlestickData
加载K线数据;
2. 编写策略:继承bt.Strategy
类,定义next()
方法(每个时间步执行的逻辑);
3. 运行回测:添加策略、设置初始资金、运行回测;
4. 分析结果:查看年化收益率、最大回撤、胜率等指标。
代码示例(Backtrader回测双均线策略):
import backtrader as bt
# 定义策略类
class DoubleMA(bt.Strategy):
params = (('ma1', 5), ('ma2', 20)) # 短期均线=5,长期均线=20
def __init__(self):
self.ma1 = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.ma1)
self.ma2 = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.ma2)
self.crossover = bt.indicators.CrossOver(self.ma1, self.ma2) # 金叉/死叉信号
def next(self):
if not self.position: # 没有持仓
if self.crossover > 0: # 金叉
self.buy(size=0.1) # 买入0.1个BTC
else:
if self.crossover < 0: # 死叉
self.sell(size=0.1) # 卖出0.1个BTC
# 初始化回测引擎
cerebro = bt.Cerebro()
# 加载数据(假设df是之前获取的BTC/USDT数据)
data = bt.feeds.PandasData(dataname=df, datetime='时间')
cerebro.adddata(data)
# 添加策略
cerebro.addstrategy(DoubleMA)
# 设置初始资金(10000 USDT)
cerebro.broker.setcash(10000.0)
# 设置手续费(0.1%)
cerebro.broker.setcommission(commission=0.001)
# 运行回测
print(f'初始资金: {cerebro.broker.getvalue():.2f} USDT')
cerebro.run()
print(f'回测后资金: {cerebro.broker.getvalue():.2f} USDT')
# 绘图(需要安装matplotlib)
cerebro.plot(style='candlestick')
运行后,你会看到回测后的资金——如果初始资金1万,回测后变成1.2万,说明策略在历史数据上有效。
实盘前的3个准备:别直接“梭哈”!
回测结果好,不代表实盘能赚。新手要做3件事:
1. 先用“模拟盘”练手
比如Binance的测试网(Testnet),用虚拟资金交易,验证策略的实盘效果(比如滑点、延迟)。
2. 对接交易所接口
用ccxt库可以快速连接交易所,比如:
# 连接Binance实盘(注意:真实API_KEY要保管好!)
exchange = ccxt.binance({
'enableRateLimit': True,
'apiKey': '你的真实API_KEY',
'secret': '你的真实API_SECRET'
})
# 查看账户余额
balance = exchange.fetch_balance()
print(balance['USDT']['free']) # 可用USDT余额
3. 实时监控策略
用WebSocket获取实时价格,比如Binance的WebSocket API:
from binance import ThreadedWebsocketManager
twm = ThreadedWebsocketManager(api_key='你的API_KEY', api_secret='你的API_SECRET')
twm.start()
def handle_message(msg):
print(f"实时价格: {msg['c']}") # msg['c']是最新收盘价
# 订阅BTC/USDT的1分钟K线
twm.start_kline_socket(callback=handle_message, symbol='BTCUSDT', interval='1m')
避开这3个坑:很多新手栽在这里
- 过度优化(曲线拟合):为了让回测结果好看,调整策略参数(比如把均线从5/20改成7/25),导致策略只适合历史数据,实盘失效。解决方法:用“样本外测试”——比如用2023年的数据回测,用2024年的数据验证。
- 忽略滑点和手续费:回测时假设“下单立即成交”,但实盘时,价格可能已经涨了0.5%(滑点),加上0.1%的手续费,利润会少很多。解决方法:回测时添加滑点参数(比如0.2%)和手续费。
- 没有风险控制:比如用100%的资金开仓,一旦策略出错,直接爆仓。解决方法:
- 固定止损:比如设置5%的止损,亏损达到就卖出;
- 移动止损:当盈利10%时,把止损位从买入价提到买入价+5%;
- 仓位管理:每次开仓不超过总资金的5%。
原创文章,作者:,如若转载,请注明出处:https://zube.cn/archives/331