(超详细)PTrade量化交易常用技术指标详解,附免费量化开通流程
发布时间:2025-6-27 13:59阅读:750
喜欢指标又初学量化的朋友,今天小Q就和大家深入浅出地学习PTrade量化交易软件中四种常用且功能强大的技术指标:异同移动平均线(MACD)、随机指标(KDJ)、相对强弱指标(RSI)以及顺势指标(CCI)。我们将详细阐述这些指标的定义、计算原理、函数接口、参数设置、返回值以及在实际量化交易场景中的应用与注意事项,让我们一起来学习吧~
一、MACD (异同移动平均线)
get_MACD(close, short=12, long=26, m=9)
MACD(Moving Average Convergence Divergence)异同移动平均线,是查拉尔·阿佩尔(Gerald Appel)于1970年代提出的一种技术分析工具。它通过计算两条不同速度的指数移动平均线(EMA)之间的差异来研判股票价格的变化趋势。MACD的核心思想是利用长期与短期移动平均线之间的聚合与分离状况,来判断买卖时机。当短期EMA上穿长期EMA时,表明市场处于上涨趋势;反之,当短期EMA下穿长期EMA时,则预示市场可能进入下跌趋势。
参数说明
•close:价格的时间序列数据,类型为numpy.ndarray。这是计算MACD指标的基础数据,通常是股票的收盘价序列。
•short:短周期,类型为int,默认值为12。计算短期指数移动平均线的周期长度。
•long:长周期,类型为int,默认值为26。计算长期指数移动平均线的周期长度。
•m:移动平均线的周期,类型为int,默认值为9。用于计算DIF线的指数移动平均线(即DEA线)的周期长度。
返回值
get_MACD函数会返回三个numpy.ndarray类型的时间序列数据,分别对应MACD指标的三个组成部分:
•MACD指标dif值的时间序列:对应DIF线的数据。
•MACD指标dea值的时间序列:对应DEA线的数据。
•MACD指标macd值的时间序列:对应MACD柱的数据。
def initialize(context):
g.security = "000001.SZ"
set_universe(g.security)
def handle_data(context, data):
h = get_history(60, '1d', ['close','high','low'], security_list=g.security)
close_data = h['close'].values
macdDIF_data, macdDEA_data, macd_data = get_MACD(close_data, 12, 26, 9)
dif = macdDIF_data[-1]
dea = macdDEA_data[-1]
macd = macd_data[-1]
使用场景与注意事项
get_MACD函数主要用于回测和交易模块中,这意味着它可以在构建量化交易策略时,用于历史数据回溯测试以及实时交易决策。但我们在使用MACD指标时,以下几点需要值得我们注意:
•金叉与死叉:当DIF线上穿DEA线时,形成“金叉”,通常被视为可能的买入信号;当DIF线下穿DEA线时,形成“死叉”,通常被视为可能卖出信号。
•背离:当股价走势与MACD指标走势出现相反方向时,称为背离。例如,股价创新高但MACD指标未能创新高,可能预示上涨动能减弱,存在顶背离风险;反之,股价创新低但MACD指标未能创新低,可能预示下跌动能减弱,存在底背离机会。
•零轴:MACD指标的零轴是区分多头和空头市场的重要分界线。当DIF和DEA线在零轴上方运行时,表明市场处于多头趋势;当它们在零轴下方运行时,则表明市场处于空头趋势。
•参数优化方向:short、long和m这三个参数的设置对MACD指标的灵敏度有显著影响。不同的市场环境或交易品种可能需要不同的参数组合,建议通过历史数据回测进行参数优化,以找到最适合当前策略的参数。
•结合其他指标:MACD指标虽然功能强大,但并非万能。在实际应用中,建议将其与其他技术指标(如KDJ、RSI、成交量等)结合使用,以提高交易信号的准确性和可靠性。
二、KDJ (随机指标)
get_KDJ(high, low, close, n=9, m1=3, m2=3)
KDJ指标,又称随机指标(Stochastic Oscillator),是由乔治·莱恩(George C. Lane)于1950年代后期发明的一种动量指标。它主要用于识别金融资产(如股票、期货等)的超买超卖状态、潜在趋势转折点及价格波动强度。KDJ指标通过比较收盘价与特定周期内的价格范围,来反映价格动量的强弱和趋势的持续性。KDJ指标由三条曲线组成。
参数说明
•high:最高价的时间序列数据,类型为numpy.ndarray。用于计算周期内最高价。
•low:最低价的时间序列数据,类型为numpy.ndarray。用于计算周期内最低价。
•close:收盘价的时间序列数据,类型为numpy.ndarray。用于计算RSV。
•n:周期参数,类型为int,默认值为9。用于计算未成熟随机值(RSV)的周期长度,决定指标对价格波动的敏感度。周期越短(如N=5),指标反应越灵敏;周期越长(如N=14),信号越平滑但可能滞后。
•m1:K值的平滑周期,类型为int,默认值为3。对RSV进行指数移动平均(EMA)处理,进一步平滑K值曲线。
•m2:D值的平滑周期,类型为int,默认值为3。对K值进行指数移动平均(EMA)处理,进一步平滑D值曲线。
返回值
get_KDJ函数会返回三个numpy.ndarray类型的时间序列数据,分别对应KDJ指标的三个组成部分:
•KDJ指标k值的时间序列:对应K线的数据。
•KDJ指标d值的时间序列:对应D线的数据。
•KDJ指标j值的时间序列:对应J线的数据。
def initialize(context):
g.security = "000001.SZ"
set_universe(g.security)
def handle_data(context, data):
h = get_history(60, '1d', ['close','high','low'], security_list=g.security)
high_data = h['high'].values
low_data = h['low'].values
close_data = h['close'].values
k_data, d_data, j_data = get_KDJ(high_data, low_data, close_data, 9, 3, 3)
k = k_data[-1]
d = d_data[-1]
j = j_data[-1]
使用场景与注意事项
get_KDJ函数同样仅在回测、交易模块可用。在使用KDJ指标时,以下几点是需要重点关注的:
•超买超卖区:KDJ指标通常以0-100为范围。当K、D、J值都处于80以上时,被认为是超买区,预示价格可能面临回调;当K、D、J值都处于20以下时,被认为是超卖区,预示价格可能出现反弹。J线由于其敏感性,可能超出此范围,例如J值大于100或小于0,这通常表示极端的超买或超卖状态。
•金叉与死叉:当K线上穿D线时,形成“金叉”,通常被视为买入信号;当K线下穿D线时,形成“死叉”,通常被视为卖出信号。J线与K线和D线的交叉也可以提供交易信号,例如J线上穿K线和D线,通常是可能出现强烈的买入信号。
•背离:与MACD类似,KDJ指标也存在背离现象。当股价创新高而KDJ指标未能创新高时,形成顶背离,预示上涨动能减弱;当股价创新低而KDJ指标未能创新低时,形成底背离,预示下跌动能减弱。
•钝化现象:在极强的单边行情中(如持续上涨或下跌),KDJ指标可能会长时间处于超买或超卖区,出现“钝化”现象,此时其指示作用会减弱。交易者应结合其他指标或价格行为进行综合判断。
•参数选择:n、m1、m2参数的选择会影响KDJ指标的灵敏度和平滑度。短周期参数(如N=5)使指标更灵敏,适合短线交易;长周期参数(如N=14)使指标更平滑,适合中长线交易。建议根据交易策略和市场特性进行参数优化。
那么我们将今天的内容进行整合得到了下面的这个框架~欢迎大家自行到模拟盘去调参测试并魔改,有需要开通量化权限和低费率账户欢迎添加联系方式。
import numpy as np
def initialize(context):
# 初始化此策略
g.security = '*****.SS'
set_universe(g.security)
def before_trading_start(context, data):
h = get_history(20, '1d', field=['close', 'volume'], security_list=g.security,
fq='dypre', include=False, is_dict=True)
g.close_data = h[g.security]['close']
def handle_data(context, data):
# 获取历史日K线数据
current_price = data[g.security].close
# 合成最新K线序列
close_data = np.concatenate((g.close_data, np.array(list([current_price]))), axis=0)
# 获取5日、10日均线
ma5 = get_ma(close_data, 5)
ma10 = get_ma(close_data, 10)
# 得到当前资金余额
cash = context.portfolio.cash
# KDJ指标计算
h = get_history(60, '1d', ['close','high','low'], security_list=g.security)
high_data = h['high'].values
low_data = h['low'].values
close_data_kdj = h['close'].values
k_data, d_data, j_data = get_KDJ(high_data, low_data, close_data_kdj, 9, 3, 3)
k = k_data[-1]
d = d_data[-1]
j = j_data[-1]
# MACD指标计算
macdDIF_data, macdDEA_data, macd_data = get_MACD(close_data, 12, 26, 9)
dif = macdDIF_data[-1]
dea = macdDEA_data[-1]
macd = macd_data[-1]
# 如果当前有余额,并且五日均线大于十日均线
if ma5 > ma10 and get_position(g.security).amount == 0:
# 用所有 cash 买入股票
order_value(g.security, cash)
# 记录这次买入
log.info("Buying %s" % g.security)
# 如果五日均线小于十日均线,并且目前有头寸
elif ma5 < ma10 and get_position(g.security).enable_amount > 0:
# 全部卖出
order_target(g.security, 0)
# 记录这次卖出
log.info("Selling %s" % g.security)
# 获取MA函数
def get_ma(close_array, num):
ma = close_array[-num:].mean()
return round(ma, 2)


温馨提示:投资有风险,选择需谨慎。
-
别再错过下一波行情!国泰海通眼中的2025“十倍股”摇篮在哪里?
2025-09-01 11:19
-
速看:9月重磅政策密集落地,1日正式执行,影响你的生活
2025-09-01 11:19
-
速领:50+基金理财必备工具,效率直接拉满!
2025-09-01 11:19