You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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)
关键改动说明
  1. 动态获取入场价:直接从Ordem信号行的close列提取入场价,替代原代码中固定的preco_ordem变量
  2. 逐信号遍历后续价格:对每个信号,从信号行的下一行开始依次检查close值,确保按时间顺序判断触发条件
  3. 精准标记结果:将触发止盈/止损的盈亏值写入resultado列对应的触发行,未触发的信号在df2中标记为NaN
  4. 自动汇总信号:自动收集所有信号的入场价和结果,生成汇总表df2,无需手动整理

内容的提问来源于stack exchange,提问作者Wagner B.A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:25:23