Python 中最常用的 4种股票价格移动平均方法(二)

news2024/9/28 11:12:55

一、简介

在本文中,我们重点关注一些小众但值得注意的移动平均方法。这些利基工具通常来自专门研究或开发用于解决非常特殊的交易场景。虽然不太主流,但它们提供了对市场动态的极其细致入微的见解。完整列表如下:

  • 第 1 部分 — 基本技术:简单移动平均线 (SMA)、指数移动平均线 (EMA)、加权移动平均线 (WMA)、双指数移动平均线 (DEMA)、三重指数移动平均线 (TEMA)、交易量调整移动平均线 (VAMA) 、自适应移动平均线(AMA 或 KAMA)、三角移动平均线(TMA)、赫尔移动平均线(HMA)
  • 第 2 部分 — 自适应和动态:分形自适应移动平均线 (FRAMA)、零滞后指数移动平均线 (ZLEMA)、可变指数动态平均线 (VIDYA)、Arnaud Legoux 移动平均线 (ALMA)、MESA 自适应移动平均线 (MAMA)、跟随自适应移动平均线 (FAMA)、自适应周期移动平均线、彩虹移动平均线、Wilders 移动平均线、平滑移动平均线 (SMMA)

  • 第 3 部分 — 高级加权:顾比多重移动平均线 (GMMA)、最小二乘移动平均线 (LSMA)、韦尔奇移动平均线或修正移动平均线、正弦加权移动平均线、中位数移动平均线、几何移动平均线、弹性成交量加权移动平均线 ( eVWMA)、正则指数移动平均线 (REMA)、抛物线加权移动平均线
  • 第 4 部分从利基市场到值得注意:Jurik 移动平均线 (JMA)、端点移动平均线 (EPMA)、Chande 移动平均线 (CMA)、谐波移动平均线、McGinley 动态、锚定移动平均线、Holt-Winters 移动平均线、过滤移动平均线, Kijun Sen(基线)

2.背景和Python实现

本节从理论和实践的角度探讨了这些方法。最终目标是提供一个基于 Python 的实现,让它们全部发挥作用。

2.1 尤里克移动平均线(JMA)

Jurik 移动平均线 (JMA) 由 Mark Jurik 开发。它因其流畅性和低延迟而受到赞誉,使其成为交易者的最爱。JMA 旨在通过提供密切跟踪价格走势的平滑曲线来实现两全其美。JMA 尤为独特,因为它会根据波动性和价格走势进行实时调整。

JMA 的精确公式和计算方法是专有的。然而,有一些可用的近似值,并且许多平台都提供 JMA 作为内置函数。出于我们的目的,并为了避免任何专有问题,我不会提供确切的公式,但会提供基于可用近似值和现有库的 Python 实现。

虽然许多移动平均线要求交易者在响应性和平滑性之间做出妥协,但 JMA 巧妙地规避了这一困境。它的适应性确保它与当前的价格走势保持密切联系,提供减少滞后的见解。

# Required Libraries
import yfinance as yf
import matplotlib.pyplot as plt
from pandas import Series
from numpy import average as npAverage
from numpy import nan as npNaN
from numpy import log as npLog
from numpy import power as npPower
from numpy import sqrt as npSqrt
from numpy import zeros_like as npZeroslike
from pandas_ta.utils import get_offset, verify_series

def jma(close, length=None, phase=None, offset=None, **kwargs):
    # Validate Arguments
    _length = int(length) if length and length > 0 else 7
    phase = float(phase) if phase and phase != 0 else 0
    close = verify_series(close, _length)
    offset = get_offset(offset)
    if close is None: return

    # Define base variables
    jma = npZeroslike(close)
    volty = npZeroslike(close)
    v_sum = npZeroslike(close)

    kv = det0 = det1 = ma2 = 0.0
    jma[0] = ma1 = uBand = lBand = close[0]

    # Static variables
    sum_length = 10
    length = 0.5 * (_length - 1)
    pr = 0.5 if phase < -100 else 2.5 if phase > 100 else 1.5 + phase * 0.01
    length1 = max((npLog(npSqrt(length)) / npLog(2.0)) + 2.0, 0)
    pow1 = max(length1 - 2.0, 0.5)
    length2 = length1 * npSqrt(length)
    bet = length2 / (length2 + 1)
    beta = 0.45 * (_length - 1) / (0.45 * (_length - 1) + 2.0)

    m = close.shape[0]
    for i in range(1, m):
        price = close[i]

        # Price volatility
        del1 = price - uBand
        del2 = price - lBand
        volty[i] = max(abs(del1),abs(del2)) if abs(del1)!=abs(del2) else 0

        # Relative price volatility factor
        v_sum[i] = v_sum[i - 1] + (volty[i] - volty[max(i - sum_length, 0)]) / sum_length
        avg_volty = npAverage(v_sum[max(i - 65, 0):i + 1])
        d_volty = 0 if avg_volty ==0 else volty[i] / avg_volty
        r_volty = max(1.0, min(npPower(length1, 1 / pow1), d_volty))

        # Jurik volatility bands
        pow2 = npPower(r_volty, pow1)
        kv = npPower(bet, npSqrt(pow2))
        uBand = price if (del1 > 0) else price - (kv * del1)
        lBand = price if (del2 < 0) else price - (kv * del2)

        # Jurik Dynamic Factor
        power = npPower(r_volty, pow1)
        alpha = npPower(beta, power)

        # 1st stage - prelimimary smoothing by adaptive EMA
        ma1 = ((1 - alpha) * price) + (alpha * ma1)

        # 2nd stage - one more prelimimary smoothing by Kalman filter
        det0 = ((price - ma1) * (1 - beta)) + (beta * det0)
        ma2 = ma1 + pr * det0

        # 3rd stage - final smoothing by unique Jurik adaptive filter
        det1 = ((ma2 - jma[i - 1]) * (1 - alpha) * (1 - alpha)) + (alpha * alpha * det1)
        jma[i] = jma[i-1] + det1

    # Remove initial lookback data and convert to pandas frame
    jma[0:_length - 1] = npNaN
    jma = Series(jma, index=close.index)

    # Offset
    if offset != 0:
        jma = jma.shift(offset)

    # Handle fills
    if "fillna" in kwargs:
        jma.fillna(kwargs["fillna"], inplace=True)
    if "fill_method" in kwargs:
        jma.fillna(method=kwargs["fill_method"], inplace=True)

    # Name & Category
    jma.name = f"JMA_{_length}_{phase}"
    jma.category = "overlap"

    return jma

