news 2026/3/25 17:10:30

【期货量化入门】Python计算期货均线指标(MA/EMA/SMA详解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【期货量化入门】Python计算期货均线指标(MA/EMA/SMA详解)

一、前言

移动平均线(Moving Average,简称MA)是技术分析中最基础、最常用的指标之一。无论是股票还是期货市场,均线都被广泛应用于趋势判断和交易决策。

本文将介绍:

二、环境准备

本文使用TqSdk获取期货行情数据并计算均线指标。

安装依赖

pipinstalltqsdk

账户说明:运行代码需要快期账户,可在 shinnytech.com 免费注册。

三、均线基础知识

3.1 什么是移动平均线

移动平均线是将一定时期内的价格加以平均,并把不同时间的平均值连接起来形成的曲线。它能够反映价格的趋势方向。

均线的核心作用

  1. 平滑价格波动- 过滤掉短期的随机波动,显示价格趋势
  2. 判断趋势方向- 均线向上表示上涨趋势,向下表示下跌趋势
  3. 提供支撑阻力- 价格往往在均线附近获得支撑或遇到阻力
  4. 产生交易信号- 均线交叉可以作为买卖信号

3.2 常见均线类型

类型全称英文特点
SMA简单移动平均Simple MA各周期权重相同,计算简单
EMA指数移动平均Exponential MA近期数据权重更大,反应更灵敏
WMA加权移动平均Weighted MA可自定义权重分布

3.3 常用均线周期

周期类型适用场景
MA5短期均线日内交易、短线操作
MA10短期均线短线趋势判断
MA20中期均线波段交易
MA60中期均线中线趋势判断
MA120长期均线半年线,大趋势判断
MA250长期均线年线,牛熊分界

四、计算简单移动平均线(SMA)

4.1 SMA计算公式

简单移动平均线的计算公式:

SMA = (P1 + P2 + P3 + ... + Pn) / n

其中:

特点:所有价格的权重相同,计算简单直观。

4.2 Python代码实现

#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:计算期货均线指标 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))# 获取螺纹钢1分钟K线klines=api.get_kline_serial("SHFE.rb2501",60,200)api.wait_update()# 使用pandas计算5周期和20周期均线klines["ma5"]=klines["close"].rolling(5).mean()klines["ma20"]=klines["close"].rolling(20).mean()# 打印最后10行print("K线数据(含均线):")print(klines[["datetime","close","ma5","ma20"]].tail(10))api.close()

运行结果示例

K线数据(含均线): datetime close ma5 ma20 190 2024-12-17 14:50:00 3205.0 3203.6 3198.5 191 2024-12-17 14:51:00 3206.0 3204.4 3199.2 192 2024-12-17 14:52:00 3204.0 3204.6 3199.8 ...

4.3 代码解析

klines["ma5"]=klines["close"].rolling(5).mean()
部分说明
klines["close"]获取收盘价列(pandas Series)
.rolling(5)创建5周期的滚动窗口
.mean()计算窗口内数据的平均值

五、计算指数移动平均线(EMA)

5.1 EMA的特点

与SMA不同,EMA对近期价格赋予更高的权重,因此:

5.2 EMA计算公式

EMA今日 = α × 今日收盘价 + (1-α) × EMA昨日 其中 α = 2 / (n + 1)

例如12周期EMA的α = 2/(12+1) ≈ 0.154

5.3 Python代码实现

fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2501",60,200)api.wait_update()# 计算EMAklines["ema12"]=klines["close"].ewm(span=12,adjust=False).mean()klines["ema26"]=klines["close"].ewm(span=26,adjust=False).mean()print("EMA指标:")print(klines[["datetime","close","ema12","ema26"]].tail(10))api.close()

参数说明

参数说明
span=12EMA的周期,对应公式中的n
adjust=False使用递归计算方式,与传统EMA公式一致

5.4 SMA与EMA的对比

对比项SMAEMA
权重分布各周期权重相同近期权重更大
反应速度较慢较快
平滑程度更平滑波动稍大
适用场景趋势确认趋势跟踪

六、金叉与死叉

6.1 什么是金叉和死叉

**金叉(Golden Cross)死叉(Death Cross)**是均线系统中最重要的交易信号:

信号定义市场含义
金叉短期均线从下向上穿越长期均线短期趋势转强,可能是买入信号
死叉短期均线从上向下穿越长期均线短期趋势转弱,可能是卖出信号

图示说明

金叉示意: MA5 ↗ ╳ ← 交叉点 MA20 → 死叉示意: MA5 ↘ ╳ ← 交叉点 MA20 →

6.2 金叉死叉的判断逻辑

判断金叉死叉需要比较当前K线前一根K线的均线位置:

条件说明
金叉当前MA5 > MA20,且 前一根MA5 ≤ MA20
死叉当前MA5 < MA20,且 前一根MA5 ≥ MA20

6.3 Python代码实现

fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2501",60,200)api.wait_update()# 计算双均线klines["ma5"]=klines["close"].rolling(5).mean()klines["ma20"]=klines["close"].rolling(20).mean()# 判断金叉:当前MA5在MA20上方,前一根MA5在MA20下方klines["cross_up"]=(klines["ma5"]>klines["ma20"])&\(klines["ma5"].shift(1)<=klines["ma20"].shift(1))# 判断死叉:当前MA5在MA20下方,前一根MA5在MA20上方klines["cross_down"]=(klines["ma5"]<klines["ma20"])&\(klines["ma5"].shift(1)>=klines["ma20"].shift(1))# 输出金叉死叉信号cross_signals=klines[klines["cross_up"]|klines["cross_down"]]print("最近的金叉死叉信号:")print("-"*50)foridx,rowincross_signals.tail(5).iterrows():signal="金叉 ↑"ifrow["cross_up"]else"死叉 ↓"print(f"{row['datetime']}|{signal}| 收盘价:{row['close']:.0f}")api.close()

运行结果示例

最近的金叉死叉信号: -------------------------------------------------- 2024-12-17 10:25:00 | 金叉 ↑ | 收盘价:3198 2024-12-17 11:15:00 | 死叉 ↓ | 收盘价:3185 2024-12-17 13:45:00 | 金叉 ↑ | 收盘价:3202 2024-12-17 14:30:00 | 死叉 ↓ | 收盘价:3195 2024-12-17 14:55:00 | 金叉 ↑ | 收盘价:3208

6.4 金叉死叉的使用注意事项

虽然金叉死叉是经典的交易信号,但在实际使用中需要注意:

问题说明解决方法
滞后性均线是滞后指标,信号出现时趋势可能已走了一段结合其他指标确认
假信号震荡行情中会频繁出现假的金叉死叉添加过滤条件(如成交量、趋势强度)
周期选择不同周期组合效果不同根据交易风格选择合适周期

七、均线多头/空头排列

7.1 什么是均线排列

多头排列:短期均线在上,长期均线在下,如 MA5 > MA10 > MA20 > MA60,表示市场处于强势上涨趋势。

空头排列:长期均线在上,短期均线在下,如 MA5 < MA10 < MA20 < MA60,表示市场处于弱势下跌趋势。

7.2 Python代码实现

fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2501",300,200)# 5分钟线api.wait_update()# 计算多周期均线periods=[5,10,20,60,120]forpinperiods:klines[f"ma{p}"]=klines["close"].rolling(p).mean()# 获取最新均线值latest=klines.iloc[-1]print("当前均线系统:")print("="*40)forpinperiods:print(f" MA{p:3d}:{latest[f'ma{p}']:8.1f}")# 判断均线排列状态ma_values=[latest[f"ma{p}"]forpinperiods]print("="*40)ifall(ma_values[i]>ma_values[i+1]foriinrange(len(ma_values)-1)):print("状态: 【多头排列】- 强势上涨趋势")elifall(ma_values[i]<ma_values[i+1]foriinrange(len(ma_values)-1)):print("状态: 【空头排列】- 弱势下跌趋势")else:print("状态: 【均线交织】- 趋势不明朗")api.close()

八、实时均线监控

下面的代码展示如何实时监控均线状态:

fromtqsdkimportTqApi,TqAuthimportdatetime api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2501",60,100)print("实时均线监控(按Ctrl+C停止)")print("="*70)print(f"{'时间':<12}{'收盘价':<10}{'MA5':<10}{'MA20':<10}{'趋势':<10}")print("-"*70)whileTrue:api.wait_update()ifapi.is_changing(klines.iloc[-1],"close"):# 每次K线更新时重新计算均线ma5=klines["close"].rolling(5).mean().iloc[-1]ma20=klines["close"].rolling(20).mean().iloc[-1]close=klines.iloc[-1]["close"]trend="多头 ↑"ifma5>ma20else"空头 ↓"now=datetime.datetime.now().strftime("%H:%M:%S")print(f"{now:<12}{close:<10.0f}{ma5:<10.1f}{ma20:<10.1f}{trend:<10}")

九、使用TqSdk内置函数

TqSdk的tqsdk.tafunc模块提供了常用技术指标的计算函数,可以直接使用:

fromtqsdkimportTqApi,TqAuthfromtqsdk.tafuncimportma,ema api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2501",60,200)api.wait_update()# 使用tqsdk内置函数计算均线klines["ma5"]=ma(klines["close"],5)klines["ma20"]=ma(klines["close"],20)klines["ema12"]=ema(klines["close"],12)print("使用TqSdk内置函数计算均线:")print(klines[["datetime","close","ma5","ma20","ema12"]].tail())api.close()

tafunc模块常用函数

函数说明
ma(series, n)计算n周期简单移动平均
ema(series, n)计算n周期指数移动平均
macd(series, short, long, m)计算MACD指标
boll(series, n, k)计算布林带
atr(klines, n)计算ATR指标

十、总结

10.1 均线计算方法对照表

均线类型pandas方法tqsdk方法
SMArolling(n).mean()ma(series, n)
EMAewm(span=n).mean()ema(series, n)

10.2 均线应用场景

应用场景说明
趋势判断价格在均线上方为多头,下方为空头
金叉死叉短期均线穿越长期均线产生交易信号
多头排列MA5 > MA10 > MA20 > MA60,强势行情
支撑阻力均线常作为价格的支撑位或阻力位

免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 7:11:16

AI漫画翻译技术深度解析:从原理到实战应用

AI漫画翻译技术深度解析&#xff1a;从原理到实战应用 【免费下载链接】manga-image-translator Translate manga/image 一键翻译各类图片内文字 https://cotrans.touhou.ai/ 项目地址: https://gitcode.com/gh_mirrors/ma/manga-image-translator 技术架构全景剖析 漫…

作者头像 李华
网站建设 2026/3/23 13:18:32

PersistentWindows终极指南:如何让多显示器窗口位置永不丢失?

PersistentWindows终极指南&#xff1a;如何让多显示器窗口位置永不丢失&#xff1f; 【免费下载链接】PersistentWindows fork of http://www.ninjacrab.com/persistent-windows/ with windows 10 update 项目地址: https://gitcode.com/gh_mirrors/pe/PersistentWindows …

作者头像 李华
网站建设 2026/3/24 11:22:52

5大常见问题解答:关于YashanDB你需要知道的

在当今的数据驱动时代&#xff0c;数据库技术的发展愈加重要。然而&#xff0c;在实际工作中&#xff0c;数据库管理者和开发者常常面临诸如性能瓶颈、数据一致性问题及数据库安全等挑战。YashanDB&#xff0c;作为一种新兴的数据库解决方案&#xff0c;能够有效应对这些问题。…

作者头像 李华
网站建设 2026/3/21 20:14:55

v0 高效 Prompt 全面教程:常用 prompt 串联与实战指南

大家好&#xff0c;我是jobleap.cn的小九。 优质 Prompt 更优结果 更快效率 使用 v0 就像和一位技艺高超的队友协作——它能帮你搭建任何所需产品&#xff0c;但它不只是工具&#xff0c;更是你的“搭建伙伴”。和所有优秀合作者一样&#xff0c;你沟通得越清晰&#xff0c;最…

作者头像 李华
网站建设 2026/3/25 0:21:07

MTK芯片安全解锁完全攻略:从基础绕过到专业调试

MTK-bypass/bypass_utility作为一款专注于联发科芯片安全研究的开源工具&#xff0c;为开发者提供了绕过bootrom保护的完整解决方案。本指南将带您深入了解这款工具的技术原理、实战应用及高级调试技巧。&#x1f680; 【免费下载链接】bypass_utility 项目地址: https://gi…

作者头像 李华