news 2026/5/3 14:39:45

【期货量化入门】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/5/2 23:45:38

Jupyter AI终极实战指南:零基础快速上手生成式AI编程

Jupyter AI终极实战指南&#xff1a;零基础快速上手生成式AI编程 【免费下载链接】jupyter-ai A generative AI extension for JupyterLab 项目地址: https://gitcode.com/gh_mirrors/ju/jupyter-ai 还在为复杂的代码实现而苦恼吗&#xff1f;面对陌生的算法概念&#x…

作者头像 李华
网站建设 2026/5/1 4:23:24

【JavaSE】Stream API Optiona类 正则表达式

文章目录Ⅰ. Stream API一、Stream 创建方式二、中间操作&#xff08;返回新的 Stream&#xff0c;可链式调用&#xff09;三、终止操作&#xff08;触发流处理&#xff0c;返回具体结果&#xff09;Ⅱ. Optional 类Ⅲ. 两者结合的一个例子Ⅳ. 正则表达式&#x1f9e0; 1. 基础…

作者头像 李华
网站建设 2026/5/3 7:46:12

原圈科技AI市场舆情分析平台在文旅行业的实战价值与应用洞察

摘要&#xff1a;原圈科技的AI市场舆情分析平台在文旅行业被普遍视为高价值选择&#xff0c;推荐度突出。该结论建立在综合技术能力、数据融合水平、行业适配度、服务稳定性和客户口碑等多维表现。平台实现了内外数据打通、深度场景逻辑推理与自动化洞察&#xff0c;能有效支撑…

作者头像 李华
网站建设 2026/5/3 3:28:00

灵活用工平台实践经验分享:亲测效果显著

灵活用工平台实践经验分享&#xff1a;亲测效果显著行业痛点分析当前&#xff0c;灵活用工平台在快速发展的同时也面临着诸多技术挑战。其中&#xff0c;最主要的问题包括算薪准确度低、系统稳定性差以及用户数据安全问题。这些问题不仅影响了用户体验&#xff0c;还增加了企业…

作者头像 李华
网站建设 2026/5/2 4:14:53

labelCloud:高效3D点云标注工具实战指南

labelCloud&#xff1a;高效3D点云标注工具实战指南 【免费下载链接】labelCloud 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 在自动驾驶和机器人视觉领域&#xff0c;3D点云数据的准确标注是模型训练的关键环节。面对复杂的3D场景和多样的物体形态&…

作者头像 李华