# Fetch data
ticker_symbol = "AAPL"
data = yf.download(ticker_symbol, start="2020-01-01", end="2024-01-01")

# length
n = 28 

# Compute JMA
data['JMA'] = jma(data['Close'], length=n, phase=0)

# Plot
plt.figure(figsize=(20,7))
plt.title(f'{ticker_symbol} Stock Price and JMA (n = {n})', fontsize=16)
plt.plot(data['Close'], label='Stock Price', color='black', alpha=0.6)
plt.plot(data['JMA'], label='JMA', color='green', alpha=0.8)
plt.legend(loc='upper left')
plt.grid(True, alpha=0.3)
plt.xlabel('Date', fontsize=14)
plt.ylabel('Price', fontsize=14)
plt.show()

图 1: Apple Inc. (AAPL) 2020 年至 2023 年股价,辅以使用 14 天周期和 0 相位的 Jurik 移动平均线 (JMA)。JMA 以其自适应功能而闻名,可提供高效的平滑价格数据,同时对市场变动做出反应。

2.2 端点移动平均线(EPMA)

端点移动平均线(EPMA)是一种修改后的简单移动平均线,它通过计算数据集的线性回归趋势线并使用该趋势线的端点作为移动平均线,更加强调最新的数据。

其基本原理是,这种方法将更好地捕捉价格序列中的主导趋势,并提供比简单移动平均线更准确的表示。

要计算周期n的 EPMA ,步骤如下:

  1. 计算过去n 个收盘价的线性回归趋势线。
  2. 使用回归线的端点作为该期间的 EPMA。

线性回归线的公式为

方程 2.2.1。线性回归:用于计算一段时间内“n”个收盘价的趋势线,作为终点移动平均线 (EPMA) 的基础。

在哪里:

  • m是直线的斜率。
  • xt​是时间t的 x 坐标(通常表示第一个点为 1,第二个点表示为 2,依此类推)。
  • c是 y 轴截距。

终点是当xt ​= n时,所以

方程 2.2.2。EPMA:当xt ​= n时线性回归线的 y 坐标。与传统 SMA 相比,该端点更能集中地体现当前趋势。

EPMA 旨在通过关注趋势的终点,比传统 SMA 更有效地捕捉当前趋势的本质。它强调最新数据,可能比传统 SMA 更有效地捕捉主导市场趋势。

它对趋势终点的关注使其在波动的市场阶段特别有价值,可以将真正的趋势转变与市场噪音区分开来。对于交易者来说,上升趋势的 EPMA 可以预示看涨势头,而下降趋势可能暗示看跌状况。

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt

def calculate_EPMA(prices, period):
    epma_values = []
    
    for i in range(period - 1, len(prices)):
        x = np.arange(period)
        y = prices[i-period+1:i+1]
        
        slope, intercept = np.polyfit(x, y, 1)
        epma = slope * (period - 1) + intercept
        
        epma_values.append(epma)
        
    return [None]*(period-1) + epma_values  # Pad with None for alignment

# Fetching data
ticker_symbol = "DIS"
data = yf.download(ticker_symbol, start="2020-01-01", end="2024-01-01")
close_prices = data['Close'].tolist()

# Calculate EPMA
epma_period = 28
data['EPMA'] = calculate_EPMA(close_prices, epma_period)

