基本技术指标 Python 实现(4)

简介: 基本技术指标 Python 实现

基本技术指标 Python 实现(3)https://developer.aliyun.com/article/1484233

代码

# 计算 Special K 指标
def calculate_special_k(df):
    if len(df) < 725:
        print("数据点不足,无法计算 Special K 指标")
        return
    
    df['ROC_10'] = (df['close'] - df['close'].shift(10)) / df['close'].shift(10) * 100
    df['ROC_15'] = (df['close'] - df['close'].shift(15)) / df['close'].shift(15) * 100
    df['ROC_20'] = (df['close'] - df['close'].shift(20)) / df['close'].shift(20) * 100
    df['ROC_30'] = (df['close'] - df['close'].shift(30)) / df['close'].shift(30) * 100
    df['ROC_40'] = (df['close'] - df['close'].shift(40)) / df['close'].shift(40) * 100
    df['ROC_65'] = (df['close'] - df['close'].shift(65)) / df['close'].shift(65) * 100
    df['ROC_75'] = (df['close'] - df['close'].shift(75)) / df['close'].shift(75) * 100
    df['ROC_100'] = (df['close'] - df['close'].shift(100)) / df['close'].shift(100) * 100
    df['ROC_195'] = (df['close'] - df['close'].shift(195)) / df['close'].shift(195) * 100
    df['ROC_265'] = (df['close'] - df['close'].shift(265)) / df['close'].shift(265) * 100
    df['ROC_390'] = (df['close'] - df['close'].shift(390)) / df['close'].shift(390) * 100
    df['ROC_530'] = (df['close'] - df['close'].shift(530)) / df['close'].shift(530) * 100
    
    df['Special_K'] = (df['ROC_10'].rolling(10).mean() * 1 +
                       df['ROC_15'].rolling(10).mean() * 2 +
                       df['ROC_20'].rolling(10).mean() * 3 +
                       df['ROC_30'].rolling(15).mean() * 4 +
                       df['ROC_40'].rolling(50).mean() * 1 +
                       df['ROC_65'].rolling(65).mean() * 2 +
                       df['ROC_75'].rolling(75).mean() * 3 +
                       df['ROC_100'].rolling(100).mean() * 4 +
                       df['ROC_195'].rolling(130).mean() * 1 +
                       df['ROC_265'].rolling(130).mean() * 2 +
                       df['ROC_390'].rolling(130).mean() * 3 +
                       df['ROC_530'].rolling(195).mean() * 4)
    
    return df

变动率(ROC)

计算

ROC = [(Close - Close n periods ago) / (Close n periods ago)] * 100


点击这里下载此电子表格示例。")


上表显示了 2010 年 5 月道琼斯工业指数的 12 天变动率计算。 黄色单元格显示了从 4 月 28 日到 5 月 14 日的变动率。 实际上是 13 个交易日,但 28 日的收盘价作为 29 日的起点。 蓝色单元格显示了从 5 月 7 日到 5 月 25 日的 12 天变动率。

代码

def calculate_ROC(df, n):
    df['ROC'] = ((df['Close'] - df['Close'].shift(n)) / df['Close'].shift(n)) * 100

相对强度指数(RSI)

计算

100
    RSI = 100 - --------
                 1 + RS
    RS = Average Gain / Average Loss

为了简化计算说明,RSI 已经被分解为其基本组成部分:RS平均增益平均损失。这个 RSI 计算基于 14 个周期,这是 Wilder 在他的书中建议的默认值。损失被表示为正值,而不是负值。

第一次的平均增益和平均损失计算是简单的 14 个周期平均值。

  • 第一次平均增益 = 过去 14 个周期的增益总和 / 14。
  • 第一次平均损失 = 过去 14 个周期的损失总和 / 14

第二次以及后续的计算基于先前的平均值和当前的盈亏:

  • 平均增益 = [(前一次平均增益) x 13 + 当前增益] / 14。
  • 平均损失 = [(前一个平均损失) x 13 + 当前损失] / 14。

将先前值加上当前值是一种平滑技术,类似于计算指数移动平均值时使用的技术。这也意味着随着计算周期的延长,RSI 值会变得更准确。SharpCharts 在计算其 RSI 值时,会使用至少 250 个数据点作为起始日期之前的数据点(假设存在这么多数据)。要精确复制我们的 RSI 数值,公式将需要至少 250 个数据点。

