📜  移动平均线 python (1)

📅  最后修改于: 2023-12-03 15:11:26.053000             🧑  作者: Mango

移动平均线 Python

移动平均线是一种技术分析中广泛使用的指标之一,用于平滑价格数据,以便更好地观察趋势。Python提供了各种工具,可用于计算和绘制移动平均线,包括NumPy,Pandas和Matplotlib库。

基础概念

移动平均线是平均价格的一种表示形式,通过将过去一定时间内的价格取平均值来计算。例如,如果我们想要计算3天移动平均线,则需要将最近的3个交易日的收盘价加起来,然后除以3得到平均值。每个新的交易日,我们将最早的收盘价移除,加入新的收盘价,再计算平均值。这样就得到了一条平滑的线,可以表示价格趋势。

简单移动平均线(SMA)

简单移动平均线是最基本的移动平均线类型,可以通过以下公式来计算:

$SMA = \frac{\sum_{i=1}^{n}P_i}{n}$

其中,$n$表示时间周期,$P_i$表示第$i$个时间周期的价格。在Python中,我们可以使用NumPy或Pandas库来计算SMA。

NumPy实现SMA
import numpy as np

def sma(close, period):
    return np.convolve(close, np.ones((period,))/period, mode='valid')

上面的代码使用了NumPy中的convolve函数来计算SMA。close是一个包含价格数据的向量,period是移动平均线的时间周期。在convolve函数中,我们使用一个由1组成的向量除以时间周期,这样可以计算出加权平均。mode参数设置为'valid',这样可以丢弃最开始的几个数据,因为无法计算出完整的移动平均线。返回的结果是一个包含SMA值的向量。

Pandas实现SMA
import pandas as pd

def sma(close, period):
    return close.rolling(period).mean()

上面的代码使用了Pandas中的rolling函数来计算SMA。close是一个包含价格数据的Series,period是移动平均线的时间周期。rolling函数定义了rolling window,然后将其应用于close Series。mean函数会计算每个window中的平均值。返回的结果是一个包含SMA值的Series。

指数移动平均线(EMA)

指数移动平均线是一种根据赋予不同的权重来计算平均值的移动平均线。最近的价格会被赋予更高的权重,使EMA更敏感于价格变化。EMA可以通过以下公式来计算:

$EMA_t = \alpha * P_t + (1 - \alpha) * EMA_{t-1}$

其中,$P_t$表示第$t$时间周期的价格,$EMA_{t-1}$表示上一个时间周期的EMA值,$\alpha$是平滑系数,可用于控制加权平均。

NumPy实现EMA
import numpy as np

def ema(close, period, alpha=None):
    if alpha is None:
        alpha = 2 / (period + 1)
    weights = np.exp(np.linspace(-1*alpha, 0, period))
    weights /= weights.sum()
    ema = np.convolve(close, weights, mode='full')[:len(close)]
    ema[:period-1] = np.nan
    return ema

上面的代码使用了NumPy中的exp函数和linspace函数来计算EMA。close是一个包含价格数据的向量,period是移动平均线的时间周期,alpha是平滑系数。如果没有提供alpha,则使用默认值。weights向量由指数函数计算得出,可以用于计算加权平均。convolve函数可以将weights向量应用于close向量进行加权平均,mode参数设置为'full',这样可以使结果长度与close向量长度相同。最后,将未计算出的部分设为NaN,返回EMA向量。

Pandas实现EMA
import pandas as pd

def ema(close, period, alpha=None):
    return close.ewm(span=period, alpha=alpha, adjust=False).mean()

上面的代码使用了Pandas中的ewm函数来计算EMA。close是一个包含价格数据的Series,period是移动平均线的时间周期,alpha是平滑系数。ewm函数会根据提供的span或alpha参数来计算EMA,adjust参数设置为False,表示不进行数据修正。返回的结果是一个包含EMA值的Series。

绘制移动平均线

我们可以使用Matplotlib库来绘制移动平均线。下面的代码片段演示了如何绘制一个包含SMA和EMA的价格图表。

import matplotlib.pyplot as plt

# 加载价格数据
prices = pd.read_csv('prices.csv')
close = prices['close']

# 计算SMA和EMA
sma20 = sma(close, 20)
ema50 = ema(close, 50)

# 绘制价格和移动平均线
fig, ax = plt.subplots()
ax.plot(close, label='Price')
ax.plot(sma20, label='SMA(20)')
ax.plot(ema50, label='EMA(50)')
ax.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Price')
ax.set_title('Price and Moving Averages')
plt.show()

上面的代码假设我们已经从文件'prices.csv'中加载了价格数据,并将其存储在一个名为close的Series中。然后,我们使用sma和ema函数来计算SMA和EMA向量,分别对应20天和50天的移动平均线。最后,我们使用Matplotlib库中的plot函数来绘制价格数据和移动平均线,使其图例可见,并设置标签和标题。显示图表使用plt.show()函数。

总结

移动平均线是一种有用的技术指标,用于平滑价格数据以便于观察趋势。Python提供了各种工具,包括NumPy,Pandas和Matplotlib库,可以用于计算和绘制移动平均线。简单移动平均线和指数移动平均线是两种常用的移动平均线类型。我们可以根据特定的要求选择适合自己的技术指标。