# Plotting
plt.figure(figsize=(20,7))
plt.plot(data.index, data['Close'], label=f'{ticker_symbol} Price', color='black')
plt.plot(data.index, data['EPMA'], label=f'EPMA {epma_period}', color='green')
plt.title(f'End Point Moving Average of {ticker_symbol} (n = {epma_period})')
plt.legend()
plt.grid()
plt.show()

图 2. 2020 年至 2023 年华特迪士尼公司 (DIS) 的端点移动平均线 (EPMA):该图显示 DIS 的股价(黑线)及其 14 天 EPMA(绿线)。EPMA 基于线性回归计算,提供了了解价格趋势的独特方法。

2.3 钱德移动平均线(CMA)

钱德移动平均线 (CMA) 是由 Tushar Chande 开发的一种移动平均线。它与常见的简单移动平均线 (SMA) 不同,因为 SMA 在计算中仅考虑收盘价,而 CMA 则认为该期间内的所有价格都是相等的。钱德移动平均线将累计价格相加,然后除以累计价格数量。

方程 2.3.1。钱德移动平均线 (CMA) 的公式:由 Tushar Chande 提出,CMA 与传统 SMA 的区别在于将其周期内的每个价格视为相等

在哪里:

  • CMA_t​是时间t的钱德移动平均线。
  • Price_i​是时间i的价格。

在交易中,钱德移动平均线 (CMA) 为价格变动提供了独特的视角,特别解决了过度依赖收盘价的潜在偏差。通过对同一时期内的每个价格给予同等的权重,CMA 促进了对市场活动的更全面的了解。这种包容性的方法在日内波动较大的市场或当收盘价可能容易受到人为操纵或日终交易异常的影响时尤其有利。

对于交易者来说,使用 CMA 可以更清晰地了解潜在趋势,并减少被不反映更广泛市场情绪的不稳定价格上涨或下跌误导的可能性。从本质上讲,CMA 是一种更民主地知情交易决策的工具,确保没有单一价格点过度影响感知趋势。

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt

def calculate_CMA(prices):
    cumsum = np.cumsum(prices)
    cma = cumsum / (np.arange(len(prices)) + 1)
    return cma

# Fetching data
ticker_symbol = "KO"
data = yf.download(ticker_symbol, start="2020-01-01", end="2024-01-01")

# Calculate CMA
cma_period = len(data['Close'])
data['CMA'] = calculate_CMA(data['Close'])

# Plotting
plt.figure(figsize=(20,7))
plt.plot(data.index, data['Close'], label='Price', color='black')
plt.plot(data.index, data['CMA'], label='CMA', color='blue')
plt.title(f'Chande Moving Average (CMA) of {ticker_symbol}')
plt.legend()
plt.grid()
plt.show()

图 3. KO 的钱德移动平均线 (CMA)(2020-2023 年):CMA 本质上是收盘价的累积总和除以天数,因此它是考虑所有先前数据的移动平均线。图中显示了 Apple 的股价(黑色)和 CMA(蓝色)。CMA 给出了 AAPL 自成立以来的整体价格轨迹的平滑表示。

2.4 谐波移动平均线

谐波移动平均线是一种应用调和平均公式的移动平均线。与对数值之和进行平均的算术平均值不同,调和平均值是倒数的算术平均值的倒数。

它为较低的值提供比较高的值更多的权重。由于其独特的计算方式,HMA 可能会提供对价格趋势的不同见解,特别是当价格呈现特定模式或节奏时。

给定n 个周期的一系列价格p 1​, p 2​,…, pn ​:

方程 2.4.1。调和移动平均线 (HMA) 公式:利用调和平均公式,HMA 通过应用倒数算术平均值的倒数来强调较低值而不是较高值。

对于交易者来说,谐波移动平均线 (HMA) 是一种有趣的工具,它强调价格较低的时期,可能比其他移动平均线更明显地突出买入机会或支撑位。这种独特的权重在价格回撤和盘整构成当前趋势重要组成部分的市场中尤其有用。

当与其他指标一起应用时,HMA 可以帮助识别价值期或抑价期。此外,在价格突然上涨可能会影响其他平均水平的波动市场中,HMA 保持相对稳定,更多地关注持续较低的价格点。

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt

def calculate_HMA(prices, window):
    hma_values = []
    for i in range(len(prices)):
        if i < window - 1:
            hma_values.append(np.nan)
        else:
            subset_prices = prices[i - window + 1: i + 1]
            harmonic_mean = window / np.sum([1/p for p in subset_prices])
            hma_values.append(harmonic_mean)
    return hma_values

# Fetching data
ticker_symbol = "MSFT"
data = yf.download(ticker_symbol, start="2020-01-01", end="2024-01-01")

# Calculate HMA
hma_period = 20
data['HMA'] = calculate_HMA(data['Close'], hma_period)

