策略交易 - 均线策略(Moving Average Strategy)
一、前言
均线策略 是最经典、最简单、最实用的量化交易策略之一,也是许多新手入门量化交易的第一步。
二、“均线”是什么
均线(Moving Average,简称 MA),是某个时间段内价格的平均值,通常用于观察价格趋势。
常见均线种类:
名称 | 公式 | 意义 |
---|---|---|
简单均线(SMA) | 最简单的平均值 | 平滑价格波动 |
指数均线(EMA) | 最近的数据权重更高 | 更快反应新行情 |
三、核心逻辑
利用两条不同周期的均线判断趋势,决定买入或卖出。
最经典形式:双均线策略(Dual MA Strategy)
四、“双均线策略”规则
条件 | 操作 |
---|---|
短期均线 上穿 长期均线 | 买入(称为“金叉”) |
短期均线 下穿 长期均线 | 卖出(称为“死叉”) |
比如:
- 短期均线:5日平均价格(SMA_5)
- 长期均线:20日平均价格(SMA_20)
五、图示理解
价格线: /\ /\
短期均线(5日): /\/\\
长期均线(20日): ——\__/———
金叉:短期从下向上穿过长期 → 做多(买入)
死叉:短期从上向下穿过长期 → 平仓或做空
六、原理&本质
为什么这个策略有效?
-> 原理:
- 当短期均线向上穿越长期均线,说明“短期上涨速度超过长期平均”,可能是上涨趋势开始。
- 当短期均线向下穿越长期均线,说明“短期下跌加剧”,趋势可能反转。
-> 本质:
这是一种趋势跟随(Trend Following)策略,它不会抄底或摸顶,而是追着趋势吃中间的一段。
七、可调参数
参数 | 意义 | 示例 |
---|---|---|
短期周期 | 越小越敏感 | 5、10 |
长期周期 | 越大越稳重 | 20、50、200 |
交易频率 | 与K线周期有关 | 日线、小时线、分钟线等 |
滑点与手续费 | 实盘中必须考虑 | 0.1%每次交易等 |
八、优点和缺点
-> 优点
- 简单易懂,逻辑清晰
- 可用在任何标的(股票、币种、期货)
- 可参数优化(适合机器学习)
- 可程序化、自动化交易
-> 缺点
- 信号滞后(必须等趋势确认后再进场)
- 高频震荡行情中会频繁“假信号”,导致亏损
- 不适合震荡盘(更适合趋势行情)
九、实战事例
以狗狗币(DOGEUSDT)为例,来实现均线策略,数据从币安拿。
-> 库的安装
pip install python-binance pandas matplotlib
-> 相关代码
# -*- coding: utf-8 -*-
# @Author: zhangfujie
# @Date: 2025-06-08 19:01:45
# @Last Modified by: zhangfujie
# @Last Modified time: 2025-06-08 19:35:27
from binance.client import Client
import pandas as pd
import matplotlib.pyplot as plt
import datetime
# 设置支持字体,不然中文无法显示
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 策略交易之均线策略
def moving_average_strategy():
# 1. 初始化币安客户端(不需要API KEY也可以获取公共行情)
client = Client()
# 2. 下载 DOGE/USDT 的历史数据(如1小时K线)
symbol = "DOGEUSDT"
interval = Client.KLINE_INTERVAL_1HOUR
start_str = "1 Jan, 2025"
# 3. 获取K线数据
klines = client.get_historical_klines(symbol, interval, start_str)
# 4. 整理为DataFrame
data = pd.DataFrame(klines, columns=[
"timestamp", "open", "high", "low", "close", "volume",
"close_time", "quote_asset_volume", "number_of_trades",
"taker_buy_base", "taker_buy_quote", "ignore"
])
data["timestamp"] = pd.to_datetime(data["timestamp"], unit="ms")
data.set_index("timestamp", inplace=True)
data["close"] = data["close"].astype(float)
# 5. 计算均线
data["SMA_5"] = data["close"].rolling(window=5).mean()
data["SMA_20"] = data["close"].rolling(window=20).mean()
# 6. 生成交易信号
data["signal"] = 0
data.loc[data["SMA_5"] > data["SMA_20"], "signal"] = 1
data.loc[data["SMA_5"] < data["SMA_20"], "signal"] = -1
# 7. 策略收益
data["position"] = data["signal"].shift(1)
data["return"] = data["close"].pct_change()
data["strategy"] = data["position"] * data["return"]
# 8. 可视化:策略 vs 原始收益
data[["return", "strategy"]].cumsum().plot(figsize=(12, 6))
# 图标显示的字体是苹方体
font_path = '/System/Library/Fonts/PingFang.ttc'
chinese_font = FontProperties(fname=font_path)
plt.title("DOGE/USDT - 均线策略 vs 持有收益", fontproperties=chinese_font)
plt.ylabel("累计收益", fontproperties=chinese_font)
plt.grid(True)
plt.show()
if __name__ == '__main__':
moving_average_strategy()
-> 运行结果
-> 说明
步骤 | 内容 |
---|---|
数据源 | 直接从 币安API 获取 DOGEUSDT 的历史K线(1小时) |
策略 | 5小时均线 > 20小时均线 → 做多;反之做空(或清仓) |
可视化 | 累计收益图,比较“策略 vs 单纯持有”表现 |
-> 提示 & 拓展
-
若我们想做分钟级别高频策略,把 KLINE_INTERVAL_1HOUR 改成 KLINE_INTERVAL_1MINUTE
-
可以加上手续费(如每次交易扣 0.1%)来模拟更真实场景
-
如果你想让它实时监控并自动下单,需要使用 Binance 的下单接口(需要 API Key)
十、策略总结
均线策略是趋势交易的入门方法,虽然简单,但理解透彻后能衍生出更复杂的量化系统。
-> 延伸策略:
策略名称 | 改进点 |
---|---|
三均线策略 | 加入第三条长期均线,过滤震荡 |
均线+RSI | 均线判断趋势,RSI判断超买超卖 |
多因子策略 | 均线作为因子之一,加入成交量、MACD、布林带等 |
十一、关于作者(ZFJ_张福杰)
- 官网:https://zfjsafe.com
- 博客:https://zfj1128.blog.csdn.net
- Github:https://github.com/zfjsyqk
- Gitee:https://gitee.com/zfj1128
- 打赏:https://zfjsafe.com/paycode