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

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

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

代码

## 计算相关系数
import pandas as pd
def calculate_correlation(df):
    # 计算 INTC 列和 QQQ 列的均值
    intc_mean = df['INTC'].mean()
    qqq_mean = df['QQQ'].mean()
    
    # 计算 INTC 列和 QQQ 列的差值
    intc_diff = df['INTC'] - intc_mean
    qqq_diff = df['QQQ'] - qqq_mean
    
    # 计算 INTC 列和 QQQ 列的平方
    intc_sq = intc_diff ** 2
    qqq_sq = qqq_diff ** 2
    
    # 计算 INTC 列和 QQQ 列的乘积
    intc_qqq = intc_diff * qqq_diff
    
    # 计算相关系数
    correlation = intc_qqq.sum() / ((intc_sq.sum() * qqq_sq.sum()) ** 0.5)
    
    return correlation
# 使用示例
# 假设 df 包含了 INTC 和 QQQ 价格数据
correlation = calculate_correlation(df)
print("Correlation between INTC and QQQ:", correlation)

DecisionPoint 价格动量振荡器(PMO)

计算

DecisionPoint 价格动量振荡器是通过采用一个周期变化率并使用两个自定义平滑函数对其进行平滑而导出的。这些自定义平滑函数与指数移动平均线非常相似,但是与真正的 EMA 不同,它们不是将时间周期设置加一来创建平滑乘数(如真正的 EMA 中那样),而是只使用周期本身。

Smoothing Multiplier = (2 / Time period)
Custom Smoothing Function = {Close - Smoothing Function(previous day)} *
 Smoothing Multiplier + Smoothing Function(previous day) 
PMO Line = 20-period Custom Smoothing of
(10 * 35-period Custom Smoothing of
 ( ( (Today's Price/Yesterday's Price) * 100) - 100) )
PMO Signal Line = 10-period EMA of the PMO Line

下表显示了亚马逊的 PMO 计算:

要下载包含这些计算的 Excel 电子表格,请点击这里")。

代码

名称:DecisionPoint Price Momentum Oscillator (PMO)
描述:计算价格动量振荡器(PMO)
import pandas as pd
def pmo(df, time_period=20, smoothing_period=35):
    # Calculate the Smoothing Multiplier
    smoothing_multiplier = 2 / time_period
    
    # Calculate the Custom Smoothing Function
    df['Smoothing Function'] = (df['Close'] - df['Smoothing Function'].shift(1)) * smoothing_multiplier + df['Smoothing Function'].shift(1)
    
    # Calculate the 35-period Custom Smoothing
    df['35-period Custom Smoothing'] = df['Smoothing Function'].rolling(window=smoothing_period).mean()
    
    # Calculate the Price Momentum Oscillator (PMO) Line
    df['PMO Line'] = 20 * df['35-period Custom Smoothing'].rolling(window=10).mean()
    
    # Calculate the PMO Signal Line
    df['PMO Signal Line'] = df['PMO Line'].ewm(span=10, adjust=False).mean()
    
    return df
# Assuming df is the DataFrame containing the necessary columns (open, close, high, low, volume)
df = pmo(df)

去趋势价格振荡器(DPO)

计算

Price {X/2 + 1} periods ago less the X-period simple moving average.
X refers to the number of periods used to calculate the Detrended Price 
Oscillator. A 20-day DPO would use a 20-day SMA that is displaced by 11 
periods {20/2 + 1 = 11}. This displacement shifts the 20-day SMA 11 days to the left, which actually puts it in the middle of the look-back 
period. The value of the 20-day SMA is then subtracted from the price
in the middle of this look-back period. In short, DPO(20) equals price
11 days ago less the 20-day SMA.  

代码

# Calculate Detrended Price Oscillator
def detrended_price_oscillator(df, X):
    sma = df['close'].rolling(window=X).mean()
    dpo = df['close'].shift(-int(X/2 + 1)) - sma
    return dpo

价格运动便利性

SharpCharts 计算

