如何在PyAlgoTrade的resampleBarFeed中自定义处理额外列EX?
PyAlgoTrade自定义额外列重采样逻辑修改方案
PyAlgoTrade默认的Resampler类不会处理自定义额外列,会将其默认设为0。要实现自定义计算逻辑,需要继承并重写Resampler的核心方法,以下是具体实现步骤:
1. 自定义Resampler类
继承原Resampler,添加对extraCol1(即你提到的EX列)的跟踪和计算逻辑:
from pyalgotrade import bar from pyalgotrade.resample import Resampler class CustomEXResampler(Resampler): def __init__(self, barFeed, barFrequency): super().__init__(barFeed, barFrequency) # 存储每个交易标的的EX列首值与末值 self.__ex_first = {} self.__ex_last = {} def _updateResampledBar(self, instrument, currentBar, resampledBar): # 先调用父类方法处理默认OHLCV列 super()._updateResampledBar(instrument, currentBar, resampledBar) # 提取当前bar的EX列值并跟踪 ex_val = currentBar.getExtraColumns()["extraCol1"] if instrument not in self.__ex_first: self.__ex_first[instrument] = ex_val self.__ex_last[instrument] = ex_val def _onResampledBar(self, instrument, resampledBar): # 计算目标EX值:末值 - 首值 ex_result = self.__ex_last[instrument] - self.__ex_first[instrument] # 构造新的重采样bar,替换EX列的值 updated_bar = bar.BasicBar( resampledBar.getDateTime(), resampledBar.getOpen(), resampledBar.getHigh(), resampledBar.getLow(), resampledBar.getClose(), resampledBar.getVolume(), resampledBar.getAdjClose(), resampledBar.getFrequency(), extraColumns={"extraCol1": ex_result} ) # 重置当前标的的EX跟踪数据 del self.__ex_first[instrument] del self.__ex_last[instrument] # 传递修改后的bar到后续流程 super()._onResampledBar(instrument, updated_bar)
2. 使用自定义Resampler
将原来创建Resampler的代码替换为自定义类即可:
# 假设你原本的feed是1分钟bar数据 resampled_feed = CustomEXResampler(original_feed, bar.Frequency.MINUTE * 3)
3. 扩展说明
如果需要其他计算逻辑,只需修改对应部分:
- 若要计算EX列的平均值:在
_updateResampledBar中累加值和计数,_onResampledBar里做除法 - 若要计算EX列的总和:在
_updateResampledBar中累加值,_onResampledBar直接用累加结果
内容的提问来源于stack exchange,提问作者user19942592
相关产品推荐
相关产品推荐