# Plotting
plt.figure(figsize=(20,7))
plt.plot(data.index, data['Close'], label='Price', color='black')
plt.plot(data.index, data['HMA'], label=f'HMA {hma_period}', color='blue')
plt.title(f'Harmonic Moving Average (HMA) of {ticker_symbol} (n = {hma_period})')
plt.legend()
plt.grid()
plt.show()

图 4. MSFT 的谐波移动平均线 (HMA)(2020-2023):HMA 由前 n 天收盘价倒数的算术平均值的倒数得出。对于此可视化,我们采用了 20 天的窗口。该图表显示了微软的股价(以黑色表示)与其 HMA(以蓝色表示)并列。HMA 通过对数据集中距离算术平均值更远的值给予更大的权重,提供对股票价格趋势的洞察,与传统平均值相比,提供了独特的视角。

2.5 麦金利动态

McGinley 动态移动平均线由 John R. McGinley 于 1990 年推出。它的设计目的是比其他移动平均线更能响应基础数据系列。其公式确保在快速变化的市场中更紧密地跟踪价格,并在变化较慢的市场中最大限度地减少价格分离。目标是避免市场波动,同时仍对市场趋势做出快速反应。

麦金利动态计算如下:

方程 2.5.1。麦金利动态移动平均线公式:这种先进的移动平均线公式由约翰·R·麦金利 (John R. McGinley) 提出,旨在通过最小化快速市场中的滞后并减少较慢趋势中的分离来更有效地跟踪价格。

在哪里:

  • MD是麦金利动态值。
  • 价格是当前价格。
  • N是一个常数(通常与用于移动平均值的值相同,例如每日数据的 14 天)。

在交易领域,麦金利动态由于其自我调整机制而比传统移动平均线具有明显的优势。计算方法本质上考虑了市场变化的速度,使其更能适应实时条件。

这意味着交易者可以对 McGinley Dynamic 生成的信号更有信心,因为它不太可能产生错误信号或落后价格太远。无论市场速度如何,其密切跟踪资产价格的独特行为对于旨在利用短期价格差异的交易者来说可能是一个福音。

import yfinance as yf
import matplotlib.pyplot as plt

def calculate_mcginley_dynamic(prices, n):
    MD = [prices[0]]
    for i in range(1, len(prices)):
        md_value = MD[-1] + (prices[i] - MD[-1]) / (n * (prices[i] / MD[-1])**4)
        MD.append(md_value)
    return MD

# Fetching data
ticker_symbol = "AAPL"
data = yf.download(ticker_symbol, start="2020-01-01", end="2024-01-01")

# Calculate McGinley Dynamic
n = 14
data['McGinley Dynamic'] = calculate_mcginley_dynamic(data['Close'].tolist(), n)

# Plotting
plt.figure(figsize=(20,7))
plt.plot(data.index, data['Close'], label='Price', color='black')
plt.plot(data.index, data['McGinley Dynamic'], label=f'McGinley Dynamic {n}', color='blue')
plt.title(f'McGinley Dynamic of {ticker_symbol} (n={n})')
plt.legend()
plt.grid()
plt.show()

图 5. AAPL 的 McGinley Dynamic(2020-2023 年):McGinley Dynamic 旨在最大限度地减少滞后,适应 Apple 股价的快速变化。该图表显示了 14 天的时间段,将苹果的股价(黑色)与其麦金利动态(蓝色)进行了对比,展示了更平滑的价格走势。

2.6 锚定移动平均线

锚定移动平均线 (AMA) 是一种独特类型的移动平均线,它不是从系列中的第一个数据点开始计算,而是从特定的“锚定”点开始计算,通常是重要事件日期(例如,市场底部、突破、新闻发布等)。通过锚定移动平均线,重点在于该事件的重要性及其与价格走势的持续相关性。

公式:
AMA 的计算本质上是从锚定日期开始的简单移动平均线 (SMA):

方程 2.6.1。锚定移动平均线 (AMA) 的公式:AMA 通过从“锚定”点开始计算,对数据系列中的特定事件赋予重要性。

在哪里:

  • AMAt​是时间t的锚定移动平均线。
  • 价格表示资产的价格。
  • 锚定是锚定的时期。

锚定移动平均线通过强调特定事件,为交易者提供了一个观察价格相对于该重大事件如何演变的视角。收益公告、监管变化或宏观经济数据发布等事件可能会极大地改变市场情绪,AMA 会持续提醒该事件的市场影响。通过关注此类关键时刻的后果,交易者可以深入了解市场随时间对该事件的看法。

例如,如果在积极的盈利发布后价格持续保持在 AMA 上方,则表明持续的看涨情绪。相反,如果重大新闻事件发生后价格跌破 AMA,则可能表明普遍看跌观点。如果明智地使用,AMA 可以作为参考点,帮助交易者根据过去的重大事件了解最近的价格走势。

import yfinance as yf
import matplotlib.pyplot as plt
from matplotlib.dates import date2num
from datetime import datetime