EMV 公式有三部分:移动距离、成交量和高低范围。首先,移动距离是通过比较当前周期的中点与前一周期的中点(即高加低除以二)来计算的。当当前中点高于前一中点时,移动距离为正,当当前中点低于前一中点时,移动距离为负。移动距离在下面的公式中显示为分子。

Distance Moved = ((H + L)/2 - (Prior H + Prior L)/2) 
Box Ratio = ((V/100,000,000)/(H - L))
1-Period EMV = ((H + L)/2 - (Prior H + Prior L)/2) / ((V/100,000,000)/(H - L))
14-Period Ease of Movement = 14-Period simple moving average of 1-period EMV

另外两部分构成了盒子比率,它使用了成交量和高低范围。等量图表也是基于成交量和高低范围。盒子比率是 EMV 的分母。请注意,成交量除以 100,000,000 以保持与其他数字的相关性。

相对较低的成交量和相对较大的高低范围将产生较小的分母(盒子比率),这意味着由于除以较小的数字,EMV 值将更大。如果 V/10000000 等于 2,高低范围等于 4,则盒子比率将为 0.50。低成交量的广泛范围意味着价格变动相对容易。换句话说,价格变动不需要太多成交量。

相对较小的高低范围和高成交量将产生较大的分母,这意味着 EMV 值将较小。如果 V/10000000 等于 4,高低范围等于 2,则分母为 2。这意味着价格变动困难,因为在大成交量下高低范围相对较小。


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

代码

# 名称:EMV指标计算
# 描述:根据给定的DataFrame计算EMV指标
def calculate_EMV(df):
    df['Distance Moved'] = ((df['high'] + df['low']) / 2 - (df['high'].shift(1) + df['low'].shift(1)) / 2)
    df['Box Ratio'] = ((df['volume'] / 100000000) / (df['high'] - df['low']))
    df['1-Period EMV'] = df['Distance Moved'] / df['Box Ratio']
    df['14-Period Ease of Movement'] = df['1-Period EMV'].rolling(window=14).mean()
    
    return df

力量指数

计算

Force Index(1) = {Close (current period)  -  Close (prior period)} x Volume
Force Index(13) = 13-period EMA of Force Index(1)

1 期力量指数的计算很简单。只需将前一收盘价减去当前收盘价,然后乘以成交量。超过一天的力量指数只是过去 13 个周期的 1 期力量指数的指数移动平均值。例如,13 期力量指数是过去 13 个周期的 1 期力量指数值的 13 期指数移动平均值。

三个因素影响力量指数的数值。首先,当当前收盘价高于前一收盘价时,力量指数为正值。当当前收盘价低于前一收盘价时,力量指数为负值。其次,移动的幅度决定了成交量的乘数。较大的移动需要较大的乘数,从而相应地影响力量指数。较小的移动产生较小的乘数,降低了影响力。第三,成交量起着关键作用。大幅度的移动伴随大量成交产生高的力量指数数值。小幅度的移动伴随低成交量产生相对较低的力量指数数值。下表显示了辉瑞(PFE)的力量指数计算。第 27 行标记了最大的移动(+84 美分)和最大的成交量(162,619)。这种组合在表中产生了最大的力量指数值(136,600)。


上图展示了力量指数的运作方式。请注意,1 周期力量指数在零线上下波动,看起来相当锯齿状。Elder 建议使用 13 周期 EMA 平滑该指标,以减少正负交叉。图表分析师应该尝试不同的平滑周期,以确定最适合其分析需求的方法。


代码

名称:Force Index
描述:计算1期和13期力量指数
def force_index(df):
    df['Force Index(1)'] = (df['Close'] - df['Close'].shift(1)) * df['Volume']
    df['Force Index(13)'] = df['Force Index(1)'].ewm(span=13).mean()
    
    return df

质量指数

SharpCharts 计算

质量指数计算涉及四个部分:

Single EMA = 9-period exponential moving average (EMA) of the high-low differential  
Double EMA = 9-period EMA of the 9-period EMA of the high-low differential 
EMA Ratio = Single EMA divided by Double EMA 
Mass Index = 25-period sum of the EMA Ratio 


