Python:如何编写指数移动平均线?

标签 python python-3.x pandas math finance

我想对数据框 df 的三列进行计算。为此,我想在三列表中运行 Assets (加密货币)列表的价格,以便在获得足够的数据后计算它们的指数移动平均线。

def calculateAllEMA(self,values_array):
    df = pd.DataFrame(values_array, columns=['BTC', 'ETH', 'DASH'])
    column_by_search = ["BTC", "ETH", "DASH"]
    print(df)
    for i,column in enumerate(column_by_search):
        ema=[]
        # over and over for each day that follows day 23 to get the full range of EMA
        for j in range(0, len(column)-24):
            # Add the closing prices for the first 22 days together and divide them by 22.
            EMA_yesterday = column.iloc[1+j:22+j].mean()
            k = float(2)/(22+1)
            # getting the first EMA day by taking the following day’s (day 23) closing price multiplied by k, then multiply the previous day’s moving average by (1-k) and add the two.
            ema.append(column.iloc[23 + j]*k+EMA_yesterday*(1-k))
        print("ema")
        print(ema)
        mean_exp[i] = ema[-1]
    return mean_exp

然而,当我打印 len(column)-24 中的内容时,我得到 -21(-24 + 3?)。因此,我无法完成循环。我该如何处理这个错误以获得 Assets 的指数移动平均线?

我尝试申请 this link from iexplain.com指数移动平均线的伪代码。

如果您有任何更简单的想法,我很乐意听取。

这是我在出错时用来计算它的数据:

        BTC     ETH    DASH
0   4044.59  294.40  196.97
1   4045.25  294.31  196.97
2   4044.59  294.40  196.97
3   4045.25  294.31  196.97
4   4044.59  294.40  196.97
5   4045.25  294.31  196.97
6   4044.59  294.40  196.97
7   4045.25  294.31  196.97
8   4045.25  294.31  196.97
9   4044.59  294.40  196.97
10  4045.25  294.31  196.97
11  4044.59  294.40  196.97
12  4045.25  294.31  196.97
13  4045.25  294.32  197.07
14  4045.25  294.31  196.97
15  4045.41  294.46  197.07
16  4045.25  294.41  197.07
17  4045.41  294.41  197.07
18  4045.41  294.47  197.07
19  4045.25  294.41  197.07
20  4045.25  294.32  197.07
21  4045.43  294.35  197.07
22  4045.41  294.46  197.07
23  4045.25  294.41  197.07

最佳答案

原始答案中的

pandas.stats.moments.ewma 已被弃用。

相反,您可以使用 pandas.DataFrame.ewm 作为记录 here .


下面是一个包含随机数据的完整代码段,它使用从指定列计算出的 ewmas 构建数据框。

代码:

# imports
import pandas as pd
import numpy as np

np.random.seed(123)

rows = 50
df = pd.DataFrame(np.random.randint(90,110,size=(rows, 3)), columns=['BTC', 'ETH', 'DASH'])
datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
df['dates'] = datelist 
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)

def ewmas(df, win, keepSource):
    """Add exponentially weighted moving averages for all columns in a dataframe.

    Arguments: 
    df -- pandas dataframe
    win -- length of ewma estimation window
    keepSource -- True or False for keep or drop source data in output dataframe

    """

    df_temp = df.copy()

    # Manage existing column names
    colNames = list(df_temp.columns.values).copy()
    removeNames = colNames.copy()

    i = 0
    for col in colNames:

        # Make new names for ewmas
        ewmaName = colNames[i] + '_ewma_' + str(win)   

        # Add ewmas
        #df_temp[ewmaName] = pd.stats.moments.ewma(df[colNames[i]], span = win)
        df_temp[ewmaName] = df[colNames[i]].ewm(span = win, adjust=True).mean()

        i = i + 1

    # Remove estimates with insufficient window length
    df_temp = df_temp.iloc[win:]

    # Remove or keep source data
    if keepSource == False:
        df_temp = df_temp.drop(removeNames,1)

    return df_temp

# Test run
df_new = ewmas(df = df, win = 22, keepSource = True)
print(df_new.tail())

输出:

             BTC  ETH   DASH  BTC_ewma_22  ETH_ewma_22    DASH_ewma_22
dates                                                             
2017-02-15   91   96    98    98.752431    100.081052     97.926787
2017-02-16  100  102   102    98.862445    100.250270     98.285973
2017-02-17  100  107    97    98.962634    100.844749     98.172712
2017-02-18  103  102    91    99.317826    100.946384     97.541684
2017-02-19   99  104    91    99.289894    101.214755     96.966758

绘图使用df_new[['BTC', 'BTC_ewma_22']].plot():

enter image description here

关于Python:如何编写指数移动平均线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45665217/

相关文章:

python - 在 Python 中, ".append()"和 "+= []"有什么区别?

python - 使用 uWSGI 和 Cherokee 部署 Pyramid 应用程序

python - 如何在不知道编码的情况下将字节写入 Python 3 中的文件?

python-3.x - 'AssertionError' 对象没有属性 'message'

python - 使用 create_engine 从 SQLAlchemy 到 MSSQL

python - 如何将 pandas 数据框中的文本拆分为新的数据框列

Python 使用 for/if 转换和过滤列表

python - issubclass() 对从不同路径导入的同一类返回 False

python-3.x - 'builtin_function_or_method' object is not subscriptable error' 是什么意思?

python - 如何使用groupby选择条件行?