Wilder 的公式对 RS 进行归一化,并将其转化为在零和 100 之间波动的振荡器。实际上,RS 的图与 RSI 的图完全相同。归一化步骤使得更容易识别极端值,因为 RSI 是区间限制的。当平均收益等于零时,RSI 为 0。假设为 14 期的 RSI,零的 RSI 值意味着价格在所有 14 期内下跌。没有增益可测量。当平均损失等于零时,RSI 为 100。这意味着价格在所有 14 期内上涨。没有损失可测量。



这里有一个展示 RSI 计算开始过程的 Excel 电子表格")。

注意:平滑过程会影响 RSI 值。RS 值在第一次计算后会被平滑处理。平均损失等于前 14 次损失之和除以 14 进行第一次计算。后续计算会将先前值乘以 13,加上最新值,然后总和除以 14。这样就产生了平滑效果。平均收益也是如此。由于这种平滑处理,RSI 值可能会根据总计算周期而有所不同。250 个周期将比 30 个周期具有更多的平滑效果,这会稍微影响 RSI 值。Stockcharts.com 在可能的情况下回溯 250 天。如果平均损失等于零,则 RS 会出现“除以零”的情况,根据定义 RSI 被设定为 100。同样,当平均收益等于零时,RSI 等于 0。

代码

名称:RSI
描述:计算相对强弱指标(RSI)
def calculate_rsi(df, period=14):
    delta = df['close'].diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
    
    rs = gain / loss
    rsi = 100 - (100 / (1 + rs))
    
    return rsi

RRG 相对强度

代码

名称:{title}
描述:计算股票的收益率
---
代码:
def calculate_returns(df):
    df['returns'] = df['close'].pct_change()
    return df

StockCharts 技术排名(SCTR)

计算

计算 StockCharts 技术排名(SCTR)需要两个步骤。首先,根据六个不同的技术指标对每支股票进行“评分”。这六个指标可以细分为长期、中期和短期三组。下面的框详细介绍了这些指标、相关时间范围和权重。

Long-Term Indicators (weighting)
--------------------------------
  * Percent above/below 200-day EMA (30%)
  * 125-Day Rate-of-Change (30%)
Medium-Term Indicators (weighting)
----------------------------------
  * Percent above/below 50-day EMA (15%)
  * 20-day Rate-of-Change (15%)
Short-Term Indicators (weighting)
---------------------------------
  * 3-day slope of PPO-Histogram (5%)
  * 14-day RSI (5%)

除了 PPO-Histogram 的 3 天斜率外,原始数字用于计算指标得分。例如,如果一支股票比其 200 天移动平均线高出 15%,那么这个指标将为总指标得分贡献 4.5 分(15 x 0.30 = 4.5)。如果 20 天变动率为 -7%,那么这个指标将为总指标得分贡献 -1.05 分(-7 x 0.15 = -1.05)。

对于 PPO-Histogram,如果其斜率大于 +1(即 +45 度),则会为总指标得分贡献 5 分(100 的 5%)。如果 PPO-Histogram 的斜率小于 -45 度,则不会贡献分数。否则,将贡献 ((斜率 + 1) x 50) 的 5%。

在第一轮计算后,StockCharts.com 根据它们的指标得分对这些股票进行排名。请记住,这些股票仅在其组内(如大盘股、中盘股和小盘股)中排名。本文首先将展示一个简化的例子,使用按指标得分排序的十只股票。得分最高的股票获得最高的技术排名(10),而得分最低的股票获得最低的技术排名(1)。然后根据指标得分填充排名。

StockCharts 技术排名提供了更详细的信息。首先,排名范围从 0.00 到 99.99,0 表示绝对最弱,而 99.99 表示绝对最强。没有股票会得到完美的 100 分。其次,StockCharts.com 创建“桶”来对组内的股票进行排序。这些类似于百分位数。以一个包含 500 只股票的范围为例,将创建十个相等的桶,每个桶中有 50 只股票(50 x 10 = 500)。得分最低的 50 只股票进入底部桶,其 SCTR 范围从 0 到 10。得分最高的 50 只股票进入顶部桶,其 SCTR 范围从 90 到 99.99。然后,每个桶将相应填充并在桶内进一步排序。最终结果是 500 只股票从 0 到 99.99 排名,并在排名池中相对均匀地分布。