def calculate_AMA(prices, anchor_date):
    try:
        anchor_idx = data.index.get_loc(anchor_date)
    except KeyError:
        # If the exact date is not found, find the nearest available date
        anchor_date = data.index[data.index.get_loc(anchor_date, method='nearest')]
        anchor_idx = data.index.get_loc(anchor_date)

    AMA = []

    for i in range(len(prices)):
        if i < anchor_idx:
            AMA.append(None)
        else:
            AMA.append(sum(prices[anchor_idx:i+1]) / (i - anchor_idx + 1))

    return AMA
# Fetching data
ticker_symbol = "SIE.DE"
data = yf.download(ticker_symbol, start="2020-01-01", end="2024-01-01")

# Define the anchor date
anchor_date = "2021-01-01"
anchor_date_num = date2num(datetime.strptime(anchor_date, '%Y-%m-%d'))

# Calculate AMA
data['AMA'] = calculate_AMA(data['Close'].tolist(), anchor_date)

# Plotting
plt.figure(figsize=(20,7))
plt.plot(data.index, data['Close'], label='Price', color='black')
plt.plot(data.index, data['AMA'], label='Anchored MA', color='red')
plt.axvline(x=anchor_date_num, color='blue', linestyle='--', label='Anchor Date')
plt.title(f'Anchored Moving Average (AMA) of {ticker_symbol}')
plt.legend()
plt.grid()
plt.show()

图 6. SAP.DE (2020–2023) 的锚定移动平均线 (AMA):AMA 从特定“锚定”日期开始计算,而不是滚动窗口。它将从该锚点到现在的所有数据进行平均。该图展示了 SAP 的股价(黑色)与其 AMA(红色),从蓝色虚线锚定日期开始。AMA 提供自重大事件或选定锚定日期以来价格趋势的见解。

2.7 霍尔特-温特斯移动平均线

Holt-Winters 方法包含三个方程:一个用于水平,一个用于趋势,一个用于季节性。每个方程都有一个平滑参数(alpha、beta、gamma),用于控制最近观察的权重。

级别 — 这是系列中的平均值。

方程 2.7.1。捕获平均值:水平(Lt)反映了时间序列的集中趋势,表示其平均值。平滑参数α确定最近观察的权重。

趋势 — 这是系列中增加或减少的值。

方程 2.7.2。检测方向变化:趋势 ( Tt ) 识别时间序列中随时间的一致向上或向下运动。它受到平滑参数β的影响,该参数考虑了最近的趋势演变。

季节性——这是系列中重复的短期周期。

方程 2.7.3。突出短期周期:季节性 ( St ) 表示在固定间隔内(通常在一年内)重复发生的周期性波动。它对最近循环模式的强调由平滑参数γ控制。

预报:

方程 2.7.4。预测未来值:该方程使用已确定的水平、趋势和季节性来预测时间序列的未来值。参数k指定预测提前了多少个周期。

在哪里:

  • Lt​是时间t时的水平。
  • Tt​是时间t的趋势。
  • St​是时间t的季节性。
  • Yt​是时间t的实际值。
  • m是季节数。
  • αβγ分别是水平、趋势和季节性的平滑参数。
  • k是您要预测的未来周期数。

霍尔特温特斯与更基本的移动平均线的区别在于它能够动态适应趋势和季节性的变化。这种适应性正是它在时间序列数据表现出明显季节性模式的场景中受到青睐的原因,例如假期期间达到峰值的零售额或随季节变化的能源消耗。

应用 Holt-Winters 时,交易者和分析师应谨慎调整平滑参数 α、β 和 γ。这些参数决定了估计值对序列水平、趋势和季节性最近变化的响应程度。通过优化这些参数,可以在响应性和平滑性之间取得平衡。

import yfinance as yf
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing

# Fetching data
ticker_symbol = "INTC"
data = yf.download(ticker_symbol, start="2020-01-01", end="2024-01-01")

# Fit the Holt-Winters model
model = ExponentialSmoothing(data['Close'], trend='add', seasonal='add', seasonal_periods=12)
fit = model.fit()

# Calculate HWMA
data['HWMA'] = fit.fittedvalues

# Plotting
plt.figure(figsize=(20,7))
plt.plot(data.index, data['Close'], label='Price', color='black')
plt.plot(data.index, data['HWMA'], label='HWMA', color='red')
plt.title(f'Holt-Winters Moving Average (HWMA) of {ticker_symbol}')
plt.legend()
plt.grid()
plt.show()

图 7. INTC 的 Holt-Winters 移动平均线 (HWMA)(2020-2023 年):HWMA(红色)采用指数平滑技术,考虑趋势和季节性,来描述 INTC 的股价变动。它根据实际收盘价(黑色)显示,提供对股票表现的基本趋势和潜在季节性的洞察。

2.8 过滤移动平均线

过滤移动平均线背后的概念是使用过滤机制(如数字或模拟过滤器)来消除数据集中的某些频率。这有助于强调特定频段(例如趋势),同时消除噪音。

FMA 定义为:

方程 2.8.1。强调趋势,减少噪音:过滤移动平均线 (FMA) 集成了一个过滤器机制,可以优先考虑某些频率,使其能够强调特定趋势并减少不需要的噪音。应用的权重w ( i ) 由所选滤波器的类型决定,而n表示移动平均周期。

在哪里:

  • P ( t − i ) 是时间t − i的价格。
  • w ( i ) 是时间t − i时价格的权重。具体权重取决于所应用的过滤器。
  • n是移动平均线的周期。

过滤移动平均线(FMA)旨在强调数据集中的特定频段,有效增强潜在趋势的清晰度并减少短期波动的影响。这种方法通过减轻市场噪音的影响而提供了分析优势,市场噪音可能会掩盖真实的市场走势。

FMA 对优先频率的重视有助于区分市场情绪的实际变化和瞬态市场事件。FMA 的有效性取决于选择合适的滤波器和正确的周期 (n)。通过细化这些参数以匹配数据集的具体性质和战略目标,FMA 可以提供有关市场动态的更精确和可操作的见解。

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt

def filtered_moving_average(prices, n=14):
    # Define filter weights (for simplicity, we'll use equal weights similar to SMA)
    w = np.ones(n) / n
    return np.convolve(prices, w, mode='valid')

# Fetching data
ticker_symbol = "MCD"
data = yf.download(ticker_symbol, start="2020-01-01", end="2024-01-01")

fma_period = 14
fma_values = filtered_moving_average(data['Close'].values, fma_period)
data['FMA'] = np.concatenate([np.array([np.nan]*(fma_period-1)), fma_values])

# Plotting
plt.figure(figsize=(20,7))
plt.plot(data.index, data['Close'], label='Price', color='black')
plt.plot(data.index, data['FMA'], label=f'Filtered MA {fma_period}', color='red')
plt.title(f'Filtered Moving Average (FMA) of {ticker_symbol} (n = {fma_period})')
plt.legend()
plt.grid()
plt.show()

图 8. MCD (2020–2023) 的过滤移动平均线 (FMA):FMA(红色)本质上是一个简单的移动平均线,通过使用过滤器(在本例中为简单的等权重过滤器)进行了增强,以更好地强调某些数据特征。当根据麦当劳股票的实际收盘价(黑色)绘制时,FMA 可以更平滑地表示给定时期内的价格趋势,从而更容易辨别潜在的模式和走势。可以调整过滤器的选择以强调数据中的特定模式或特征。

2.9 Kijun Sen(基线)

Kijun Sen 也称为基线,代表特定时期(通常为 26 个时期)内最高点和最低点的中点。在 Ichimoku Cloud 设置中,Kijun Sen 有多种用途:

  1. 趋势指标:如果价格高于 Kijun Sen,则表明上升趋势,如果价格低于 Kijun Sen,则表明下降趋势。
  2. 支撑和阻力:Kijun Sen 充当支撑和阻力的动态水平。
  3. 买入或卖出信号:当移动速度较快的 Tenkan Sen(转换线)穿过 Kijun Sen 上方时,被视为看涨信号;当其穿过 Kijun Sen 下方时,则被视为看跌信号。

方程 2.9.1。Kijun Sen 或基线代表通常选择的 26 个周期跨度内的最高高点和最低低点之间的平衡

Kijun Sen 是 Ichimoku 云交易系统的一个组成部分,由于其多功能属性,在技术分析中具有非常重要的地位。它被计算为选定时间范围内最高点和最低点的中点,它本质上具有自我调整的性质,反映市场均衡和市场情绪的明确晴雨表。

此外,由于它对价格变动动态起作用,因此其提供实时支撑和阻力水平的能力对于进入和退出决策至关重要。从战略上讲,识别 Kijun Sen 和 Tenkan Sen 之间的交叉点可以帮助确定动量变化,从而指导交易策略。

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt

def calculate_kijun_sen(data, period=26):
    # Determine the highest high and the lowest low for the given period
    high_prices = data['High'].rolling(window=period).max()
    low_prices = data['Low'].rolling(window=period).min()

    # Calculate Kijun Sen (Base Line)
    kijun_sen = (high_prices + low_prices) / 2
    return kijun_sen

# Fetching data
ticker_symbol = "WMT"
data = yf.download(ticker_symbol, start="2020-01-01", end="2024-01-01")

# Calculate Kijun Sen
data['Kijun Sen'] = calculate_kijun_sen(data)

# Plotting
plt.figure(figsize=(20,7))
plt.plot(data.index, data['Close'], label='Price', color='black')
plt.plot(data.index, data['Kijun Sen'], label='Kijun Sen (Base Line)', color='blue')
plt.title(f'Kijun Sen (Base Line) of {ticker_symbol}')
plt.legend()
plt.grid()
plt.show()

