Python行情涨跌比对代码始终输出下跌的列表索引问题排查
行情判断代码始终输出下跌的问题排查
核心错误点
代码逻辑失效和列表索引理解偏差有关,共有4个直接导致判断完全不生效的问题:
- 列表定义位置错误:你把
list = []写在了循环内部,每轮抓取行情时都会先创建一个全新的空列表,之前抓到的所有历史价格都会被直接清空,根本无法留存不同时间点的价格数据。 - 列表元素数量永远不足:空列表创建后你只执行了一次
append(M)操作,列表全程只有1个元素,此时你取的list[-1](列表最后一个元素)和list[0](列表第一个元素)是完全相同的当前价格,N > O的判断永远为假,自然永远走else分支输出market is down。 - 对比索引完全错误:你原本的逻辑是对比列表末尾两个值判断走势,但实际取的是第一个和最后一个元素,在列表只有1个元素的情况下二者完全相等;就算后续留存了历史值,取第一个元素(最早的历史价格)对比也不符合“相邻两次抓取价格对比”的需求。
- 额外逻辑bug:你往
market.txt写入时连续写了两次当前价格L,后续如果要从文件读历史价格做备份对比,拿到的也是重复值;原代码没有外层持续循环,只会执行一次抓取就退出,根本不会触发10秒间隔的二次抓取;用list作为变量名会覆盖Python内置的列表类型,属于不规范写法,容易触发未知问题;用trunc()截断价格取整的话,如果两次抓取间隔价格波动小于1单位,整数部分没有变化,会无法识别涨跌。
修正后可运行代码
import time import yfinance as yf from math import trunc # 价格列表定义在循环外部,持久化存储所有抓取到的价格 price_records = [] tickers = ['^N225'] # 加外层死循环实现持续抓取行情 while True: for ticker in tickers: ticker_yahoo = yf.Ticker(ticker) data = ticker_yahoo.history() last_quote = data['Close'].iloc[-1] current_price_raw = float(last_quote) # 如果不需要按整数位判断涨跌,直接去掉trunc,用current_price_raw对比即可 current_price_trunc = trunc(current_price_raw) # 文件写入每次仅记录一次当前价格,用with上下文自动关文件避免资源泄漏 with open('market.txt', 'a', encoding='utf-8') as f: f.write(f"{current_price_raw}\n") print(f"当前截断后价格:{current_price_trunc}") price_records.append(current_price_trunc) # 列表中至少存了2次抓取结果时,才做涨跌判断 if len(price_records) >= 2: latest = price_records[-1] previous = price_records[-2] # 取倒数第二个元素,即上一轮抓取的价格,符合对比需求 if latest > previous: print("market is up") elif latest < previous: print("market is down") else: print("market is flat") time.sleep(10)
内容的提问来源于stack exchange,提问作者Tooluser
相关产品推荐
相关产品推荐

