stockstats预期的数据结构是什么?如何基于DataFrame计算MACD?
解决stockstats计算MACD的问题
我来帮你梳理清楚stockstats对数据结构的要求,以及正确计算MACD的步骤——你遇到的问题大概率是因为列名不符合stockstats的默认识别规则。
stockstats预期的数据结构
stockstats的StockDataFrame默认会识别标准的金融数据列名,核心列要求如下:
- 收盘价:
close(必须,MACD基于收盘价计算) - 可选列:
open(开盘价)、high(最高价)、low(最低价)、volume(成交量)
如果你的DataFrame列名不是这些标准名称,要么重命名列,要么给StockDataFrame指定列名映射关系,两种方式都可以。
针对你的DataFrame的解决步骤
你的DataFrame列是T(时间戳)、L(最低价)、H(最高价)、O(开盘价)、C(收盘价)、BV(成交量),我们可以按以下步骤处理:
1. 预处理原始DataFrame
首先确保时间列是datetime格式,最好设置为索引(方便后续时间序列分析):
import pandas as pd from stockstats import StockDataFrame # 对应你用json_normalize生成的df data = [ {"T": "2015-08-14T00:00:00", "L": 0.006667, "H": 0.080000, "O": 0.006900, "C": 0.007000, "BV": 29.545465}, {"T": "2015-08-15T00:00:00", "L": 0.005950, "H": 0.007240, "O": 0.006740, "C": 0.006954, "BV": 20.274633}, {"T": "2015-08-16T00:00:00", "L": 0.004120, "H": 0.006900, "O": 0.006501, "C": 0.006051, "BV": 47.971549}, {"T": "2015-08-17T00:00:00", "L": 0.004655, "H": 0.006139, "O": 0.006139, "C": 0.004798, "BV": 30.391738} ] df = pd.io.json.json_normalize(data) # 转换时间列为datetime格式 df['T'] = pd.to_datetime(df['T']) # 设置时间列为索引(可选但推荐) df.set_index('T', inplace=True)
2. 方式一:重命名列到标准名称
这是最直接的方式,把你的列名映射成stockstats默认识别的名称:
# 重命名列 df.rename(columns={ 'O': 'open', 'H': 'high', 'L': 'low', 'C': 'close', 'BV': 'volume' }, inplace=True) # 转换为StockDataFrame stock_df = StockDataFrame.retype(df)
3. 方式二:自定义列名映射(无需重命名)
如果不想修改原始列名,可以在初始化StockDataFrame时指定映射关系:
stock_df = StockDataFrame(df, column_map={ 'O': 'open', 'H': 'high', 'L': 'low', 'C': 'close', 'BV': 'volume' })
4. 计算并获取MACD数据
stockstats会动态生成技术指标列,当你访问macd(MACD线)、macds(信号线,默认9日EMA)、macdh(柱状图,MACD与信号线的差值)时,会自动计算:
# 获取包含收盘价和MACD的结果 macd_result = stock_df[['close', 'macd', 'macds', 'macdh']] print(macd_result)
注意事项
- 确保你的数据是按时间顺序升序排列的,否则MACD计算结果会出错(你的数据看起来已经是按日期从早到晚排的,没问题)
- MACD的计算只依赖收盘价,所以即使没有开盘/最高/最低/成交量列,只要有
close列就能计算,但完整的K线数据更利于后续其他指标分析
内容的提问来源于stack exchange,提问作者DenCowboy
相关产品推荐
相关产品推荐