代码

名称:计算SCTR
描述:根据给定的股票数据计算StockCharts技术排名(SCTR)
import pandas as pd
def calculate_sctr(df):
    # 计算长期指标得分
    df['long_term_score'] = (df['close'] / df['close'].rolling(window=200).mean() - 1) * 30 + df['close'].pct_change(125) * 30
    
    # 计算中期指标得分
    df['medium_term_score'] = (df['close'] / df['close'].rolling(window=50).mean() - 1) * 15 + df['close'].pct_change(20) * 15
    
    # 计算短期指标得分
    ppo_slope = df['close'].ewm(span=12).mean() - df['close'].ewm(span=26).mean()
    df['short_term_score'] = (ppo_slope.diff(3) / 3) * 5 + df['close'].diff(14).rolling(window=14).apply(lambda x: x[x > 0].mean()) * 5
    
    # 计算总得分
    df['sctr'] = df['long_term_score'] + df['medium_term_score'] + df['short_term_score']
    
    return df
# 使用示例
# df = pd.read_csv('stock_data.csv')
# df = calculate_sctr(df)

斜率

计算

斜率基于线性回归(最佳拟合线)。尽管线性回归的公式超出了本文的范围,但可以使用 SharpCharts 中的 Raff 回归通道显示线性回归。该指标在中间显示了一个线性回归,外部趋势线等距分布。斜率等于线性回归的上升/下降比率。上升指的是价格变化。运行指的是时间范围。20 天斜率将是 20 天线性回归的上升/下降比率。如果上升了 4 个点,运行了两天,那么斜率将是 2(4/2 = 2)。如果上升了-6 个点,运行了 2 天,那么斜率将是-3(6/2 = 3)。一般来说,上升期具有正斜率,下降期具有负斜率。斜度取决于上升或下降的陡峭程度。


图表 1 显示了 SPY 与三个不同的 20 天周期(橙色、黄色、蓝色)。每个 20 天周期都显示了一个 20 天的 Raff 回归通道。中间的线性回归代表了这 20 个数据点的“最佳拟合线”。虚线标记了 20 天周期的结束和该价格点的斜率值。第一个周期相对平坦,斜率几乎为正。第二个周期上升,斜率明显为正。第三个周期下降,斜率为负。请记住,随着旧数据点被删除和新数据点被添加,斜率会发生变化。

代码

# 名称:斜率
# 描述:基于线性回归计算斜率
import pandas as pd
import numpy as np
from scipy.stats import linregress
def slope(df):
    df['slope'] = np.nan
    
    for i in range(len(df)):
        if i >= 20:
            x = np.arange(20)
            y = df['close'].iloc[i-20:i]
            slope, _, _, _, _ = linregress(x, y)
            df.at[i, 'slope'] = slope
    
    return df

标准差(波动性)

计算

StockCharts.com 计算的是整体数据集的标准差,这意味着所涉及的周期代表整个数据集,而不是来自更大数据集的样本。计算步骤如下:

  1. 计算一定周期或观察次数的平均(均值)价格。
  2. 确定每个周期的偏差(收盘价减去平均价格)。
  3. 对每个周期的偏差进行平方。
  4. 求平方偏差的总和。
  5. 将这个总和除以观察次数。
  6. 然后标准差等于该数字的平方根。


上面的电子表格显示了使用 QQQQ 数据进行 10 期标准差的示例。请注意,10 期平均值是在第 10 期之后计算的,并且这个平均值适用于所有 10 期。使用这个公式构建一个运行标准差会非常耗时。Excel 有一个更简单的方法,使用 STDEVP 公式。下表显示了使用这个公式的 10 期标准差。这里有一个显示标准差计算的 Excel 电子表格")。



代码

# 计算标准差
def calculate_std(df):
    # 计算收盘价的平均值
    df['avg_close'] = df['close'].rolling(window=10).mean()
    
    # 计算每个周期的偏差
    df['deviation'] = df['close'] - df['avg_close']
    
    # 计算偏差的平方
    df['squared_deviation'] = df['deviation'] ** 2
    
    # 求平方偏差的总和
    sum_squared_deviation = df['squared_deviation'].sum()
    
    # 将总和除以观察次数
    std = (sum_squared_deviation / len(df)) ** 0.5
    
    return std

