You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas生成每日对应周度OHLC及Close的简单移动平均线?

问题描述

需求1:每日生成截至当日的当周OHLC数据

现有每日股票OHLC数据:

DateDaily OpenDaily HighDaily LowDaily Close
31-Oct-2217910.218022.817899.918012.2
1-Nov-2218130.718175.818060.1518145.4
2-Nov-2218177.918178.7518048.6518082.85
3-Nov-2217968.3518106.317959.218052.7
4-Nov-2218053.418135.118017.1518117.15

需要为每个交易日生成截至当日的当周OHLC数据(示例如下),但用resample('W')只能得到周五的结果,想知道能否用Pandas实现,还是必须循环迭代?

DateWeekly OpenWeekly HighWeekly LowWeekly Close
31-Oct-2217910.218022.817899.918012.2
1-Nov-2217910.218175.817899.918145.4
2-Nov-2217910.218178.7517899.918082.85
3-Nov-2217910.218178.7517899.918052.7
4-Nov-2217910.218178.7517899.918117.15

需求2:计算Weekly Close的2周简单移动平均线(SMA)

得到上述周度数据后,需要为每个交易日计算Weekly Close的2周SMA,示例如下:

DateWeekly Close2weekSMA
7-Nov-2218202.818159.975
9-Nov-221815718137.075
10-Nov-2218028.218072.675
11-Nov-2218349.718233.425

想知道能否用pandas_ta库实现,还是必须循环迭代?

解决方案

一、生成每日截至当日的当周OHLC数据

完全可以用Pandas实现,无需循环。核心是按周分组后,对组内数据做累计计算:

  1. 先处理数据格式,将日期转为datetime类型并设为索引:
import pandas as pd

# 构造示例数据
data = {
    'Date': ['31-Oct-22', '1-Nov-22', '2-Nov-22', '3-Nov-22', '4-Nov-22'],
    'Daily Open': [17910.2, 18130.7, 18177.9, 17968.35, 18053.4],
    'Daily High': [18022.8, 18175.8, 18178.75, 18106.3, 18135.1],
    'Daily Low': [17899.9, 18060.15, 18048.65, 17959.2, 18017.15],
    'Daily Close': [18012.2, 18145.4, 18082.85, 18052.7, 18117.15]
}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
  1. 按周分组并计算累计指标:
  • Weekly Open:取组内首个交易日的开盘价,用transform('first')保留每日行
  • Weekly High:组内截至当日的最高价格,用cummax()计算累计最大值
  • Weekly Low:组内截至当日的最低价格,用cummin()计算累计最小值
  • Weekly Close:直接取当日收盘价

代码实现:

# 按周分组(默认周日为周末,若需周一为周末可调整为freq='W-MON')
weekly_group = df.groupby(pd.Grouper(freq='W'))

df['Weekly Open'] = weekly_group['Daily Open'].transform('first')
df['Weekly High'] = weekly_group['Daily High'].cummax()
df['Weekly Low'] = weekly_group['Daily Low'].cummin()
df['Weekly Close'] = df['Daily Close']

# 整理结果(可选)
result_ohlc = df[['Weekly Open', 'Weekly High', 'Weekly Low', 'Weekly Close']].reset_index()
print(result_ohlc)

运行后即可得到和需求示例完全一致的每日当周累计OHLC数据。

二、计算Weekly Close的2周SMA

可以用pandas_ta轻松实现,无需循环。从示例数据看,2周SMA是取前一周最终收盘价与当前周截至当日收盘价的均值,实现步骤如下:

import pandas_ta as ta

# 1. 提取每周最后一个交易日的收盘价(即周度最终Close)
weekly_close = df['Weekly Close'].resample('W').last()

# 2. 用pandas_ta计算2周SMA
weekly_sma = ta.sma(weekly_close, length=2)

# 3. 将周度SMA映射回每日数据:每个交易日对应其所在周的SMA值
df['week_label'] = df.index.to_period('W')
sma_map = weekly_sma.to_dict()
df['2weekSMA'] = df['week_label'].map(sma_map)

# 查看结果(需补充后续交易日数据后运行)
print(df[['Weekly Close', '2weekSMA']].reset_index())

如果需求是滚动窗口包含当前未完成周的累计均值,也可以直接对Weekly Close列结合rolling()和groupby实现,但上述方式更贴合示例中的计算逻辑。


内容的提问来源于Stack Exchange,提问作者X Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:15:47