问题描述
我看现在通信达上很多指标在聚宽上已经内置了,只需要导入from jqlib.technical_analysis import *,但好像MA这个指标还是要自己编写要自己编嘛?
解决方案
在 JoinQuant(聚宽)平台上,虽然 jqlib.technical_analysis 库中内置了许多复杂的技术指标,但对于最基础的移动平均线(MA),平台并没有提供一个单独命名为 MA() 的函数。不过,您完全不需要从头编写复杂的算法,因为聚宽提供了非常便捷的内置方法和强大的 Pandas 库来直接获取 MA 值。
以下是聚宽平台上计算移动平均线(MA)的三种最常用、最简便的方法:
方法一:使用内置的 mavg 方法(最简单,适用于 handle_data)
在 handle_data 函数中,您可以通过 data 对象直接调用 .mavg() 方法来获取过去 N 天的移动平均价。
def handle_data(context, data):
security = '000001.XSHE'
# 获取过去5天的收盘价移动平均值 (MA5)
ma5 = data[security].mavg(5, field='close')
# 获取过去10天的收盘价移动平均值 (MA10)
ma10 = data[security].mavg(10, field='close')
log.info("MA5: %s, MA10: %s" % (ma5, ma10))
方法二:使用 attribute_history 结合 Pandas 的 mean()(适用于获取单点 MA)
如果您只需要获取当前时刻的 MA 值,可以先获取过去 N 天的历史数据,然后直接求平均值。
def handle_data(context, data):
security = '000001.XSHE'
# 获取过去5天的收盘价数据
close_data = attribute_history(security, 5, '1d', ['close'])
# 取得过去五天的平均价格 (MA5)
ma5 = close_data['close'].mean()
log.info("当前 MA5 值为: %s" % ma5)
方法三:使用 get_price 结合 Pandas 的 rolling().mean()(适用于计算 MA 序列)
如果您需要获取一段时间内的 MA 曲线(例如画图或计算均线交叉),可以使用 get_price 获取较长一段时间的数据,然后使用 Pandas 的滚动平均函数 rolling().mean()。
import pandas as pd
def before_trading_start(context):
security = '000001.XSHE'
# 获取过去30天的收盘价
df = get_price(security, count=30, end_date=context.previous_date, frequency='daily', fields=['close'])
# 计算整条 MA5 序列
df['MA5'] = df['close'].rolling(window=5).mean()
# 计算整条 MA10 序列
df['MA10'] = df['close'].rolling(window=10).mean()
# 获取昨天的 MA5 和 MA10
last_ma5 = df['MA5'].iloc[-1]
last_ma10 = df['MA10'].iloc[-1]
log.info("昨日 MA5: %s, 昨天 MA10: %s" % (last_ma5, last_ma10))
总结
虽然 jqlib.technical_analysis 中没有直接叫 MA 的函数(里面有 MAC5 等指标,但那是均线除以收盘价的值),但借助聚宽的 mavg API 或 Python 数据分析神器 Pandas,计算 MA 只需要一行代码,非常高效且灵活。