当我运行前两个函数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代码的样式指南