股票交易逻辑Python代码报错:entry_price未定义求助
错误原因分析
- 变量未初始化:
entry_price仅在long & long_con条件满足时才会被赋值。如果代码先触发了short退出条件(此时还从未进入过长仓),entry_price根本不存在,直接导致NameError。 - 循环逻辑错误:使用
while循环完全不合理——当前行的条件不会在循环内更新,一旦条件为真会无限循环卡死程序。 - 收益计算公式错误:原公式
((exit_price - entry_price)/entry_price -1)*100会得到错误的收益率,正确的百分比收益应该是((exit_price - entry_price)/entry_price)*100或((exit_price/entry_price)-1)*100。 - 打印内容错误:
df.index会输出整个DataFrame的索引,而不是当前交易行的索引。
修正后的代码
# 初始化持仓状态和入场价变量 in_position = False entry_price = None for index, row in df.iterrows(): # 前100行跳过计算 if index < 100: continue # 定义80/20蜡烛形态和市场时机条件 candle_range_ratio = (row['close'] - row['low']) / (row['high'] - row['low']) long_signal = candle_range_ratio < 0.2 exit_signal = candle_range_ratio > 0.8 # 重命名为exit_signal更清晰 long_con = row['close'] <= 1.05 * row['100SMA'] # 未持仓时,检查是否满足入场条件 if not in_position: if long_signal and long_con: entry_price = row['close'] in_position = True print(f"[{index}] 入场,入场价: {entry_price}") # 持仓时,检查是否满足出场条件 else: if exit_signal: exit_price = row['close'] # 计算正确的百分比收益 rt = ((exit_price - entry_price) / entry_price) * 100 print(f"[{index}] 入场价: {entry_price} | 出场价: {exit_price} | 收益率: {rt:.2f}%") # 重置持仓状态 in_position = False entry_price = None
关键改进点
- 添加
in_position变量跟踪持仓状态,确保只有在持仓时才会触发出场逻辑 - 提前初始化
entry_price并在出场后重置 - 修正收益计算公式,保留两位小数提升可读性
- 重命名变量(如
short改为exit_signal)让逻辑更清晰 - 使用当前行的
index打印交易时间点
内容的提问来源于stack exchange,提问作者Chung Joshua
相关产品推荐
相关产品推荐

