无法通过 python pandas 计算 MACD

2024-01-09

我编写了一个脚本来获取股票列表的股票信息。对于涉及的股票(groupby中的组),我需要计算MACD。

为了不将一只股票的价格与另一只股票的价格混合,我使用 pandas groupby。

# -*- coding: utf-8 -*-

import pandas as pd
from pandas.io.data import DataReader
import numpy as np
import time
from io import StringIO

runstart = time.time()     # Start script timer

stocklist = ['nflx','mmm'] 
tickers =   []
days_backtest=102  # MA98 kræver 102 d for at virke!
end = pd.Timestamp.utcnow()
start = end - days_backtest * pd.tseries.offsets.BDay()

    # Fetch stockinfo
def GetStock(stocklist, start, end, csv_file_all='alltickers_ohlc.csv'):
    '''
    Fetches stock-info for analysis of each ticker in stocklist
    '''
    print('\nGetting Stock-info from Yahoo-Finance')
    for ticker in stocklist:
        r = DataReader(ticker, "yahoo",
                       start = start, end = end)
        # add a symbol column
        r['Ticker'] = ticker
        tickers.append(r)
    # concatenate all the dfs
    df_all = pd.concat(tickers)

    # add col without space in adj close
    df_all['Adj_Close'] = df_all['Adj Close']
    #define df with the columns that i need             These can be put back in df_all
    df_all = df_all[['Ticker','Adj_Close','Volume']] #'Adj Close','Open','High','Low',

    # round to 2 dig.
#    df_all['Open'] = np.round(df_all['Open'], decimals=2)
#    df_all['High'] = np.round(df_all['High'], decimals=2)
#    df_all['Low'] = np.round(df_all['Low'], decimals=2)
#    df_all['Adj Close'] = np.round(df_all['Adj Close'], decimals=2)
    df_all['Adj_Close'] = np.round(df_all['Adj_Close'], decimals=2)

#    # Test the first 3 rows of each group for 'Difference' col transgress groups...
#    df_all_test = df_all.groupby('Ticker').head(27).reset_index().set_index('Date')
#    print ('\n df_all_test (27d summary from df) (Output)\n',df_all_test,'\n')

    # saving to a csv #
    df_all.reset_index().sort(['Ticker', 'Date'], ascending=[1,1]).set_index('Ticker').to_csv(csv_file_all, date_format='%Y/%m/%d')
#    df_all.sort_index(inplace=True)   # Sorts rows from date, mingling tickers - not wanted
    print('=========  Picked up new stockinfo   (df_all) \n')
#    print ('df_all.tail (Input)\n',df_all.tail(6),'\n')
    print(70 * '-')
#    print(df_all)

    return df_all

def moving_average(group, n=9, type='simple'):
    """
    compute an n period moving average.
    type is 'simple' | 'exponential'
    """
    group = np.asarray(df_['Adj_Close'])
    if type == 'simple':
        weights = np.ones(n)
    else:
        weights = np.exp(np.linspace(-1., 0., n))

    weights /= weights.sum()

    a = np.convolve(group, weights, mode='full')[:len(group)]
    a[:n] = a[n]
    return a
#    return pd.DataFrame({'MCD_Sign':a})

def moving_average_convergence(group, nslow=26, nfast=12):
    """
    compute the MACD (Moving Average Convergence/Divergence) using a fast and slow exponential moving avg'
    return value is emaslow, emafast, macd which are len(x) arrays
    """
    emaslow = moving_average(group, nslow, type='exponential')
    emafast = moving_average(group, nfast, type='exponential')
#    return emaslow, emafast, emafast - emaslow

    return pd.DataFrame({'emaSlw': emaslow,
                     'emaFst': emafast, 
                     'MACD': emafast - emaslow})


if __name__ == '__main__':

    ### Getstocks
    df_all = GetStock(stocklist, start, end)
    ### Sort DF
    df_all.reset_index().sort(['Ticker', 'Date'], ascending=[1,1]).set_index('Ticker')

    ### groupby screeener (filtering to only rel ticker group)
    df_ = df_all.set_index('Ticker', append=True)
    ''' Calculating all the KPIs via groupby (filtering pr ticker)'''
    grouped = df_.groupby(level=1).Adj_Close    
    nslow = 26
    nfast = 12
    nema = 9

    df_[['emaSlw', 'emaFst', 'MACD']] = df_.groupby(level=1).Adj_Close.apply(moving_average_convergence)
    df_['MCD_Sign'] = df_.groupby(level=1).Adj_Close.apply(moving_average)

    print ('(Output df)\n',df_,'\n')

    df = df_.reset_index('Ticker')    
    # Test the last row of each group for new numbers pr group...
    df_test = df.groupby('Ticker').tail(1).reset_index().set_index('Date')
    print ('df_test (summary from df) (Output)\n',df_test,'\n')

显然我在所有 MACD 数字的列中没有得到任何结果。所以在某些地方,计算结果出现了偏差。我不知道出了什么问题......

股票行情的输出行:

df_test (summary from df) (Output)
            Ticker  Adj_Close   Volume  emaSlw  emaFst  MACD MCD_Sign
Date                                                                
2016-07-07   nflx      95.10  9902700     NaN     NaN   NaN      NaN
2016-07-07    mmm     174.87  1842300     NaN     NaN   NaN      NaN 

你们中的任何人...提示!?


所以在我看来,你所做的工作比你真正需要做的要多。答案稍微简单一些。您不需要定义自己的移动平均函数,这实际上是导致您的问题的原因。

Change moving_average to:

def moving_average(group, n=9):
    sma = pd.rolling_mean(group, n)
    return sma

Change moving_average_convergance to:

def moving_average_convergence(group, nslow=26, nfast=12):
    emaslow = pd.ewma(group, span=nslow, min_periods=1)
    emafast = pd.ewma(group, span=nfast, min_periods=1)
    result = pd.DataFrame({'MACD': emafast-emaslow, 'emaSlw': emaslow, 'emaFst': emafast})
    return result

注意:我在这里将“MACD”放在第一位,因为无论您如何列出它,DataFrame 都会按字母顺序对列进行重新排序。

最后改变:

df_[['emaSlw', 'emaFst', 'MACD']] = df_.groupby(level=1).Adj_Close.apply(moving_average_convergence)

to:

df_[['MACD', 'emaSlw', 'emaFst']] = df_.groupby(level=1).Adj_Close.apply(moving_average_convergence)

应该可以做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法通过 python pandas 计算 MACD 的相关文章

  • 如何在Python中循环并存储自变量中的值

    我对 python 很陌生 所以这听起来可能很愚蠢 我进行了搜索 但没有找到解决方案 我在 python 中有一个名为 ExcRng 的函数 我可以对该函数执行什么样的 for 循环 以便将值存储在独立变量中 我不想将它们存储在列表中 而是
  • Python BeautifulSoup XML 解析

    我编写了一个简单的脚本来使用 BeautifulSoup 模块解析 XML 聊天日志 标准 soup prettify 工作正常 只是聊天日志中有很多绒毛 您可以在下面看到我正在使用的脚本代码和一些 XML 输入文件 Code import
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • 定义函数后对其进行修饰?

    I think答案是否定的 但我似乎找不到明确的说法 我有以下情况 def decorated function function functools wraps function def my function print Hello s
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • 如何在python中检索aws批处理参数值?

    流程 Dynamo DB gt Lambda gt 批处理 如果将角色 arn 插入动态数据库 它是从 lambda 事件中检索的 然后使用submit job角色 arn 的 API 被传递为 parameters role arn ar
  • 如何使用Python的super()来更新父值?

    我对继承很陌生 之前所有关于继承和 Python 的 super 函数的讨论都有点超出我的理解 我当前使用以下代码来更新父对象的值 usr bin env python test py class Master object mydata
  • Python:计算数据帧列中所有行中特定字符的实例数

    我有一个包含列 toaddress ccaddress body 的数据框 df 我想迭代数据帧的索引 以获取 toaddress 和 ccaddress 字段中电子邮件地址的最小 最大和平均数量 这是通过计算这两列中每个字段中的 和 的实
  • Django 在选择列表更改时创建毫无意义的迁移

    我正在尝试使用可调用创建一个带有选择字段的模型 以便 Django 在选择列表更改时不会创建迁移 如中所述this https stackoverflow com questions 31788450 stop django from cr
  • 无法截取宽度为 0 的屏幕截图

    我正在尝试截取 Bootstrap 模态内元素的屏幕截图 经过一番努力 我终于想出了这段代码 driver get https enlinea sunedu gob pe driver find element by xpath div c
  • Matplotlib Scatter - ValueError:RGBA 序列的长度应为 3 或 4

    我正在尝试为我的功能绘制图表 但不断收到此错误 ValueError RGBA sequence should have length 3 or 4 每当我只有 6 种形状时 代码就可以完美运行 但现在我将其增加到 10 种 它就不起作用了
  • Airflow Python 单元测试?

    我想为我们的 DAG 添加一些单元测试 但找不到任何单元测试 有 DAG 单元测试框架吗 有一个端到端的测试框架存在 但我猜它已经死了 https issues apache org jira browse AIRFLOW 79 https
  • 导入错误:没有名为 google.auth 的模块

    当我尝试导入时firebase admin in python 2 7我收到错误 导入错误 没有名为 google auth 的模块 这是Docker文件 https github com ammaratef45 Attendance bl
  • Flask WTForms 使用变量自动填充 StringField

    我有一个表格 我想用上一页收到的信息自动填充一些字段 但如果他们想调整它 它需要是可更改的 我正在为我的 SelectField 使用动态创建的列表 但添加 StringField 并不成功 请参阅下面的我的代码 forms py clas
  • Python - 如何查询定义方法的类?

    我的问题有点类似于this one https stackoverflow com questions 5520580 how do you get all classes defined in a module but not impor
  • Python组合目录中的所有csv文件并按日期时间排序

    我有 2 年的每日数据分成每月文件 我想将所有这些数据合并到一个按日期和时间排序的文件中 我正在使用的代码组合了所有文件 但不按顺序 我正在使用的代码 import pandas as pd import glob os import cs
  • Python 3.2 中 **kwargs 和 dict 有什么区别?

    看起来Python的很多方面都只是功能的重复 除了我在 Python 中的 kwargs 和 dict 中看到的冗余之外 还有什么区别吗 参数解包存在差异 许多人使用kwargs 并通过dict作为论据之一 使用参数解包 Prepare f
  • 全局变量是 None 而不是实例 - Python

    我正在处理Python 中的全局变量 代码应该可以正常工作 但是有一个问题 我必须使用全局变量作为类的实例Back 当我运行应用程序时 它说 back is None 这应该不是真的 因为第二行setup 功能 back Back Back
  • 来自 django 教程 was_published_recently.admin_order_field = 'pub_date'

    From Django 教程 https www jetbrains com help pycharm 2017 1 creating and running your first django project html d28041e21
  • 使用 Python 生成类似于 Messenger 或 kik 代码的圆形二维码

    我可以使用 Python 生成圆形 QR 码 就像 Facebook Messenger 或 kik 使用的那样吗 我访问了很多网站 但找不到这种类型的二维码 默认情况下 Python 生成方形 QR 码 但在我的项目中我想要圆形 QR 码

随机推荐