计算相当简单。首先,单一 EMA 提供高低范围的平均值。其次,双重 EMA 对这种波动性指标进行第二次平滑。使用这两个指数移动平均数的比率对数据系列进行归一化。这个比率显示单一 EMA 相对于双重 EMA 变大的时候。最后一步,25 期总和,类似于移动平均线,进一步平滑数据系列。总的来说,随着高低范围的扩大,质量指数上升,随着高低范围的缩小,质量指数下降。下面展示了一个电子表格示例。


一些电子表格数值有一分钱的偏差,因为指数移动平均计算的时间跨度不到三个月。SharpCharts 中的计算时间跨度为两年,这使指数移动平均计算更加稳健。点击这里下载这个电子表格示例。")

代码

名称:质量指数(Mass Index)
描述:根据给定的开盘价、收盘价、最高价和最低价计算质量指数
import pandas as pd
def mass_index(df):
    df['high_low_diff'] = df['high'] - df['low']
    df['single_ema'] = df['high_low_diff'].ewm(span=9, min_periods=0, adjust=False).mean()
    df['double_ema'] = df['single_ema'].ewm(span=9, min_periods=0, adjust=False).mean()
    df['ema_ratio'] = df['single_ema'] / df['double_ema']
    df['mass_index'] = df['ema_ratio'].rolling(window=25).sum()
    
    return df
# 使用示例
df = pd.DataFrame({
    'open': [100, 110, 105, 120, 115],
    'close': [105, 115, 118, 125, 120],
    'high': [110, 120, 122, 130, 128],
    'low': [95, 105, 108, 118, 112],
    'volume': [1000, 1200, 1500, 800, 1000]
})
result = mass_index(df)
print(result)

MACD(移动平均线收敛/发散振荡器)

计算

MACD Line: (12-day EMA - 26-day EMA)
Signal Line: 9-day EMA of MACD Line
MACD Histogram: MACD Line - Signal Line

MACD 线是 12 天的指数移动平均线(EMA)减去 26 天的 EMA。这些移动平均线使用收盘价。MACD 线的 9 天 EMA 与指标一起绘制,作为信号线并识别转折点。MACD 柱状图表示 MACD 与其 9 天 EMA(信号线)之间的差异。当 MACD 线高于其信号线时,柱状图为正,当 MACD 线低于其信号线时,柱状图为负。

12、26 和 9这些数值是 MACD 中典型的设置,然而根据您的交易风格和目标,可以替换其他数值。

代码

# 计算MACD指标
def calculate_macd(df):
    # 计算12天EMA
    ema_12 = df['close'].ewm(span=12, adjust=False).mean()
    
    # 计算26天EMA
    ema_26 = df['close'].ewm(span=26, adjust=False).mean()
    
    # 计算MACD线
    macd_line = ema_12 - ema_26
    
    # 计算信号线
    signal_line = macd_line.ewm(span=9, adjust=False).mean()
    
    # 计算MACD柱状图
    macd_histogram = macd_line - signal_line
    
    return macd_line, signal_line, macd_histogram
# 将计算结果添加到DataFrame中
df['MACD Line'], df['Signal Line'], df['MACD Histogram'] = calculate_macd(df)

MACD-Histogram

计算

MACD: (12-day EMA - 26-day EMA) 
Signal Line: 9-day EMA of MACD
MACD Histogram: MACD - Signal Line

标准 MACD 是 12 日指数移动平均线(EMA)减去 26 日 EMA。收盘价用于形成移动平均线,因此 MACD。MACD 的 9 日 EMA 被绘制在旁边,作为一个信号线,用于识别指标的转折点。MACD-Histogram 代表 MACD 和其 9 日 EMA 信号线之间的差异。当 MACD 高于其 9 日 EMA 时,直方图为正,当 MACD 低于其 9 日 EMA 时,直方图为负。


代码

# 计算 MACD 指标
def calculate_MACD(df):
    df['12-day EMA'] = df['close'].ewm(span=12, adjust=False).mean()
    df['26-day EMA'] = df['close'].ewm(span=26, adjust=False).mean()
    df['MACD'] = df['12-day EMA'] - df['26-day EMA']
    df['Signal Line'] = df['MACD'].ewm(span=9, adjust=False).mean()
    df['MACD Histogram'] = df['MACD'] - df['Signal Line']
    return df
