当前位置: 首页 > ops >正文

【量化】策略交易 - 均线策略(Moving Average Strategy)

策略交易 - 均线策略(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:27from 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_1HOURstart_str = "1 Jan, 2025"# 3. 获取K线数据klines = client.get_historical_klines(symbol, interval, start_str)# 4. 整理为DataFramedata = 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"] = 0data.loc[data["SMA_5"] > data["SMA_20"], "signal"] = 1data.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
http://www.xdnf.cn/news/12821.html

相关文章:

  • 如何在Redhat Linux7.9下安装配置MySQL
  • 历史数据分析——辽港股份
  • Java高频面试之并发编程-24
  • Semantic-SAM: Segment and Recognize Anything at Any Granularity
  • 大模型如何选型?嵌入模型如何选型?
  • 【PhysUnits】17.2 配套变量结构体 Var(variable.rs)
  • 一套个人知识储备库构建方案
  • UE的AI行为树Selector和Sequence如何理解
  • 数据结构——D/串
  • comfyui 工作流中 图生视频 如何增加视频的长度到5秒
  • C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
  • Vivado软件开发流程操作详解
  • 五年级数学知识边界总结思考-下册
  • 【会员专享数据】1980—2022年中国逐日月年潜在蒸散发栅格数据
  • JavaScript 数组学习总结
  • Spyglass:跨时钟域同步(时钟门控单元)
  • eBPF系列--BCC中提供的BPF maps高级抽象如何映射到内核的BPF maps?
  • 【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化
  • 比较一组结构之间的变换
  • Python爬虫实战:研究PySocks库相关技术
  • Halcon案例(三):C#联合Halcon识别排线
  • 【整数逐位除法求余补〇完整版】2022-4-11
  • 1 Studying《Linux Media Documentation》
  • 深度学习模块缝合
  • 【redis】线程IO模型
  • 第16届蓝桥杯青少Stema11月 Scratch编程——初/中级组真题——行走的图形
  • GD图像处理与SESSiON
  • MySQL(63)如何进行数据库读写分离?
  • 进程与线程的区别
  • SQL Server从入门到项目实践(超值版)读书笔记 16