【发布时间】:2022-02-24 01:35:34
【问题描述】:
在包含比特币价格的数据框中,我想通过在每行上显示移动平均线(按 20 个周期计算)的斜率角度来衡量趋势的强度。
移动平均线可让您分析时间序列,消除瞬态波动以突出长期趋势。 为了计算用于交易目的的简单 20 周期移动平均线,我们将最后 20 个收盘价相加,然后将结果除以 20。
我开始尝试使用 scipy 的 linregress 函数,但我得到了我无法解决的异常“len() of unsized object”:
from scipy.stats import linregress
x = df.iloc[-1, 8] # -1:last row, 8: sma20
y = df['sma20']
df['slope_deg'] = df.apply(linregress(x, y))
然后我使用了数学模块的 atan 函数,但返回的结果总是 nan,无论行是什么:
import math
df['sma20'] = df['Close'].rolling(20).mean()
slope=((df['sma20'][0]-df['sma20'][20])/20)
df['slope_deg'] = math.atan(slope) * 180 / math.pi
... 或 45 :
import math
df['sma20'] = df['Close'].rolling(20).mean()
df['slope_deg'] = math.atan(1) * 180 / math.pi
df
这是一个以日期为索引的代码示例,用于计算移动平均线的价格和移动平均线(示例超过 5 个周期):
df= pd.DataFrame({'date':np.tile( pd.date_range('1/1/2011',
periods=25, freq='D'), 4 ),
'price':(np.random.randn(100).cumsum() + 10),
'sma5':df['price'].rolling(5).mean()
})
df.head(10)
谁能帮我创建一个返回移动平均线斜率的列?
【问题讨论】:
-
可以提供几行
df吗? -
@G.Anderson,不幸的是,代码不起作用。在阅读 cmets 时,我不是唯一一个无法让这段代码工作的人。
-
@richardec,是的,但我不知道如何将它们发送给您。您必须想象数据框只有一列: df['Price'] 此价格随每一行而变化。通过取最后 20 行的平均值,我们得到 20 个周期的移动平均值。然后你必须计算这个移动平均线的斜率角度。第 12 行和第 13 行之间的角度为 x 度,第 13 行和第 14 行之间的角度为 x 度 ...
-
请参阅 How to make good pandas examples 和 edit 您的问题以显示输入数据帧的示例