# 使用示例
df = calculate_MACD(df)
print(df[['MACD', 'Signal Line', 'MACD Histogram']])

资金流指数(MFI)

计算

资金流指数计算涉及几个步骤。下面的示例基于 14 周期的资金流指数,这是 SharpCharts 的默认设置和创建者推荐的设置。

Typical Price = (High + Low + Close)/3
Raw Money Flow = Typical Price x Volume
Money Flow Ratio = (14-period Positive Money Flow)/(14-period Negative Money Flow)
Money Flow Index = 100 - 100/(1 + Money Flow Ratio)

首先,注意原始资金流是基本上是美元交易量,因为公式是交易量乘以典型价格。当典型价格从一个周期到下一个周期上涨时,原始资金流是正的,当典型价格下跌时是负的。当典型价格不变时,不使用原始资金流值。第 3 步中的资金流比率形成了资金流指数(MFI)的基础。正负资金流在回顾期(14)内求和,正资金流总和除以负资金流总和得到比率。然后应用 RSI 公式创建一个成交量加权指标。下表显示了从 Excel 电子表格中提取的计算示例。


点击这里")查看 Excel 电子表格中的 MFI 计算。


代码

名称:资金流指数
描述:计算资金流指数(MFI)
import pandas as pd
def money_flow_index(df, period=14):
    df['typical_price'] = (df['high'] + df['low'] + df['close']) / 3
    df['raw_money_flow'] = df['typical_price'] * df['volume']
    
    df['positive_money_flow'] = df['raw_money_flow'].where(df['typical_price'] > df['typical_price'].shift(1), 0)
    df['negative_money_flow'] = df['raw_money_flow'].where(df['typical_price'] < df['typical_price'].shift(1), 0)
    
    df['money_flow_ratio'] = df['positive_money_flow'].rolling(window=period).sum() / df['negative_money_flow'].rolling(window=period).sum()
    
    df['money_flow_index'] = 100 - 100 / (1 + df['money_flow_ratio'])
    
    df.drop(['typical_price', 'raw_money_flow', 'positive_money_flow', 'negative_money_flow', 'money_flow_ratio'], axis=1, inplace=True)
    
    return df
# 使用示例
df = pd.DataFrame({
    'open': [100, 110, 105, 120, 125],
    'high': [120, 130, 115, 130, 130],
    'low': [90, 100, 95, 110, 120],
    'close': [110, 120, 110, 125, 125],
    'volume': [1000, 1500, 1200, 2000, 1800]
})
df = money_flow_index(df)
print(df)

负量指数 (NVI)

SharpCharts 计算

负量指数有两个版本。在原始版本中,戴萨特通过在一个周期到另一个周期成交量减少时添加净进步来形成一个累积线。净进步等于上涨股票数减去下跌股票数。当成交量从一个周期增加到另一个周期时,累积 NVI 线保持不变。换句话说,什么也没做。股市逻辑的诺曼·福斯巴克通过用百分比价格变化替代净进步来调整了该指标。SharpCharts 公式使用了这个福斯巴克版本。

1\. Cumulative NVI starts at 1000
2\. Add the Percentage Price Change to Cumulative NVI when Volume Decreases
3\. Cumulative NVI is Unchanged when Volume Increases
4\. Apply a 255-day EMA for Signals


电子表格示例详细展示了计算过程。价格 % 变化乘以 100,以减少所需的小数位数。首先注意成交量 % 变化列。当这个值为负时,标普 500 的百分比变化被输入到 NVI 值列中。当这个值为正时,NVI 值列中不会出现任何内容。从 1000 开始,每个周期应用 NVI 值,以创建一个仅在成交量减少时变化的累积指标。


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

代码

