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