如题,
想要实现portfoliobacktesting框架下,记录下来每个商品每天的ATR,并缓存到新建在回测框架下的列表self.atrs里. 再在calculate_results()函数里从self.atrs调取ATR进行计算。我的想法大致如下。实际遇到的问题时调取self.atrs时,取到的回测期内每天的atr数值都是最后一天的atr数值。在'输出1' 的位置,可以得到不同日期不同的atr数值,等到程序运行到'输出2' 的位置是,得到的回测期内每天的数值都是最后一天的数值。
个人的猜想时实际上存进列表里的不是数值而是方法。到了位置2的时候是把所有的方法都用最后一天的bardata又计算了一遍。不知道怎么改,求助各位高手指点迷津。
def run_backtesting(self) -> None:
""""""
此处为框架本身代码,省略
""""""
self.output(self.atrs) # (输出2:)此处输出new_bars函数计算完成以后的self.atrs
def new_bars(self, dt: datetime) -> None:
""""""
self.datetime = dt
bars: Dict[str, BarData] = {}
for vt_symbol in self.vt_symbols:
bar: Optional[BarData] = self.history_data.get((dt, vt_symbol), None)
# If bar data of vt_symbol at dt exists
if bar:
# Update bar data for crossing order
self.bars[vt_symbol] = bar
# Put bar into dict for strategy.on_bars update
bars[vt_symbol] = bar
# Otherwise, use previous close to backfill
elif vt_symbol in self.bars:
old_bar: BarData = self.bars[vt_symbol]
bar: BarData = BarData(
symbol=old_bar.symbol,
exchange=old_bar.exchange,
datetime=dt,
open_price=old_bar.close_price,
high_price=old_bar.close_price,
low_price=old_bar.close_price,
close_price=old_bar.close_price,
gateway_name=old_bar.gateway_name
)
self.bars[vt_symbol] = bar
self.cross_limit_order()
self.strategy.on_bars(bars)
if dt.time() == time(14,59):
aaa = {"date":dt.date(), "atrs": self.strategy.get_atrs()}
self.atrs.append(aaa)
self.output(f"{dt.date()},{self.atrs[-1]}") # (输出1:)在每个交易日的计算完成后,输出self.atrs列表中的最新数值
if self.strategy.inited: #if init finished, push the new bar data to update daily close info
self.update_daily_close(self.bars, dt)