名称:Negative Volume Index (NVI)
描述:Calculate the Negative Volume Index (NVI) based on the SharpCharts formula
import pandas as pd
def calculate_NVI(df):
    df['price_change'] = df['close'].pct_change() * 100
    df['NVI'] = 1000
    for i in range(1, len(df)):
        if df['volume'][i] < df['volume'][i-1]:
            df['NVI'][i] = df['NVI'][i-1] + df['price_change'][i]
        else:
            df['NVI'][i] = df['NVI'][i-1]
    
    df['NVI_EMA'] = df['NVI'].ewm(span=255, min_periods=255).mean()
    
    return df[['NVI', 'NVI_EMA']]
# Example usage
nvi_data = calculate_NVI(df)
print(nvi_data)

成交量平衡(OBV)

计算

成交量平衡(OBV)线简单地是正向和负向成交量的累计总和。当收盘价高于前一个收盘价时,该时期的成交量为正。当收盘价低于前一个收盘价时,该时期的成交量为负。

If the closing price is above the prior close price then: 
Current OBV = Previous OBV + Current Volume
If the closing price is below the prior close price then: 
Current OBV = Previous OBV  -  Current Volume
If the closing prices equals the prior close price then:
Current OBV = Previous OBV (no change)


上表中的数据来自沃尔玛(WMT)。成交量数据已四舍五入,并以千为单位显示。换句话说,8200 实际上等于 820 万股。首先,我们必须确定沃尔玛是收盘上涨(+1)还是下跌(-1)。这个数字现在被用作成交量乘数,用于计算正向或负向成交量。最后一列(OBV)形成正向/负向成交量的累计总和。因为 OBV 必须从某个地方开始,第一个值(8200)只是等于第一个时期的正向/负向成交量。下面的图表显示了沃尔玛的成交量和 OBV。


代码

# 计算成交量平衡(OBV)线
def calculate_obv(df):
    obv = [0]  # 初始化 OBV 列表,第一个值为 0
    for i in range(1, len(df)):
        if df['close'][i] > df['close'][i-1]:
            obv.append(obv[-1] + df['volume'][i])  # 当收盘价高于前一个收盘价时,正向成交量累加
        elif df['close'][i] < df['close'][i-1]:
            obv.append(obv[-1] - df['volume'][i])  # 当收盘价低于前一个收盘价时,负向成交量累加
        else:
            obv.append(obv[-1])  # 当收盘价等于前一个收盘价时,OBV 保持不变
    df['obv'] = obv  # 将计算得到的 OBV 列表添加到 DataFrame 中
    return df
# 使用示例
df = calculate_obv(df)
print(df)

百分比价格振荡器

计算

Percentage Price Oscillator (PPO): {(12-day EMA - 26-day EMA)/26-day EMA} x 100
Signal Line: 9-day EMA of PPO
PPO Histogram: PPO - Signal Line

虽然 MACD 衡量两个移动平均线之间的绝对差值,但 PPO 通过将差值除以较慢的移动平均线(26 天 EMA)使其成为相对值。PPO 简单地是 MACD 值除以较长的移动平均线。结果乘以 100,将小数点移动两位。下表显示了英特尔(INTC)的 12 天 EMA、26 天 EMA、MACD 和 PPO 的值。英特尔的价格在低 20 美元左右,MACD 值范围从 -44 美分到 +64 美分。PPO 将这些值转换为百分比,范围从 -2.01 到 +2.85。使用百分比更容易随时间比较水平。-2.01 相当于 -2.01%,而 +2.85 相当于 +2.85%。


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


标准 PPO 基于 12 日指数移动平均线(EMA)和 26 日 EMA,但这些参数可以根据投资者或交易者的偏好进行更改。收盘价格用于计算移动平均线,因此 PPO 信号应根据收盘价格进行衡量。PPO 的 9 日 EMA 被绘制为信号线,以识别指标的上升和下降。

代码

# 计算PPO指标
def calculate_PPO(df):
    df['12-day EMA'] = df['close'].ewm(span=12, adjust=False).mean()
    df['26-day EMA'] = df['close'].ewm(span=26, adjust=False).mean()
    df['PPO'] = ((df['12-day EMA'] - df['26-day EMA']) / df['26-day EMA']) * 100
    df['Signal Line'] = df['PPO'].ewm(span=9, adjust=False).mean()
    df['PPO Histogram'] = df['PPO'] - df['Signal Line']
    
    return df

