基本技术指标 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


相关文章
|
1月前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
188 66
|
1月前
|
SQL 数据采集 数据可视化
深入 Python 数据分析:高级技术与实战应用
本文系统地介绍了Python在高级数据分析中的应用,涵盖数据读取、预处理、探索及可视化等关键环节,并详细展示了聚类分析、PCA、时间序列分析等高级技术。通过实际案例,帮助读者掌握解决复杂问题的方法,提升数据分析技能。使用pandas、matplotlib、seaborn及sklearn等库,提供了丰富的代码示例,便于实践操作。
162 64
|
17天前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
图论在数据结构与算法中占据重要地位,应用广泛。本文通过Python代码实现深度优先搜索(DFS)和广度优先搜索(BFS),帮助读者掌握图的遍历技巧。DFS沿路径深入搜索,BFS逐层向外扩展,两者各具优势。掌握这些技巧,为解决复杂问题打下坚实基础。
28 2
|
19天前
|
开发框架 开发者 Python
探索Python中的装饰器:技术感悟与实践
【10月更文挑战第31天】 在编程世界中,装饰器是Python中一种强大的工具,它允许我们在不修改函数代码的情况下增强函数的功能。本文将通过浅显易懂的方式,带你了解装饰器的概念、实现原理及其在实际开发中的应用。我们将一起探索如何利用装饰器简化代码、提高可读性和复用性,同时也会分享一些个人的技术感悟,帮助你更好地掌握这项技术。
32 2
|
23天前
|
数据采集 Web App开发 iOS开发
如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?
本文介绍了使用 Python 爬虫技术获取淘宝天猫商品价格信息的两种方法。方法一使用 Selenium 模拟浏览器操作,通过定位页面元素获取价格;方法二使用 Requests 和正则表达式直接请求页面内容并提取价格。每种方法都有详细步骤和代码示例,但需注意反爬措施和法律法规。
|
24天前
|
数据采集 存储 Web App开发
利用Python 的爬虫技术淘宝天猫销量和库存
使用 Python 爬虫技术获取淘宝天猫商品销量和库存的步骤包括:1. 安装 Python 和相关库(如 selenium、pandas),下载浏览器驱动;2. 使用 selenium 登录淘宝或天猫;3. 访问商品页面,分析网页结构,提取销量和库存信息;4. 处理和存储数据。注意网页结构可能变化,需遵守法律法规。
|
25天前
|
数据库 开发者 Python
“Python异步编程革命:如何从编程新手蜕变为并发大师,掌握未来技术的制胜法宝”
【10月更文挑战第25天】介绍了Python异步编程的基础和高级技巧。文章从同步与异步编程的区别入手,逐步讲解了如何使用`asyncio`库和`async`/`await`关键字进行异步编程。通过对比传统多线程,展示了异步编程在I/O密集型任务中的优势,并提供了最佳实践建议。
18 1
|
2月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
47 5
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
1月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
2月前
|
算法 数据挖掘 Python
Python中的拟合技术:揭示数据背后的模式
Python中的拟合技术:揭示数据背后的模式
40 0
Python中的拟合技术:揭示数据背后的模式
下一篇
无影云桌面