图 9. AAPL 的 Kijun Sen(基线)(2020-2023 年):Kijun Sen(蓝色)代表 26 个典型周期内最高点和最低点之间的平衡点。当根据苹果股票的实际收盘价(黑色)绘制时,Kijun Sen 充当动态参考线。高于 Kijun Sen 可能表明上升趋势,而低于 Kijun Sen 可能表明潜在的下降趋势。

3. 应用与见解

利基移动平均线技术为交易者提供了独特的市场视角,挑战他们超越传统范式的思考。例如,麦金利动态移动平均线有望成为最可靠的移动平均线,强调了对交易准确性的追求。

另一方面,霍尔特-温特斯移动平均线提供了一种预测方法,有助于预测分析。它结合使用指数平滑和季节性调整来生成对未来价格变动的预测。这使其成为寻求识别和利用市场趋势的交易者的宝贵工具。

以下是如何在交易中使用利基移动平均线技术的一些具体示例:

  • 麦金利动态移动平均线可用于识别趋势和反转。它对于识别支撑位和阻力位也很有用。
  • 霍尔特-温特斯移动平均线可用于生成对未来价格变动的预测。它还可用于识别市场的季节性模式。

4. 结论

每个交易者都配备了一套技术,虽然传统工具奠定了基础,但利基移动平均线通常会微调策略以接近完美。这些专业平均线因其适应性强且不易受错误信号影响而在波动的市场中表现出色,可提供独特的市场洞察。然而,它们也很复杂:复杂的计算和参数设置。

对于那些准备深入研究的人来说,这些利基技术有望增强市场理解、更好的策略制定和精细的风险管理。然而,它们并不能保证成功。当与健全的策略、情感纪律和强大的风险管理相结合时,他们的真正潜力就会被释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型部署手记(11)LLaMa2+Chinese-LLaMA-Plus-2-7B+Windows+llama.cpp+中文对话

1.简介&#xff1a; 组织机构&#xff1a;Meta&#xff08;Facebook&#xff09; 代码仓&#xff1a;GitHub - facebookresearch/llama: Inference code for LLaMA models 模型&#xff1a;LIama-2-7b-hf、Chinese-LLaMA-Plus-2-7B 下载&#xff1a;使用huggingface.co和百…

微软放大招!Bing支持DALL-E3,免费AI绘画等你来体验!

最近 OpenAI 发布了DALL-E3模型&#xff0c;出图效果和Midjourney不相上下&#xff0c;不过要使用它有些门槛&#xff0c;必须是 ChatGPT Plus 账户&#xff0c;而且还要排队&#xff0c;怎么等都等不到&#xff0c;搞得大家都比较焦虑。 不过现在微软在Bing上也支持 DALL-E3 …

Excel恢复科学技术法显示的数据

Excel中输入位数较大的数据时&#xff0c;软件会自动使用科学计数法显示。很多时候并不需要这样的计数格式&#xff0c;所以需要把它转变为普通的数字格式 操作方法 选中单元格/列/行》右键》设置单元格式 在打开的窗口中&#xff0c;切换到“数字”选项卡&#xff0c;点击“自…

第四章 图表样式美化

第四章 图表样式美化 1.图表样式概述 1.1.默认图表样式 ​ matplotlib在绘图的过程中会读取存储在本地的配置文件matplotlibrc&#xff0c;通过matplotlibrc文件中的缺省配置信息指定图表元素的默认样式&#xff0c;完成图表元素样式的初始设置。 ​ matplotlib文件包含众多…

springboot单独在指定地方输出sql

一般线上项目都是将日志进行关闭&#xff0c;因为mybatis日志打印&#xff0c;时间长了&#xff0c;会占用大量的内存&#xff0c;如果我想在我指定的地方进行打印sql情况&#xff0c;怎么玩呢&#xff01; 下面这个场景&#xff1a; 某天线上的项目出bug了&#xff0c;日志打印…

Keil软件仿真的方法: μVision2调试器

目录 1. μVision2调试器2. 调试工具3. 单步调试4. 使用断点调试5. 使用监视窗口调试6. 调试按钮的功能1&#xff0e;“单步”按钮2&#xff0e;“跟踪”按钮3&#xff0e;“运行到退出”按钮4&#xff0e;“运行到光标行”按钮 参考资料 软件仿真是利用PC的CPU来模拟单片机的运…

鸿蒙API9手机号验证

鸿蒙API9手机号验证 做一个app用户认证&#xff0c;之前一直想着都是通过HMS Core里边来接入&#xff0c;但是里边的文档最高只支持到API7。 由于想直接用API9来接&#xff0c;毕竟感觉后续ts/java混合开发要被舍弃&#xff0c;尽量还是用新的来弄。看了一遍新的API9的文档&am…

The-MIFARE-Hack-1 -mifare技术

RFID卡的使用变得越来越普遍。 一般来说&#xff0c;使用两种类型的RFID卡&#xff1a;有源卡和无源卡。 主动系统有自己的能源&#xff0c;而被动系统则依赖读卡器提供的能量。 最常见的 RFID 卡之一是 MIFARE Classic&#xff0c;由 NXP Semiconductors&#xff08;以前是 Ph…

