For 循环只显示最后一个值而不是全部 |加密货币

For loop only showing last value instead of them all | Cryptocurrency

我正在尝试制作加密扫描仪,但遇到了一个问题。我用一些加密货币制作了一个小的 csv 文件,如下所示:

BTC-USD
ETH-USD
ADA-USD
BNB-USD

现在我想遍历这个 csv 文件并将所有值放入 df 函数中。现在的问题是它只插入文件的最后一个值并给出该硬币的图形。我试过如下:

with open('symbols.csv') as f:
    symbols = f.read().splitlines()
    for symbol in symbols:
        df = yf.download(symbol, start='2020-01-01')

我觉得它正在做它的工作,因为我得到以下输出:

[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed

现在我想从所有硬币中获取 4 个图表,而不仅仅是 csv 文件中的最后一个硬币。谁能帮我解决这个问题?提前致谢!

注意:代码的其余部分正在运行并提供正确的值,现在唯一缺少的是从不同硬币获取输出的循环。

我的全部代码是:

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:
        df = yf.download(symbol, start='2020-01-01')

# df = yf.download('ADA-USD', start='2021-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)

# print(df.dropna())

plt.figure(figsize=(12, 6))
# plt.scatter(df.index[df.Buy_Signal], df[df.Buy_Signal].Close, marker = '^', color ='g')
# plt.scatter(df.index[df.Sell_Signal], df[df.Sell_Signal].Close, marker = '^', color ='r')
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.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())

在这一行

df = yf.download(symbol, start='2020-01-01')

您正在将下载结果分配给数据框。但是,每次您创建一个新数据框而不是添加到它时。

因此,您需要通过在 df 上调用一个函数来在循环中用 df 做任何您想做的事情,例如 do_something(df) 或者你可以将它存储在 dfs = []dfs.append(df) 中,然后你将每个数据帧都放在一个数据帧数组中。