随机振荡器

计算

%K = (Current Close - Lowest Low)/(Highest High - Lowest Low) * 100
%D = 3-day SMA of %K
Lowest Low = lowest low for the look-back period
Highest High = highest high for the look-back period
%K is multiplied by 100 to move the decimal point two places

默认设置的随机振荡器为 14 个周期,可以是天、周、月或日内时间框架。14 个周期的%K 将使用最近的收盘价,过去 14 个周期内的最高价和最低价。%D 是%K 的 3 天简单移动平均。这条线与%K 一起绘制,作为信号线或触发线。


点击这里下载此电子表格示例。")


代码

名称:随机振荡器(%K 和 %D)
描述:根据给定的收盘价、最高价和最低价计算随机振荡器的 %K 和 %D 值
import pandas as pd
def stochastic_oscillator(df, period=14):
    df['Lowest Low'] = df['low'].rolling(window=period).min()
    df['Highest High'] = df['high'].rolling(window=period).max()
    
    df['%K'] = (df['close'] - df['Lowest Low']) / (df['Highest High'] - df['Lowest Low']) * 100
    df['%D'] = df['%K'].rolling(window=3).mean()
    
    df.drop(['Lowest Low', 'Highest High'], axis=1, inplace=True)
    
    return df[['%K', '%D']]
# 使用示例
# df 包含了 open, close, high, low 四个属性
# df = pd.DataFrame(data)
# result_df = stochastic_oscillator(df)

StochRSI

计算

StochRSI = (RSI - Lowest Low RSI) / (Highest High RSI - Lowest Low RSI)

StochRSI 测量 RSI 相对于其一定周期内的高/低范围的价值。用于计算 StochRSI 的周期数在公式中转移到 RSI。例如,14 天 StochRSI 将使用当前的 14 天 RSI 值和 14 天 RSI 的高低范围。

  • 当 RSI 在 14 天内处于最低点时,14 天 StochRSI 等于 0。
  • 当 RSI 在 14 天内达到最高点时,14 天 StochRSI 等于 1。
  • 当 RSI 处于其 14 天高低范围的中间时,14 天 StochRSI 等于 0.5。
  • 当 RSI 接近其 14 天高低范围的低点时,14 天 StochRSI 等于 0.2。
  • 当 RSI 接近其 14 天高低范围的高点时,14 天 StochRSI 等于 0.80。


点击这里查看一个 Excel 电子表格"),展示了 StochRSI 计算的开始。

代码

def calculate_StochRSI(df):
    n = 14
    df['RSI'] = talib.RSI(df['close'], timeperiod=n)
    df['Lowest Low RSI'] = df['RSI'].rolling(window=n).min()
    df['Highest High RSI'] = df['RSI'].rolling(window=n).max()
    df['StochRSI'] = (df['RSI'] - df['Lowest Low RSI']) / (df['Highest High RSI'] - df['Lowest Low RSI'])
    
    return df

TRIX

计算

TRIX 是三重平滑指数移动平均线(EMA)的 1 期百分比变化率,这是一个 EMA 的 EMA 的 EMA。以下是 15 期 TRIX 所涉及的步骤的详细说明。

  • 1. 单一平滑的 EMA = 收盘价的 15 日 EMA
  • 2. 双重平滑的 EMA = 单一平滑的 EMA 的 15 日 EMA
  • 3. 三重平滑的 EMA = 双重平滑的 EMA 的 15 日 EMA
  • 4. TRIX = 三重平滑的 EMA 的 1 期百分比变化

下表和图提供了 15 日 EMA、双重平滑的 EMA 和三重平滑的 EMA 的示例。请注意每个 EMA 都会滞后价格一段时间。尽管指数移动平均值更加重视最近的数据,但它们仍包含产生滞后的过去数据。这种滞后随着平滑次数的增加而增加。



蓝线是 SPY 的价格走势图。它显然是四条线中最不平滑(波动最大)的。红线是 15 日 EMA,它最接近价格走势。绿线是双重平滑的 EMA,紫线是三重平滑的 EMA。请注意随着滞后的增加,这两条线变得更加平坦。

