金融DataFrame的position列基于历史值更新的实现方法咨询
实现代码
import numpy as np import pandas as pd # 第一步:计算初始开仓信号,和你原有开仓逻辑一致 entry_cond = [ self.data['close'] > self.data['open_buy_high'], self.data['close'] < self.data['open_sell_low'] ] self.data['entry_signal'] = np.select(entry_cond, [1, -1], 0) # 第二步:计算平仓触发条件 # 先临时获取当前无平仓情况下的持仓状态,用于平仓判断 temp_hold = self.data['entry_signal'].replace(0, np.nan).ffill() exit_cond = ( (temp_hold == 1) & (self.data['close'] < self.data['close_buy_low']) # 多单平仓:跌破多单平仓线 ) | ( (temp_hold == -1) & (self.data['close'] > self.data['close_sell_high']) # 空单平仓:涨破空单平仓线 ) # 第三步:生成最终position列 # 平仓位置强制设为0,其余位置保留开仓信号,再前向填充持仓状态 self.data['position'] = np.where(exit_cond, 0, self.data['entry_signal'])\ .replace(0, np.nan).ffill().fillna(0).astype(int) # 删除临时计算用的中间列 self.data.drop(columns=['entry_signal'], inplace=True)
逻辑说明
- 你原有代码的问题是未留存上一周期的持仓状态,仅用当期position的值做判断,自然无法实现持仓延续的效果。
- 上述逻辑先单独存储开仓信号,通过前向填充拿到每个节点默认的持仓状态,再结合平仓条件强制重置为0,最后再做一次前向填充实现「开仓后一直持有到平仓信号出现再归零」的效果。
- 注意使用前请确保你的DataFrame已经按时间列升序排序,否则前向填充逻辑会出错。
内容的提问来源于stack exchange,提问作者GuyS
相关产品推荐
相关产品推荐

