如何用Pandas生成每日对应周度OHLC及Close的简单移动平均线?
问题描述
需求1:每日生成截至当日的当周OHLC数据
现有每日股票OHLC数据:
| Date | Daily Open | Daily High | Daily Low | Daily Close |
|---|---|---|---|---|
| 31-Oct-22 | 17910.2 | 18022.8 | 17899.9 | 18012.2 |
| 1-Nov-22 | 18130.7 | 18175.8 | 18060.15 | 18145.4 |
| 2-Nov-22 | 18177.9 | 18178.75 | 18048.65 | 18082.85 |
| 3-Nov-22 | 17968.35 | 18106.3 | 17959.2 | 18052.7 |
| 4-Nov-22 | 18053.4 | 18135.1 | 18017.15 | 18117.15 |
需要为每个交易日生成截至当日的当周OHLC数据(示例如下),但用resample('W')只能得到周五的结果,想知道能否用Pandas实现,还是必须循环迭代?
| Date | Weekly Open | Weekly High | Weekly Low | Weekly Close |
|---|---|---|---|---|
| 31-Oct-22 | 17910.2 | 18022.8 | 17899.9 | 18012.2 |
| 1-Nov-22 | 17910.2 | 18175.8 | 17899.9 | 18145.4 |
| 2-Nov-22 | 17910.2 | 18178.75 | 17899.9 | 18082.85 |
| 3-Nov-22 | 17910.2 | 18178.75 | 17899.9 | 18052.7 |
| 4-Nov-22 | 17910.2 | 18178.75 | 17899.9 | 18117.15 |
需求2:计算Weekly Close的2周简单移动平均线(SMA)
得到上述周度数据后,需要为每个交易日计算Weekly Close的2周SMA,示例如下:
| Date | Weekly Close | 2weekSMA |
|---|---|---|
| 7-Nov-22 | 18202.8 | 18159.975 |
| 9-Nov-22 | 18157 | 18137.075 |
| 10-Nov-22 | 18028.2 | 18072.675 |
| 11-Nov-22 | 18349.7 | 18233.425 |
想知道能否用pandas_ta库实现,还是必须循环迭代?
解决方案
一、生成每日截至当日的当周OHLC数据
完全可以用Pandas实现,无需循环。核心是按周分组后,对组内数据做累计计算:
- 先处理数据格式,将日期转为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)
- 按周分组并计算累计指标:
- 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
相关产品推荐
相关产品推荐