如何强化九小场所安全检查隐患排查工作

九小场所与人们的日常生活息息相关&#xff0c;相关部门对这些场所的消防安全非常重视&#xff1b;但是由于各种原因&#xff0c;经营者安全意识薄弱&#xff0c;导致存在严重的安全隐患。凡尔码开发的九小场所巡检系统针对九小场所基数大、底数不清、责任不明、主体意识薄弱等…

Python大数据之Python进阶(六)多线程的使用

文章目录 多线程的使用1. 导入线程模块2. 线程类Thread参数说明3. 启动线程4. 多线程完成多任务的代码5. 小结 线程执行带有参数的任务1. 线程执行带有参数的任务的介绍2. args参数的使用3. kwargs参数的使用4. 小结 线程的注意点1. 线程的注意点介绍2. 线程之间执行是无序的3.…

5.编写程序 超强力方法

5.1 创建战舰游戏 创建一个类似战舰的游戏&#xff1a;攻击网站 有一种棋盘类的战舰游戏&#xff0c;目标是要猜测对方战舰的坐标&#xff0c;然后轮流开炮攻击&#xff0c;命中数发就可以打沉对方的战舰。不过我们不喜欢战争&#xff0c;只要打垮这些达康公司就好(因为与商业…

10.10为什么要用二进制

由选择器引发的疑问与思考 &#xff1f;想的是就让每位表示得越多&#xff0c;不就越能节省空间开销&#xff0c;从而不需要那么多的位数&#xff1f; 状态总量为S,R进制的N位数有SR*N&#xff0c; 表示当前这个位数的进制数所能表示最多的状态总量 客观存在的数量在不同进制…

springcloud----检索中间件 ElasticSearch 分布式场景的运用

如果对es的基础知识有不了解的可以看 es看这个文章就会使用了 1.分布式集群场景下的使用 单机的elasticsearch做数据存储&#xff0c;必然面临两个问题&#xff1a;海量数据存储问题、单点故障问题。 海量数据存储问题&#xff1a;将索引库从逻辑上拆分为N个分片&#xff08…

【opencv】windows10下opencv4.8.0-cuda版本源码编译教程

【opencv】windows10下opencv4.8.0-cuda版本源码编译教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【opencv】windows10下opencv4.8.0-cuda版本源码编译教程前言准备工具cuda/cudnncmakeopencv4.5.0opencv_contrib CMake编译VS2019编译可…

Hadoop2.0探讨

文章目录 8. Hadoop 再探讨8.1 Hadoop的优化与发展8.2 HDFS 的FA和Federation(Hadoop2.0新特性)8.2.1 HDFS HA8.2.2 HDFS Federation 8.3 YARN8.3.1 MapReduce1.0的缺陷8.3.2 Yarn设计思路8.3.3 Yarn体系结构8.3.4 Yarn工作流程8.3.5 Yarn框架和MapReduce1.0框架对比分析8.3.6 …

C# Onnx GFPGAN GPEN-BFR 人像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace 图像修复 {public partial class Form1 : For…

MAX17058_MAX17059 STM32 iic 驱动设计

本文采用资源下载链接&#xff0c;含完整工程代码 MAX17058-MAX17059STM32iic驱动设计内含有代码、详细设计过程文档&#xff0c;实际项目中使用代码&#xff0c;稳定可靠资源-CSDN文库 简介 MAX17058/MAX17059 IC是微小的锂离子(Li )在手持和便携式设备的电池电量计。MAX170…

MTK8183/MT8183安卓4G核心板_联发科安卓手机开发板主板方案定制

MediaTek MT8183 整合先进功能和 AI 的主流 Chromebook 平台 MTK8183又称为MediaTek Kompanio 500&#xff0c;是一款支持强大功能的Chromebook平台&#xff0c;结合多种高功能硬件于单一高效能芯片。支持连接选项包括 Wi-Fi、蓝芽和 GNSS&#xff0c;外围设备可选择连接 USB …

Flutter 直接调用so动态库,或调用C/C++源文件内函数

开发环境 MacBook Pro Apple M2 Pro | macOS Sonoma 14.0 Android Studio Giraffe | 2022.3.1 Patch 1 XCode Version 15.0 Flutter 3.13.2 • channel stable Tools • Dart 3.1.0 • DevTools 2.25.0 先说下历程&#xff0c;因为我已经使用了Flutter3的版本&#xff0c;起初…

【考研408真题】2022年408数据结构41题---判断当前顺序存储结构树是否是二叉搜索树

文章目录 思路408考研各数据结构C/C代码&#xff08;Continually updating&#xff09; 思路 很明显&#xff0c;这是一个顺序存储结构的树的构成方法。其中树的根节点位置从索引0开始&#xff0c;对于该结构&#xff0c;存在有&#xff1a;如果当前根节点的下标为n&#xff0c…