只要三重平滑的 15 日 EMA 向下移动,TRIX 就是负的。当三重平滑的 15 日 EMA 向上转变时,TRIX 变为正。额外的平滑确保上涨和下跌被最小化。换句话说,需要超过一天的上涨才能扭转下降趋势。


代码

# 计算TRIX指标
def trix(df):
    # 计算单一平滑的EMA
    df['single_ema'] = df['close'].ewm(span=15, min_periods=15).mean()
    
    # 计算双重平滑的EMA
    df['double_ema'] = df['single_ema'].ewm(span=15, min_periods=15).mean()
    
    # 计算三重平滑的EMA
    df['triple_ema'] = df['double_ema'].ewm(span=15, min_periods=15).mean()
    
    # 计算TRIX
    df['trix'] = df['triple_ema'].pct_change()
    
    return df
# 使用示例
# df = trix(df)

真实强度指数(TSI)

计算

真实强度指数(TSI)可以分为三部分:双重平滑价格变化、双重平滑绝对价格变化和 TSI 公式。首先,计算一个周期到下一个周期的价格变化。其次,计算这种价格变化的 25 周期 EMA。第三,计算这个 25 周期 EMA 的 13 周期 EMA 以创建双重平滑。绝对价格变化也使用相同的双重平滑技术。在这些初始计算之后,将双重平滑价格变化除以绝对双重平滑价格变化,并乘以 100 以将小数点移动两位。


Double Smoothed PC
------------------
PC = Current Price minus Prior Price
First Smoothing = 25-period EMA of PC
Second Smoothing = 13-period EMA of 25-period EMA of PC
Double Smoothed Absolute PC
---------------------------
Absolute Price Change |PC| = Absolute Value of Current Price minus Prior Price
First Smoothing = 25-period EMA of |PC|
Second Smoothing = 13-period EMA of 25-period EMA of |PC|
TSI = 100 x (Double Smoothed PC / Double Smoothed Absolute PC)

第一部分,即双重平滑价格变化,为 TSI 设定了正面或负面的基调。当双重平滑价格变化为负时,指标为负,当为正时,指标为正。双重平滑绝对价格变化对指标进行了标准化,并限制了随后振荡器的范围。换句话说,该指标衡量了双重平滑价格变化相对于双重平滑绝对价格变化的情况。一连串的大幅正价格变化导致相对较高的正读数,因为这表示强劲的上行动量。一连串的大幅负价格变化将 TSI 推入深度负值区域。


上表来自 Excel 电子表格。请注意,计算中使用了指数移动平均线。这些从简单移动平均线开始,然后使用乘数进行计算,这意味着需要额外的历史数据来达到真实值。点击这里下载此电子表格示例"),并在家里尝试。

代码

名称:真实强度指数(TSI)
描述:根据给定的开盘价、收盘价、最高价和最低价计算真实强度指数(TSI)
代码:
def TSI(df):
    df['PC'] = df['close'] - df['close'].shift(1)
    df['PC_25_EMA'] = df['PC'].ewm(span=25, min_periods=0, adjust=False).mean()
    df['PC_25_EMA_13_EMA'] = df['PC_25_EMA'].ewm(span=13, min_periods=0, adjust=False).mean()
    
    df['|PC|'] = abs(df['close'] - df['close'].shift(1))
    df['|PC|_25_EMA'] = df['|PC|'].ewm(span=25, min_periods=0, adjust=False).mean()
    df['|PC|_25_EMA_13_EMA'] = df['|PC|_25_EMA'].ewm(span=13, min_periods=0, adjust=False).mean()
    
    df['TSI'] = 100 * (df['PC_25_EMA_13_EMA'] / df['|PC|_25_EMA_13_EMA'])
    
    df.drop(['PC', 'PC_25_EMA', 'PC_25_EMA_13_EMA', '|PC|', '|PC|_25_EMA', '|PC|_25_EMA_13_EMA'], axis=1, inplace=True)
    
    return df

溃疡指数

计算

基于收盘价,溃疡指数根据价格从其高点的贬值来衡量波动性,这是在特定回顾期内。如果价格每个周期都收盘较高,则指数为零。这意味着没有下行风险,因为价格稳步上涨。当然,价格并不会稳步上涨,在这过程中会有下降。使用默认设置的 14 个周期,溃疡指数反映了此期间的预期百分比回撤。表格显示了 14 个周期的样本计算。


