首页 > 解决方案 > 如何在 Python 中比较和排名 ETF?

问题描述

希望你一切都好?

所以我最近开始尝试交易算法。我正在尝试创建一个 ETF 轮换策略。我正在为如何比较etfs之间的回报而苦苦挣扎?(底部错误)我犯了一个简单的错误吗?你能给我一些关于我需要做什么来对它们进行排名的指示,因为我不想写数百个 if 语句,有什么捷径吗?

感谢您的任何建议!(这不是完整的代码)

import pandas as pd
import numpy as np
import yfinance as yf
import datetime as dt
from pandas_datareader import data as pdr


yf.pdr_override()
now = dt.datetime.now()
start = dt.datetime(2018,1,1)
emasUsed = [60] 
etfs = ['FDN','IBB','IEZ','IGV','IHE','IHF','IHI','ITA','ITB','IYJ','IYT','IYW','IYZ'
        ,'KBE','KCE','KIE','PBJ','PBS','SMH','VNQ','XLB','XLP','XLU','XOP','XRT']
monthly_return = []
top_etfs = [None,None,None,None,None,None]
total = 0

##for etf in etfs:
##    df = pdr.get_data_yahoo(etf, start, now)
##    monthly_returns = df['Adj Close'].resample('M').ffill().pct_change()      
##    #print("ETF: ",etf," Monthly Returns: ",monthly_returns)
##    monthly_return.append(str(monthly_returns))
##    for i in range(30):
##        daily_returns = df['Adj Close'].resample('D').ffill().pct_change()
##        cumulative_returns = (daily_returns + 1).comprod()
##        print(cumulative_returns)
        

df = pdr.get_data_yahoo(etfs, start, now)
daily_return = (df['Adj Close'].pct_change())
monthly_return = (df['Adj Close'].resample('M').ffill().pct_change())
print(monthly_return)
print(daily_return)

for i in df.index:
    print(daily_return['FDN'])
    if daily_return['FDN'] > daily_return['IBB']:
        print("FDN is better than IBB")
    else:
        print("IBB is better than FDN")

if daily_return['FDN'] > daily_return['IBB']:文件“C:\Python\Python37\lib\site-packages\pandas\core\generic.py”,第1479行,非零 f“的真值a {type(self) .name } 不明确。" ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

标签: pythonalgorithmalgorithmic-tradingtrading

解决方案


发生错误是因为您尝试对系列本身而不是系列成员进行数字比较。另请注意,第一个数据点是 [2018-01-01 00:00:00 NaN]

所以在你的代码中应该是

for i in df.index[1:]:
    if daily_return['FDN'][i] > daily_return['IBB'][i]:
       ...

推荐阅读