1.问题场景
- 目的
简单预测当前wireless network environment bandwidth。 - 方法
采用 MACD 。
参考文献 《Efficient Short - form Video Streaming: An Integration of Dynamic Bitrate Adaptation and Predictive Segment Preloading》,July 2024。作者Nguyen Hong Lich 等人
2.文献介绍
3. 网络资源
DIF 线
MACD线(DIF,快线)=12日移动平均线(EMA) - 26日移动平均线(EMA)
DEA 线
信号线(DEA,慢线)=MACD线的9日移动平均线(EMA)
MACD直方图
柱状图(MACD直方图)= MACD线-信号线
MACD指标用法
MACD指标一般有两种用法,分别是交叉策略、背驰策略。
4.Python实现
这里只计算MACD的各个指标,并画出图形。暂不涉及 real-world wireless bandwidth estimation。目的是为了先了解 MACD基础知识。
我的这个stock.csv文件里的数据是任意随便输入的,没有一点依据和规律性质,只是为了凑数运行代码。
代码
import pandas as pd
import matplotlib.pyplot as plt
def calculate_macd(data, close_col='Close'):
"""
计算MACD指标
:param data: DataFrame,包含股票价格数据的DataFrame
:param close_col: str,股票收盘价的列名
:return: DataFrame,包含MACD, DIF (MACD Line), DEA (Signal Line)的DataFrame
"""
# 计算12日EMA
ema12 = data[close_col].ewm(span=12, adjust=False).mean()
# 计算26日EMA
ema26 = data[close_col].ewm(span=26, adjust=False).mean()
# 计算MACD
# MACD线(DIF,快线)=12日移动平均线(EMA) - 26日移动平均线(EMA)
dif = ema12 - ema26
# 计算DEA线(9日DIF的EMA)
# 信号线(DEA,慢线)=MACD线的9日移动平均线(EMA)
dea = dif.ewm(span=9, adjust=False).mean()
# 计算MACD柱状图
# 柱状图(MACD直方图)= MACD线-信号线
macd = dif - dea
# 将结果添加到原始DataFrame
data['DIF'] = dif
data['DEA'] = dea
data['MACD'] = macd
return data
def plot_ema(data, close_col):
"""
绘制EMA12和EMA26的走势图。
参数:
- data: 包含收盘价数据的DataFrame。
- close_col: 收盘价数据所在的列名。
"""
# 计算EMA12和EMA26
ema12 = data[close_col].ewm(span=12, adjust=False).mean()
ema26 = data[close_col].ewm(span=26, adjust=False).mean()
# 绘制EMA12和EMA26
plt.figure(figsize=(10, 6))
plt.plot(ema12, label='EMA 12', color='blue')
plt.plot(ema26, label='EMA 26', color='red')
plt.title('EMA 12 and EMA 26')
plt.xlabel('Time')
plt.ylabel('Price')
plt.legend()
plt.savefig('EMA_Trends.pdf', format='pdf')
plt.show()
def plot_macd_trends(data):
"""
计算MACD指标并绘制DIF、DEA和MACD的趋势图。
"""
# 绘制趋势图
plt.figure(figsize=(10, 6))
plt.plot(data['DIF'], label='DIF MACD', color='blue')
plt.plot(data['DEA'], label='DEA ', color='green')
# plt.bar(data.index, data['MACD'], label='MACD', color='red', alpha=0.5)
for i, value in enumerate(data['MACD']):
color = 'green' if value > 0 else 'red'
plt.bar(i, value, color=color, alpha=0.5)
plt.title('MACD Trends')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.savefig('MACD_Trends.pdf', format='pdf')
plt.show()
#-----------------------------------------------------
# 使用示例
# 假设'df'是一个包含收盘价格的DataFrame,如df = pd.read_csv('your_stock_prices.csv')
# df = calculate_macd(df)
df = pd.read_csv('stock.csv')
df = calculate_macd(df)
# 假设你有一个名为data的DataFrame,其中包含至少包含short_period和long_period列的收盘价数据
# plot_macd_trends(data)
plot_macd_trends(df)
# 使用示例
# 假设你有一个名为data的DataFrame和一个指定的收盘价列名close_col
df1 = pd.read_csv('stock.csv')
plot_ema(df1, close_col='Close')
运行图
EWMA函数各个参数解释
- halflife:半衰期,表示权重下降到原值的一半所需的时间间隔。该值越小,对历史数据的影响越大,反之则影响越小。默认值为None,表示使用com参数或手动制定span或alpha参数。
- com:衰减系数,表示相邻两个时间点的距离。例如,若com=0.5,则相邻两个时间点距离为2,如果com=0.3,则相邻两个时间点距离为3。默认值为None。
- span:时间跨度,表示跨越的时间范围。当设置了span参数,halflife和com参数将被忽略。如果设置了window参数,则span将自动计算为2* window + 1。默认值为None。
- alpha:平滑指数的削弱因子,即给定时间点的权值分配。它应该是0到1之间的数字。较大的值意味着给过去的观察更大的权重,反之较小的值则趋向于让预测更平稳。默认值为None。
- min_periods:需要计算EWMA值需要的时间点数。默认值为1,在输入的数据点数量不足时,将使用具有缺失值的输出数据点(NaN)进行补偿。
- adjust:是否应用修正因子,以在开始时减少偏差。在时间序列中,前几个观测点对于计算正在发生的过程的均值或变化率并不具有相同的重要性。
如果this参数设置为True(默认值),则是根据实际样本数量n和传递给函数的decay估算出一个带修正因素的EWMA。否则,忽略修正因素,会导致最初几个值比平滑后的值更偏离原始值。 - ignore_na:是否在计算过程中包含缺失值。默认值为False。