Percent-Drawdown = ((Close - 14-period Max Close)/14-period Max Close) x 100
Squared Average = (14-period Sum of Percent-Drawdown Squared)/14 
Ulcer Index = Square Root of Squared Average


代码

名称:Ulcer Index
描述:根据收盘价计算溃疡指数
--- 
代码:
def ulcer_index(df):
    df['14-period Max Close'] = df['close'].rolling(window=14).max()
    df['Percent-Drawdown'] = ((df['close'] - df['14-period Max Close']) / df['14-period Max Close']) * 100
    df['Percent-Drawdown Squared'] = df['Percent-Drawdown'] ** 2
    df['Squared Average'] = df['Percent-Drawdown Squared'].rolling(window=14).sum() / 14
    df['Ulcer Index'] = df['Squared Average'] ** 0.5
    df.drop(['14-period Max Close', 'Percent-Drawdown', 'Percent-Drawdown Squared', 'Squared Average'], axis=1, inplace=True)
    return df

终极振荡器

计算

终极振荡器(UO)计算涉及许多步骤。此示例基于默认设置(7,14,28)。首先,计算买入压力(BP)以确定价格走势的总体方向。其次,测量买入压力相对于真实波幅(TR)。这告诉我们收益或损失的真实幅度。第三,基于涉及的三个时间框架(7,14,28)创建平均值。第四,创建三个平均值的加权平均值。

BP = Close - Minimum(Low or Prior Close).
TR = Maximum(High or Prior Close)  -  Minimum(Low or Prior Close)
Average7 = (7-period BP Sum) / (7-period TR Sum)
Average14 = (14-period BP Sum) / (14-period TR Sum)
Average28 = (28-period BP Sum) / (28-period TR Sum)
UO = 100 x [(4 x Average7)+(2 x Average14)+Average28]/(4+2+1)

买入压力(BP)衡量当前收盘价相对于当前最低价或先前收盘价(以较低者为准)的水平。真实波幅(TR)衡量从当前最高价或先前收盘价(以较高者为准)到当前最低价或先前收盘价(以较低者为准)的价格范围。买入压力和真实波幅都包含先前收盘价,以考虑可能从一个周期到下一个周期的间隙。然后通过将 BP 的 X 周期总和除以 TR 的 X 周期总和来相对于真实波幅显示买入压力。为 7、14 和 28 个周期创建平均值。这些数字对应默认参数。然后通过将最短平均值乘以 4、中间平均值乘以 2 和最长平均值乘以 1 来创建加权平均值。然后将这些加权金额相加,并除以权重之和(4+2+1)。


点击这里")查看 Excel 电子表格中的终极振荡器计算。


代码

# 计算终极振荡器(UO)
def ultimate_oscillator(df):
    df['BP'] = df['close'] - df[['low', 'close']].min(axis=1)
    df['TR'] = df[['high', 'close']].max(axis=1) - df[['low', 'close']].min(axis=1)
    
    df['BP_sum7'] = df['BP'].rolling(window=7).sum()
    df['TR_sum7'] = df['TR'].rolling(window=7).sum()
    df['Average7'] = df['BP_sum7'] / df['TR_sum7']
    
    df['BP_sum14'] = df['BP'].rolling(window=14).sum()
    df['TR_sum14'] = df['TR'].rolling(window=14).sum()
    df['Average14'] = df['BP_sum14'] / df['TR_sum14']
    
    df['BP_sum28'] = df['BP'].rolling(window=28).sum()
    df['TR_sum28'] = df['TR'].rolling(window=28).sum()
    df['Average28'] = df['BP_sum28'] / df['TR_sum28']
    
    df['UO'] = 100 * ((4 * df['Average7'] + 2 * df['Average14'] + df['Average28']) / (4 + 2 + 1))
    
    return df

涡旋指标

SharpCharts 计算


涡旋指标(VTX)的计算可以分为三部分。首先,根据最近两个周期的高点和低点计算正向和负向趋势运动。正向趋势运动是当前高点到前一低点的距离。当前高点距离前一低点越远,趋势运动越正向。负向趋势运动是当前低点到前一高点的距离。当前低点距离前一高点越远,趋势运动越负向。然后根据指标设置(通常为 14 个周期)对这些周期性值进行求和。

