Python加密货币扫描器For循环仅输出最后一个币种数据问题求助
问题原因
- 你当前所有的指标计算、信号判断、结果打印、图表绘制逻辑,全部写在了交易对遍历循环的外部,循环内部仅执行了行情下载逻辑,每次循环下载的新行情都会覆盖之前的
df变量,循环结束后df仅保留最后一个交易对的行情数据,外部逻辑仅执行一次,因此只能输出最后一个币种的结果。
解决方案
将所有的行情处理、输出、绘图逻辑整体缩进,放入交易对的遍历循环内部,每下载完一个交易对的行情,就立即完成该币种的全流程计算与输出即可。以下是修正后的完整代码:
import yfinance as yf import numpy as np import matplotlib.pyplot as plt import pandas as pd with open('symbols.csv') as f: symbols = f.read().splitlines() for symbol in symbols: # 打印当前处理的交易对,方便区分不同币种的输出 print(f"\n===== 正在处理交易对:{symbol} =====") df = yf.download(symbol, start='2020-01-01') df['SMA'] = df.Close.rolling(window=20).mean() df['stddev'] = df.Close.rolling(window=20).std() df['Upper'] = df.SMA + 2* df.stddev df['Lower'] = df.SMA - 2* df.stddev df['Buy_Signal'] = np.where(df.Lower > df.Close, True, False) df['Sell_Signal'] = np.where(df.Upper < df.Close, True, False) buys = [] sells = [] open_pos = False for i in range(len(df)): if df.Lower[i] > df.Close[i]: if open_pos == False: buys.append(i) open_pos = True elif df.Upper[i] < df.Close[i]: if open_pos: sells.append(i) open_pos = False print('zoveel buys:', buys) print('zoveel sells:', sells) plt.figure(figsize=(12, 6)) plt.scatter(df.iloc[buys].index, df.iloc[buys].Close, marker = '^', color ='g') plt.scatter(df.iloc[sells].index, df.iloc[sells].Close, marker = '^', color ='r') plt.plot(df[['Close', 'SMA', 'Upper', 'Lower']]) plt.fill_between(df.index, df.Upper, df.Lower, color='grey', alpha=0.3) plt.legend(['Close', 'SMA', 'Upper', 'Lower']) # 图表增加当前交易对标题,方便区分不同币种的图表 plt.title(f"{symbol} 布林带指标与买卖信号") # 如需将图表保存到本地,可去掉下行注释 # plt.savefig(f"{symbol}_行情图.png") plt.show() merged = pd.concat([df.iloc[buys].Close, df.iloc[sells].Close], axis=1) merged.columns = ['Buys', 'Sells'] print(merged) totalprofit = merged.shift(-1).Sells - merged.Buys print("逐笔收益:", totalprofit) relprofits = (merged.shift(-1).Sells - merged.Buys) / merged.Buys print("平均收益率:", relprofits.mean())
内容的提问来源于stack exchange,提问作者Jellyfish
相关产品推荐
相关产品推荐

