Python 实现 ROC指标计算(变动率指标):股票技术分析的利器系列(15)
- 介绍
- 算法公式
- 代码
- rolling函数介绍
- 核心代码
- 计算OSC
- 完整代码
介绍
ROC(变动率指标)是一种技术分析指标,用于衡量价格变动的速度和幅度,计算方式为当前收盘价与一定期间前收盘价的变动率。
先看看官方介绍:
ROC(变动率指标)
用法
1.本指标的超买超卖界限值随个股不同而不同,使用者应自行调整;
2.本指标的超买超卖范围,一般介于±6.5之间;
3.本指标用法请参考MTM 指标用法;
(1)ROC从下向上突破ROCMA,买入信号;
(2)ROC从上向下跌破ROCMA,卖出信号;
(3)股价续创新高,而ROC未配合上升,意味上涨动力减弱;
(4)股价续创新低,而ROC未配合下降,意味下跌动力减弱;
(5)股价与ROC在低位同步上升,将有反弹行情;反之,从高位同步下降,将有回落走势。
4.本指标可设参考线。
算法公式
ROC:100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N);
MAROC:MA(ROC,M);
优势 | 劣势 |
---|---|
可以帮助识别价格趋势的变化 | 对价格波动较大的资产可能产生偏差 |
对价格波动的速度和幅度提供了直观的量化指标 | 对于不同的周期选择可能导致结果不同 |
简单易懂,计算方法直观 | 可能产生滞后效应 |
可以结合其他指标一起使用来确认交易信号 | 对于单一指标交易策略可能不够可靠 |
ROC 指标的优势在于其简单易懂的计算方法以及对价格趋势变化的直观量化。然而,它也存在一些缺点,比如可能对价格波动较大的资产产生偏差,对周期选择敏感,可能产生滞后效应等。因此,在实际应用中,通常需要结合其他指标一起使用来确认交易信号,以减少误判和提高策略的可靠性。
代码
rolling函数介绍
rolling
函数通常与其他函数(如 mean
、sum
、std
等)一起使用,以计算滚动统计量,例如滚动均值、滚动总和等。
以下是 rolling
函数的基本语法:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
window
: 用于计算统计量的窗口大小。min_periods
: 每个窗口最少需要的非空观测值数量。center
: 确定窗口是否居中,默认为False
。win_type
: 窗口类型,例如None
、boxcar
、triang
等,默认为None
。on
: 在数据帧中执行滚动操作的列,默认为None
,表示对整个数据帧执行操作。axis
: 执行滚动操作的轴,默认为0
,表示按列执行操作。closed
: 确定窗口的哪一端是闭合的,默认为None
。
核心代码
计算OSC
# 计算 ROC
def calculate_roc(data, n):return 100 * (data['CLOSE'] - data['CLOSE'].shift(n)) / data['CLOSE'].shift(n)
data['CLOSE']
:获取收盘价数据列。data['CLOSE'].shift(n)
:获取收盘价数据列向上偏移 n 个周期的数据。这个操作会使得当前收盘价与过去第 n 个周期的收盘价相对应。(data['CLOSE'] - data['CLOSE'].shift(n))
:计算当前收盘价与过去第 n 个周期的收盘价之间的差值。这部分计算得到的是价格的变动量。(data['CLOSE'] - data['CLOSE'].shift(n)) / data['CLOSE'].shift(n)
:将变动量除以过去第 n 个周期的收盘价,得到的是价格变动量相对于历史价格的比例,即价格的变动率。100 * (data['CLOSE'] - data['CLOSE'].shift(n)) / data['CLOSE'].shift(n)
:最后将变动率乘以 100,以得到以百分比表示的变动率。
完整代码
import pandas as pddata = {'CLOSE': 填每日收盘的数据,'HIGH': 填每日最高的数据,'LOW': 填每日最低的数据'OPEN': 填每日开盘的数据'VOL': 填每日交易量的数据
}df = pd.DataFrame(data)# 计算 ROC
def calculate_roc(data, n):return 100 * (data['CLOSE'] - data['CLOSE'].shift(n)) / data['CLOSE'].shift(n)# 计算 MAROC
def calculate_maroc(roc, m):return roc.rolling(window=m).mean()n = 12
m = 6# 计算 ROC
df['ROC'] = calculate_roc(df, n)# 计算 MAROC
df['MAROC'] = calculate_maroc(df['ROC'], m)print(df)