大家好,今儿咱们聊聊动量法~
“动量法”是一个在物理学、金融、甚至在机器学习中都有应用的概念,今天主要会从最基础的角度,给大家一个简单易懂的解释。
什么是动量法?
“动量法”这个名字来源于物理学中的“动量”概念。你可以想象,在物理学里,物体的“动量”就像它的“运动劲头”。物体的动量大小和它的质量、速度有关。如果一个物体速度快、质量大,它的动量就大。
同样的,动量法也是基于这个思想:如果某个事物(无论是股票、物品、趋势等)在一段时间里持续向某个方向发展(像一个物体在加速),那么我们预测它继续朝这个方向发展的可能性比较大。也就是说,动量法利用历史的表现来预测未来的趋势。
举个例子:
-
物理中的动量法:想象一下你用力推一个滑板上的小球。如果你推得很快,球就会快速前进,并且在一段时间内保持这个速度。动量法就是利用这个规律:如果小球已经开始快速滚动,且没有遇到大的阻力(比如摩擦),它就会继续保持这个速度。
-
股票投资中的动量法:假设有两个股票,一个股票的价格已经上涨了很长时间,另一个股票的价格则停滞不前。你就可以利用动量法预测,继续上涨的那个股票未来可能会继续上涨,因为它已经积累了一定的上涨势头。而另一个停滞的股票,则可能没有那么强的动力继续向上。所以,动量法在股票投资中就是通过观察一个股票最近的表现(比如它的价格涨势)来推测未来一段时间它会继续向上还是停滞。
具体应用:
-
在股票市场:如果一个股票的价格已经连续上涨了几天,投资者可能会认为这个股票有很强的上涨“动量”,所以他们也想买入它,期待它继续上涨。类似地,如果某个股票的价格已经连续下跌,那就可能认为它的“动量”是下行的,可能会继续下跌。
-
在机器学习中:动量法也有类似的应用,比如在梯度下降算法中,动量可以帮助我们避免在寻找最优解的过程中陷入局部最小值,从而加快算法的收敛速度。
动量法的核心思想就是:如果一个事物在某个方向上有很强的趋势或动力(就像一个快速滚动的球),它很可能会继续朝这个方向发展。所以,在各种场合中,动量法帮助我们根据已有的趋势来预测未来。
有了这些解释,咱们下面从原理和案例方面再来说一说~
动量法公式推导
动量法的公式可以简单理解为根据前一段时间的变化来更新当前的值。特别是在机器学习和金融领域,动量法常用于优化和预测问题。以下是动量法的数学表示:
假设我们有一个变量(例如股票的价格)在不同时间点的值 ,动量法的更新公式如下:
其中:
-
表示在第 时刻的“动量”(即速度),它是前一时刻动量和当前变动的加权平均。 -
是动量的衰减系数,通常取值在 0 到 1 之间,较大的 值表示更注重历史动量。 -
表示第 时刻和第 时刻之间的变化。 -
是我们预测的当前值,基于动量法的更新。
完整案例
使用一个虚拟数据集(模拟股票价格的时间序列数据),使用动量法预测股票价格,并基于动量法进行预测。
import numpy as np
import matplotlib.pyplot as plt
# 虚拟股票数据(时间序列)
np.random.seed(42)
n = 1000 # 数据点数
time = np.arange(n)
# 假设一个初始价格,并生成一些波动的数据
initial_price = 100
price_changes = np.random.normal(loc=0, scale=1, size=n) # 正态分布模拟价格波动
price_data = initial_price + np.cumsum(price_changes) # 计算价格变化
# 动量法参数
beta = 0.9 # 动量衰减系数
v = np.zeros(n) # 初始化动量数组
predicted_price = np.zeros(n) # 初始化预测价格数组
predicted_price[0] = price_data[0] # 第一个预测值就是第一个真实值
# 计算动量并预测价格
for t in range(1, n):
delta_x = price_data[t] - price_data[t-1]
v[t] = beta * v[t-1] + (1 - beta) * delta_x
predicted_price[t] = predicted_price[t-1] + v[t]
# 绘制结果
fig, axs = plt.subplots(2, 2, figsize=(14, 10))
# 1. 原始价格与预测价格
axs[0, 0].plot(time, price_data, label="Actual Price", color='blue', alpha=0.7)
axs[0, 0].plot(time, predicted_price, label="Predicted Price", color='red', linestyle='--')
axs[0, 0].set_title('Actual vs Predicted Price')
axs[0, 0].set_xlabel('Time')
axs[0, 0].set_ylabel('Price')
axs[0, 0].legend()
# 2. 价格变动 (Delta)
price_changes_display = np.diff(price_data) # 计算价格变动
axs[0, 1].plot(time[1:], price_changes_display, color='green', alpha=0.8)
axs[0, 1].set_title('Price Change (Delta)')
axs[0, 1].set_xlabel('Time')
axs[0, 1].set_ylabel('Price Change')
# 3. 动量变化
axs[1, 0].plot(time[1:], v[1:], label="Momentum Change", color='orange')
axs[1, 0].set_title('Momentum Change')
axs[1, 0].set_xlabel('Time')
axs[1, 0].set_ylabel('Momentum')
axs[1, 0].legend()
# 4. 动量对比
axs[1, 1].plot(time[1:], price_changes_display, label="Price Change", color='green', alpha=0.7)
axs[1, 1].plot(time[1:], v[1:], label="Momentum Change", color='orange', linestyle='--')
axs[1, 1].set_title('Price Change vs Momentum Change')
axs[1, 1].set_xlabel('Time')
axs[1, 1].set_ylabel('Change')
axs[1, 1].legend()
# 显示所有图形
plt.tight_layout()
plt.show()
-
真实价格与预测价格(第一个图):蓝色的曲线代表实际的股票价格,红色的虚线是基于动量法预测出来的价格。可以看到,动量法预测的价格与真实价格有一定的跟随性,但在波动较大的时候,预测值可能与真实值存在偏差。
-
价格变化(Delta)(第二个图):这个图展示了每个时间点与前一个时间点之间的价格变化。通过观察价格的波动,可以分析出价格的上涨和下跌趋势。
-
动量变化(第三个图):这个图展示了动量的变化(即 )。动量反映了价格变化的速度,如果动量大,说明价格变动较快;如果动量小,说明价格变化较慢。
-
价格变化 vs 动量变化(第四个图):这个图将价格变化与动量变化对比,展示了它们之间的关系。如果动量大,价格变化较大,可以观察到动量法对价格变动的反应。
代码中:
-
生成数据:我们使用正态分布生成了一个模拟的股票价格波动数据集。 -
动量计算:通过公式 计算每个时刻的动量。然后,通过这个动量来预测股票的下一个价格。
通过这个案例,我们可以看到动量法如何根据历史价格的变化(动量)来预测未来的价格走势。这个方法简单但有效,尤其在趋势明显的情况下,能够为实际决策提供有价值的参考。
最后