百分比成交量振荡器

计算

Percentage Volume Oscillator (PVO): 
((12-day EMA of Volume - 26-day EMA of Volume)/26-day EMA of Volume) x 100
Signal Line: 9-day EMA of PVO
PVO Histogram: PVO - Signal Line

PVO 的默认设置为 (12,26,9),与 MACD 或 PPO 相同。这意味着当 12 天成交量 EMA 上穿 26 天成交量 EMA 时,PVO 为正。当 12 天成交量 EMA 下穿 26 天成交量 EMA 时,PVO 为负。

正负程度取决于远近。PVO 等于 5 表示 12 天成交量 EMA 比 26 天成交量 EMA 高 5%。PVO 等于 -3% 表示 12 天成交量 EMA 比 26 天成交量 EMA 低 3%。

PVO-Histogram 的作用类似于 MACD 和 PPO 直方图。当 PVO 在其信号线(9 天 EMA)上方交易时,PVO-Histogram 为正。当 PVO 低于其信号线时,PVO-Histogram 为负。请注意,PVO 乘以 100,以将小数点移动两位。


代码

def calculate_pvo(df):
    df['12-day EMA of Volume'] = df['volume'].ewm(span=12, adjust=False).mean()
    df['26-day EMA of Volume'] = df['volume'].ewm(span=26, adjust=False).mean()
    
    df['PVO'] = ((df['12-day EMA of Volume'] - df['26-day EMA of Volume']) / df['26-day EMA of Volume']) * 100
    df['Signal Line'] = df['PVO'].ewm(span=9, adjust=False).mean()
    
    df['PVO Histogram'] = df['PVO'] - df['Signal Line']
    
    return df

价格相对 / 相对强度

计算

Price Relative = Base Security / Comparative Security
Ratio Symbol Close = Close of First Symbol / Close of Second Symbol
Ratio Symbol Open  = Open of First Symbol / Close of Second Symbol
Ratio Symbol High  = High of First Symbol / Close of Second Symbol
Ratio Symbol Low   = Low of First Symbol / Close of Second Symbol

