问题描述
解决方案
在聚宽(JoinQuant)平台上,计算股票的济安线(GDX)指标最直接且高效的方法是使用平台提供的 jqlib 技术分析库。该库内置了 GDX 函数,可以直接返回济安线、压力线和支撑线的数据。
以下是具体的计算方法和代码示例。
1. 使用 jqlib 库计算 GDX(推荐)
聚宽的 jqlib.technical_analysis 模块封装了 GDX 指标的计算逻辑,无需手动编写复杂的公式。
函数说明:
GDX(security_list, check_date, N=30, M=9)
- security_list: 股票代码列表(如
['000001.XSHE'])。 - check_date: 计算指标的日期(如
'2023-01-01')。 - N: 统计天数,默认 30。
- M: 偏离度参数,默认 9。
返回值:
返回三个字典(dict),分别代表:
- 济安线 (JAX)
- 压力线 (YLX)
- 支撑线 (ZCX)
代码示例
# -*- coding: utf-8 -*-
from jqlib.technical_analysis import *
def initialize(context):
# 设定要查询的股票
security = '000001.XSHE'
# 获取当前日期的 GDX 指标数据
# 注意:在回测中 context.current_dt 是当前时间
# N=30, M=9 是常见默认参数
jax, ylx, zcx = GDX([security], check_date=context.current_dt, N=30, M=9)
# 获取具体数值
current_jax = jax[security] # 济安线
current_ylx = ylx[security] # 压力线
current_zcx = zcx[security] # 支撑线
# 打印结果
print("股票: %s" % security)
print("济安线: %f" % current_jax)
print("压力线: %f" % current_ylx)
print("支撑线: %f" % current_zcx)
# 简单的策略逻辑示例:
# 如果收盘价突破压力线,可能视为强势信号(仅作示例,非投资建议)
current_price = data[security].close
if current_price > current_ylx:
print("价格突破压力线,可能存在上涨趋势")
2. GDX 指标的计算原理
如果您需要了解其背后的逻辑,或者需要手动复现,GDX 的计算公式如下:
-
计算加权价格与均线的偏离度 (AA):
$$AA = \frac{|(2 \times C + H + L) / 4 - MA(C, N)|}{MA(C, N)}$$
其中:C=收盘价, H=最高价, L=最低价, MA=简单移动平均 -
计算济安线 (JAX):
$$JAX = DMA(C, AA)$$
DMA 为动态移动平均,即以 AA 为权重对收盘价进行动态平滑。 -
计算压力线与支撑线:
- 压力线 = $(1 + M / 100) \times JAX$
- 支撑线 = $(1 - M / 100) \times JAX$
3. 注意事项
- 引入库:必须在代码开头使用
from jqlib.technical_analysis import *。 - 数据类型:
GDX函数返回的是字典,键为股票代码,值为指标数值。即使只查询一只股票,也需要通过[security]索引来获取数值。 - NaN值处理:如果股票上市时间不足 N 天,或者数据不足,计算结果可能返回
NaN,在策略中应当对这种情况进行过滤。
Q&A
Q: GDX 指标中的 N 和 M 参数通常如何设置?
A: 默认参数通常为 N=30 和 M=9。N 代表计算移动平均和偏离度的周期,M 代表压力线和支撑线相对于济安线的上下偏离百分比。您可以根据策略对灵敏度的需求调整这些参数。
Q: 可以在研究环境(Notebook)中使用这个函数吗?
A: 可以。在研究环境中,只需确保引入了 from jqlib.technical_analysis import *,并将 check_date 设置为您想要查询的具体历史日期即可。
Q: GDX 指标的主要用途是什么?
A: GDX 是一种路径型指标。济安线本身可以看作是一种特殊的均线,用于判断趋势方向;压力线和支撑线则构成了价格波动的通道。通常用于捕捉趋势启动或判断价格是否处于超买/超卖区域。