第二部分涉及真实波幅,由 Welles Wilder 创建。该指标使用当前高点、当前低点和前一收盘价来衡量波动性。详情请参见下面的公式框。

第三部分通过将正负趋势运动除以真实波幅来进行标准化。实际上,涡旋指标显示了经过波动调整的正向趋势运动和负向趋势运动。最终结果产生了两个在 1 之上/之下振荡的指标。

Positive and negative trend movement:
+VM = Current High less Prior Low (absolute value)
-VM = Current Low less Prior High (absolute value)
+VM14 = 14-period Sum of +VM
-VM14 = 14-period Sum of -VM
True Range (TR) is the greatest of:
  * Current High less current Low
  * Current High less previous Close (absolute value)
  * Current Low less previous Close (absolute value)
TR14 = 14-period Sum of TR
Normalize the positive and negative trend movements:
+VI14 = +VM14/TR14
-VI14 = -VM14/TR14


上表来自 Excel 电子表格。点击此处下载") 这个电子表格。

代码

名称:涡旋指标(VTX)
描述:根据给定的开盘价、收盘价、最高价和最低价计算涡旋指标(VTX)
代码:
def VTX(df):
    df['+VM'] = df['high'].diff().abs()
    df['-VM'] = df['low'].diff().abs()
    
    df['+VM14'] = df['+VM'].rolling(window=14).sum()
    df['-VM14'] = df['-VM'].rolling(window=14).sum()
    
    df['TR'] = df[['high', 'low', 'close']].apply(lambda x: max(x) - min(x), axis=1)
    df['TR14'] = df['TR'].rolling(window=14).sum()
    
    df['+VI14'] = df['+VM14'] / df['TR14']
    df['-VI14'] = df['-VM14'] / df['TR14']
    
    return df

威廉斯%R

计算

%R = (Highest High - Close)/(Highest High - Lowest Low) * -100
Lowest Low = lowest low for the look-back period
Highest High = highest high for the look-back period
%R is multiplied by -100 correct the inversion and move the decimal.

威廉斯%R 的默认设置是 14 个周期,可以是天、周、月或日内时间框架。14 个周期的%R 将使用最近的收盘价,过去 14 个周期内的最高价和最低价。


点击这里下载这个电子表格示例。")


代码

# 计算威廉斯%R指标
def williams_r(df, lookback_period=14):
    df['Lowest Low'] = df['low'].rolling(window=lookback_period).min()
    df['Highest High'] = df['high'].rolling(window=lookback_period).max()
    df['%R'] = ((df['Highest High'] - df['close']) / (df['Highest High'] - df['Lowest Low'])) * -100
    df.drop(['Lowest Low', 'Highest High'], axis=1, inplace=True)
    return df


相关文章
|
6天前
|
项目管理 Python
基本技术指标 Python 实现(3)
基本技术指标 Python 实现
70 0
|
6天前
|
Python
基本技术指标 Python 实现(2)
基本技术指标 Python 实现
59 1
|
6天前
|
Serverless 云计算 Python
基本技术指标 Python 实现(1)
基本技术指标 Python 实现
112 3
|
Serverless 开发者 Python
python股票量化交易(6)---使用TA-Lib计算技术指标
python股票量化交易(6)---使用TA-Lib计算技术指标
2414 0
python股票量化交易(6)---使用TA-Lib计算技术指标
|
Python
Python用主成分分析的方法分析螺纹钢期货30多个技术指标
Python用主成分分析的方法分析螺纹钢期货30多个技术指标
83 0
python-分水岭-技术指标
python-分水岭-技术指标
142 0
|
算法 Python
python-技术指标-ema算法
python-技术指标-ema算法
187 0
|
1天前
|
数据采集 算法 Python
2024年Python最全python基础入门:高阶函数,小米面试编程题
2024年Python最全python基础入门:高阶函数,小米面试编程题
|
1天前
|
数据采集 人工智能 前端开发
干货满满,转行逆袭,0编程基础学Python拿高薪offer如何做?都在这里!
干货满满,转行逆袭,0编程基础学Python拿高薪offer如何做?都在这里!
|
3天前
|
Python
10个python入门小游戏,零基础打通关,就能掌握编程基础_python编写的入门简单小游戏
10个python入门小游戏,零基础打通关,就能掌握编程基础_python编写的入门简单小游戏