价格相对指标简单地是基础证券除以比较证券。通常,基础证券是一支股票,基准是标普 500 指数。例如,图表分析师可以使用价格相对指标显示星巴克(SBUX)相对于标普 500 指数(KaTeX parse error: Expected 'EOF', got '#' at position 138: …oku.php?id=data#̲ratio_symbols_r…SPX)。


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

上表显示了星巴克/标普 500 价格相对性。第二行中的第一个值为 0.0256(30.66/1197.75)。当星巴克的涨幅超过标普 500 或跌幅低于标普 500 时,这个比率会增加。当星巴克的涨幅低于标普 500 或跌幅超过标普 500 时,这个比率会减少。为了参考,表中还显示了星巴克和标普 500 的百分比变化。星巴克的百分比变化减去标普 500 的百分比变化也等于价格相对性的日变化。在第二行中,注意到星巴克下跌了 2.66%,而标普 500 下跌了 1.62%。价格相对性下降(-1.04%),因为星巴克的跌幅超过了标普 500。第三行显示价格相对性上升,因为星巴克(+0.50%)的涨幅高于标普 500(+0.02%)。下图展示了价格相对性的实际情况。


代码

名称:价格相对指标
描述:计算基础证券与比较证券的价格相对指标
def price_relative(df, base_security, comparative_security):
    df['Price Relative'] = df[base_security] / df[comparative_security]
    return df
名称:比率符号收盘价
描述:计算第一个符号与第二个符号的收盘价比率
def ratio_symbol_close(df, first_symbol, second_symbol):
    df['Ratio Symbol Close'] = df[first_symbol] / df[second_symbol]
    return df
名称:比率符号开盘价
描述:计算第一个符号与第二个符号的开盘价比率
def ratio_symbol_open(df, first_symbol, second_symbol):
    df['Ratio Symbol Open'] = df[first_symbol] / df[second_symbol]
    return df
名称:比率符号最高价
描述:计算第一个符号与第二个符号的最高价比率
def ratio_symbol_high(df, first_symbol, second_symbol):
    df['Ratio Symbol High'] = df[first_symbol] / df[second_symbol]
    return df
名称:比率符号最低价
描述:计算第一个符号与第二个符号的最低价比率
def ratio_symbol_low(df, first_symbol, second_symbol):
    df['Ratio Symbol Low'] = df[first_symbol] / df[second_symbol]
    return df

知识确定事物(KST)

SharpCharts 计算

即使 KST 的公式看起来很复杂,但它实际上是一个相当直观的指标。它只是四个不同变化率的加权平均值,经过平滑处理。例如,计算 10 周期的变化率,然后用 10 周期的简单移动平均进行平滑处理。下图显示了四个不同的变化率指标及其适当的移动平均线进行平滑处理。


下方的公式框显示了四种不同组合及其默认设置。这些组合然后被加权和求和。最短的时间框架承载最小的权重(1),而最长的时间框架承载最大的权重(4)。添加了一个 9 周期的简单移动平均线作为信号线。

RCMA1 = 10-Period SMA of 10-Period Rate-of-Change 
RCMA2 = 10-Period SMA of 15-Period Rate-of-Change 
RCMA3 = 10-Period SMA of 20-Period Rate-of-Change 
RCMA4 = 15-Period SMA of 30-Period Rate-of-Change 
KST = (RCMA1 x 1) + (RCMA2 x 2) + (RCMA3 x 3) + (RCMA4 x 4)  
Signal Line = 9-period SMA of KST

默认参数如下:KST(10,15,20,30,10,10,10,15,9)。前四个数字代表变化率设置,后四个代表这些变化率指标的移动平均线,最后一个数字是信号线移动平均线。


点击这里下载此电子表格示例") 并在家里尝试。

代码

名称:KST
描述:根据给定的开盘价、收盘价、最高价、最低价和成交量计算知识强弱指标(KST)
代码:
def calculate_KST(df):
    df['ROC_10'] = df['close'].pct_change(10)
    df['ROC_15'] = df['close'].pct_change(15)
    df['ROC_20'] = df['close'].pct_change(20)
    df['ROC_30'] = df['close'].pct_change(30)
    
    df['RCMA1'] = df['ROC_10'].rolling(10).mean()
    df['RCMA2'] = df['ROC_15'].rolling(10).mean()
    df['RCMA3'] = df['ROC_20'].rolling(10).mean()
    df['RCMA4'] = df['ROC_30'].rolling(15).mean()
    
    df['KST'] = (df['RCMA1'] * 1) + (df['RCMA2'] * 2) + (df['RCMA3'] * 3) + (df['RCMA4'] * 4)
    
    df['Signal Line'] = df['KST'].rolling(9).mean()
    
    return df

马丁·普林的特别 K

计算

特别 K 是几种不同变化率加权平均数的总和。这些周期和权重是基于多年的市场观察而选择的。

Special K = 10 Period Simple Moving Average of ROC(10) * 1
            + 10 Period Simple Moving Average of ROC(15) * 2
            + 10 Period Simple Moving Average of ROC(20) * 3
            + 15 Period Simple Moving Average of ROC(30) * 4
            + 50 Period Simple Moving Average of ROC(40) * 1
            + 65 Period Simple Moving Average of ROC(65) * 2
            + 75 Period Simple Moving Average of ROC(75) * 3
            +100 Period Simple Moving Average of ROC(100)* 4
            +130 Period Simple Moving Average of ROC(195)* 1
            +130 Period Simple Moving Average of ROC(265)* 2
            +130 Period Simple Moving Average of ROC(390)* 3
            +195 Period Simple Moving Average of ROC(530)* 4

请注意,至少需要 725 个数据点才能准确计算此指标。如果数据较少,则计算的最后一行将被跳过。

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

相关文章
|
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中的拟合技术:揭示数据背后的模式
下一篇
无影云桌面