关于pandas移动平均的问题

3

我是一名Python和pandas的初学者,我在制作波动率调整移动平均线方面遇到了困难,所以需要您的帮助。

波动率调整移动平均线是一种移动平均线,其移动平均期不是静态的,而是根据波动率动态调整的。

以下是我的代码:

  1. 从雅虎金融获取股票数据(月收盘价)
  2. 计算月波动率X某个常数 -> 使用动态移动平均周期的变量
  3. 计算动态移动平均线

我尝试过这段代码,但是失败了。我不知道问题出在哪里。如果您知道问题所在或有更好的代码建议,请让我知道。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pandas_datareader.data as web

def price(stock, start):
    price = web.DataReader(name=stock, data_source='yahoo', start=start)['Adj Close']
    price = price / price[0]
    a = price.resample('M').last().to_frame()
    a.columns = ['price']
    return a


a = price('SPY','2000-01-01')
a['volperiod'] = round(a.rolling(12).std()*100)*2
for i in range(len(a.index)):
    k = a['price'].rolling(int(a['volperiod'][i])).mean()
    a['ma'][i] = k[i]

print(a)
1个回答

2

首先:您需要在 price 上计算 pct_change,以计算 returnsvolatility

我的解决方法

def price(stock, start):
    price = web.DataReader(name=stock, data_source='yahoo', start=start)['Adj Close']
    return price.div(price.iat[0]).resample('M').last().to_frame('price')

a = price('SPY','2000-01-01')

v = a.pct_change().rolling(12).std().dropna().mul(200).astype(int)

def dyna_mean(x):
    end = a.index.get_loc(x.name)
    start = end - x.price
    return a.price.iloc[start:end].mean()

pd.concat([a.price, v.price, v.apply(dyna_mean, axis=1)],
          axis=1, keys=['price', 'vol', 'mean'])

1
如果这个回答解决了你的问题,请考虑点击勾选符号将其选择为最佳答案,谢谢。 - piRSquared
我刚刚检查了一下。这是正确的吗?我是stackoverflow的新手。 - Wookeun Lee
我认为 "a.price.iloc[start:end].mean()" ---> 应该是 "return a.price.iloc[start+1:end+1].mean()" "x.name" 是什么意思?我在任何文档中都找不到解释。 - Wookeun Lee
1
@WookeunLee,由于我使用了apply,所以x.name将包含该行索引中的“日期”。然后,我查找a索引中该“日期”的位置,并将其标记为“end”。在这种情况下,“+1”会更正确。稍后我会跟进附加评论。 - piRSquared
你能解释一下 x.price 和 v.price 是什么意思吗?@piRSquared - Wookeun Lee
x.price is the price column for x. v.price is the price column for v - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接