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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:45:02