基于DataFrame条件循环的交易订单收益计算逻辑优化
问题需求
- 将变量
preco_ordem替换为对应Ordem信号行的close值(Ordem=1或Ordem=-1时,取该行的close作为入场价) - 针对每个
Ordem=1的做多信号,遍历后续close值,直到找到**大于入场价+tp(止盈)或小于入场价-sl(止损)**的数值,记录盈亏 - 针对每个
Ordem=-1的做空信号,遍历后续close值,直到找到**小于入场价-tp(止盈)或大于入场价+sl(止损)**的数值,记录盈亏 - 生成包含
resultado列的原DataFrame,以及汇总所有信号和对应结果的df2
修改后的完整代码
import pandas as pd import numpy as np # 初始化参数 tp = 0.30 sl = 0.20 list_1 = [26.66, 26.7, 26.72, 26.73, 26.74, 26.88, 26.63, 26.56, 26.51, 26.55, 26.54, 26.5, 26.52, 26.59, 26.43, 26.46, 26.54, 26.51, 26.54, 26.5, 26.51, 26.47, 26.48, 26.41, 26.4, 26.37] list_2 = [0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0] df = pd.DataFrame({ 'close': list_1, 'Ordem': list_2}) # 初始化resultado列为0 df['resultado'] = 0 # 收集所有有效信号的索引、类型和入场价 signals = df[df['Ordem'].isin([1, -1])].reset_index() # 存储df2的汇总数据 df2_data = [] # 逐个处理每个信号 for _, signal in signals.iterrows(): signal_idx = signal['index'] ordem_type = signal['Ordem'] entry_price = signal['close'] triggered = False # 从信号的下一行开始遍历后续价格 for idx in range(signal_idx + 1, len(df)): current_close = df.loc[idx, 'close'] # 处理做多信号(Ordem=1) if ordem_type == 1: take_profit = entry_price + tp stop_loss = entry_price - sl # 检查止盈条件 if current_close >= take_profit: profit = current_close - entry_price df.loc[idx, 'resultado'] = profit df2_data.append({'close': entry_price, 'resultado': profit}) triggered = True break # 检查止损条件 elif current_close <= stop_loss: loss = current_close - entry_price df.loc[idx, 'resultado'] = loss df2_data.append({'close': entry_price, 'resultado': loss}) triggered = True break # 处理做空信号(Ordem=-1) elif ordem_type == -1: take_profit = entry_price - tp stop_loss = entry_price + sl # 检查止盈条件 if current_close <= take_profit: profit = entry_price - current_close df.loc[idx, 'resultado'] = profit df2_data.append({'close': entry_price, 'resultado': profit}) triggered = True break # 检查止损条件 elif current_close >= stop_loss: loss = current_close - entry_price df.loc[idx, 'resultado'] = loss df2_data.append({'close': entry_price, 'resultado': loss}) triggered = True break # 若遍历完所有后续价格未触发条件,标记为NaN if not triggered: df2_data.append({'close': entry_price, 'resultado': np.nan}) # 生成汇总信号结果的df2 df2 = pd.DataFrame(df2_data) # 输出结果 print("df:") print(df) print("\ndf2:") print(df2)
关键改动说明
- 动态获取入场价:直接从
Ordem信号行的close列提取入场价,替代原代码中固定的preco_ordem变量 - 逐信号遍历后续价格:对每个信号,从信号行的下一行开始依次检查
close值,确保按时间顺序判断触发条件 - 精准标记结果:将触发止盈/止损的盈亏值写入
resultado列对应的触发行,未触发的信号在df2中标记为NaN - 自动汇总信号:自动收集所有信号的入场价和结果,生成汇总表df2,无需手动整理
内容的提问来源于stack exchange,提问作者Wagner B.A
相关产品推荐
相关产品推荐

