KeyError:"关闭",我想我删除了字典的键!算法交易



当我运行前两个函数CARG和Volatility时,它们运行得很好!当我运行Sharpe时,它会遇到问题!我想我不知怎么删除了字典中的一个键,它指的是我的CAGR函数,并指向其中的第二行,上面写着KeyError:"关闭"。返回的错误信息在的最底部

import yfinance as yf
import numpy as np
import pandas as pd

tickers = ["AAPL","AMC","SPY","BBBY"]
ohlcv_data = {}
for ticker in tickers:
temp = yf.download(ticker, period="7mo", interval="1d")
temp.dropna(how="any", inplace=True)
ohlcv_data[ticker] = temp
def CAGR(DF):

df = DF.copy()
df["return"] = DF["Close"].pct_change()
df["cum_return"] = (1+df["return"]).cumprod()
n = len(df)/252 
CAGR = (df["cum_return"][-1])**(1/n) - 1

return CAGR
for ticker in ohlcv_data:
print("GAGR for {} = {}".format(ticker, CAGR(ohlcv_data[ticker])))

def Volatility(DF):
df = DF.copy()
df["return"] = DF["Close"].pct_change()
vol = df["return"].std() * np.sqrt(252)
return vol
for ticker in ohlcv_data:
print("Volatility of {} = {}".format(ticker, Volatility(ohlcv_data[ticker])))

def Sharpe(DF, rf=0.03):
df = DF.copy()
return (CAGR(df)- rf)/Volatility(df)
for ticker in ohlcv_data:
print("Sharpe for {} = {}".format(ticker, Sharpe(ohlcv_data, 0.03)))
def Sortino(DF, rf=0.03):
df= DF.copy()
df["return"] = df["Close"].pct_change()
neg_return = np.where(df["return"]>0,0,df["return"])
neg_vol = pd.Series(neg_return[neg_return!=0]).std()
return (CAGR(df)- rf)/neg_vol
for ticker in ohlcv_data:
print("Sortino for {} = {}".format(ticker, Sortino(ohlcv_data, 0.03)))


File "c:userscrystonedrivedocumentsalgotradingcodeuntitled11.py", line 56, in <module>
print("Sharpe for {} = {}".format(ticker, Sharpe(ohlcv_data, 0.03)))
File "c:userscrystonedrivedocumentsalgotradingcodeuntitled11.py", line 53, in Sharpe
return (CAGR(df)- rf)/Volatility(df)
File "c:userscrystonedrivedocumentsalgotradingcodeuntitled11.py", line 26, in CAGR
df["return"] = DF["Close"].pct_change()
KeyError: 'Close'

当您运行Sharpe()Sortino()时,我看到了同样的错误

你发送ohlcv_data,但你必须发送ohlcv_data[ticker]

有趣的是,当你运行CAGR()Volatility()时,它是正确的

Sharpe(ohlcv_data[ticker], 0.03)

Sortino(ohlcv_data[ticker], 0.03)
CAGR(ohlcv_data[ticker])
Volatility(ohlcv_data[ticker])

最终您应该使用.items()使其更可读

for ticker, data in ohlcv_data.items():
result = Sharpe(data, 0.03)
# result = Sortino(data, 0.03)
# result = CAGR(data)
# result = Volatility(data)

的完整工作代码

import yfinance as yf
import numpy as np
import pandas as pd
# --- functions ---  # PEP8: all functions before main code
def CAGR(DF):

df = DF.copy()

df["return"] = df["Close"].pct_change()
df["cum_return"] = (1+df["return"]).cumprod()
n = len(df)/252 
CAGR = (df["cum_return"][-1])**(1/n) - 1

return CAGR
def Volatility(DF):
df = DF.copy()

df["return"] = df["Close"].pct_change()
vol = df["return"].std() * np.sqrt(252)
return vol
def Sharpe(DF, rf=0.03):
df = DF.copy()

return (CAGR(df)- rf)/Volatility(df)
def Sortino(DF, rf=0.03):
df = DF.copy()

df["return"] = df["Close"].pct_change()
neg_return = np.where(df["return"]>0,0,df["return"])
neg_vol = pd.Series(neg_return[neg_return!=0]).std()
return (CAGR(df)- rf)/neg_vol
# --- main ---
tickers = ["AAPL","AMC","SPY","BBBY"]
ohlcv_data = {}
for ticker in tickers:
data = yf.download(ticker, period="7mo", interval="1d")
data.dropna(how="any", inplace=True)
ohlcv_data[ticker] = data
for ticker, data in ohlcv_data.items():
result = CAGR(data)
print(f"GAGR for {ticker} = {result}")
for ticker, data in ohlcv_data.items():
result = Volatility(data)
print(f"Volatility of {ticker} = {result}")
for ticker, data in ohlcv_data.items():
result = Sharpe(data, 0.03)
print(f"Sharpe for {ticker} = {result}")
for ticker, data in ohlcv_data.items():
result = Sortino(data, 0.03)
print(f"Sortino for {ticker} = {result}")

结果:

GAGR for AAPL = 0.11355213703707379
GAGR for AMC = -0.5829820257957625
GAGR for SPY = -0.05423536518372174
GAGR for BBBY = -0.4389927079102395
Volatility of AAPL = 0.3471946896720913
Volatility of AMC = 1.3227122428032356
Volatility of SPY = 0.24545485475277398
Volatility of BBBY = 1.5613839405009773
Sharpe for AAPL = 0.24064923664582766
Sharpe for AMC = -0.4634281032257359
Sharpe for SPY = -0.3431806849718452
Sharpe for BBBY = -0.30036988068403025
Sortino for AAPL = 5.847323456223871
Sortino for AMC = -11.478142948375877
Sortino for SPY = -8.132265719790464
Sortino for BBBY = -7.791889967534535

PEP 8——Python代码的样式指南

最新更新