首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在没有此ValueError异常的情况下运行我的最大降压代码?

如何在没有此ValueError异常的情况下运行我的最大降压代码?
EN

Stack Overflow用户
提问于 2019-07-16 02:35:54
回答 1查看 101关注 0票数 1

我正在尝试计算市场中性与只做多的交易策略的最大缩水和最大缩水持续时间。

我一直按照代码运行到T,直到现在都工作得很好,而且我似乎得到了一个ValueError Exception。我需要更改哪些代码才能使我的代码工作?

代码语言:javascript
运行
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from MaxDD_Function import calculateMaxDD

# CALCUALTING MAXDD AND CREATING THE FUNCTION.
def calculateMaxDD(cumret):
    highwatermark = np.zeros(cumret.shape)
    drawdown = np.zeros(cumret.shape)
    drawdownduration = np.zeros(cumret.shape)

    for t in np.arange(1, cumret.shape[0]):
        highwatermark[t] = (np.maximum(highwatermark[t -1]), cumret[t])
        drawdown[t] = ((1+ cumret[t] )/(1 + highwatermark[t]) - 1)
        if drawdown[t] == 0:
            drawdownduration[t] == 0
        else:
            drawdownduration[t] = drawdownduration[t -1] + 1

    maxDD, i = np.min(drawdown, np.argmin(drawdown)) # drawdown < 0 always

    maxDDD = np.max(drawdownduration)

    return (maxDD, maxDDD, i)

# First part of example. Read the csv data and calculate.

#The first dataframe/set for my strategy
df = pd.read_csv('IGE_daily.csv')
#print (df.head())

df.sort_values(by= 'Date', inplace = True)

dailyret = df.loc[:, 'Adj Close'].pct_change()

excessRet = ((dailyret - 0.04)/252)

sharpeRatio = ((np.sqrt(252)*np.mean(excessRet))/np.std(excessRet))

print (sharpeRatio)


#Second part of example

#This is the second dataframe/set for my strategy.
df2 = pd.read_csv('SPY.csv')

#The new data frame, with both datasets.
df = pd.merge (df, df2, on = 'Date', suffixes = ('_IGE', '_SPY'))

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace = True)
df.sort_index(inplace = True)
dailyret = df [['Adj Close_IGE', 'Adj Close_SPY' ]].pct_change() # Daily 
Returns
dailyret.rename(columns = {"Adj Close_IGE": "IGE", "Adj Close_SPY": "SPY" 
}, inplace = True)

netRet = (dailyret['IGE'] - dailyret['SPY'])/2

sharpeRatio = np.sqrt(252) * np.mean(netRet)/np.std(netRet)

print (sharpeRatio)



cumret = np.cumprod(1 + netRet) - 1 #Cumalative return

#print (plt.plot(cumret))
#print (plt.show())  # Remember to always run plt.show to see the plot in 
terminal.



maxDrawdown, maxDrawdownDuration, startDrawdownDay = 
calculateMaxDD(cumret.values)

maxDrawdown = calculateMaxDD(cumret.values)
print (maxDrawdown)

下面是我从上面提到的代码中得到的结果:

代码语言:javascript
运行
复制
Ivies-MacBook-Pro:Quant_Trading Ivieidahosa$ python Ex3_4.py
-46.10531783058014
0.7743286831426566
Traceback (most recent call last):
File "Ex3_4.py", line 76, in <module>
maxDrawdown = calculateMaxDD(cumret.values)
File "Ex3_4.py", line 15, in calculateMaxDD
highwatermark[t] = (np.maximum(highwatermark[t -1]), cumret[t])
ValueError: invalid number of arguments

我预计输出将在

maxDrawdown to be -0.09529268047208683

maxDrawdwnduration设置为497

startDrawdownday to be 1223

EN

回答 1

Stack Overflow用户

发布于 2019-07-16 23:02:21

Q:为了让代码正常工作,我需要更改哪些代码?

您的代码使用对具有定义的最小调用签名的numpy函数的调用,如下所示:

np.maximum( <array_like_A>, <array_like_B> )

一旦在报告的行中只传递了预期的值对中的一个(参见右括号),或者试图将标量或任何其他非数组类型的对象传递到调用签名中,这就无法满足预期的行为:

代码语言:javascript
运行
复制
highwatermark[t] = ( np.maximum( highwatermark[t-1] ), cumret[t] )

其中,试图在赋值的右侧构造一个元组(当然,实际上在python中会赋值一个对象引用,但为了便于阅读,这里尽量保持简短),其中的第一项应该被赋值给调用上述np.maximum(...)函数的返回值。和Hic Sunt Leones ...

可能想要通过交叉检查对象的状态和调用签名来开始进一步的错误跟踪:

代码语言:javascript
运行
复制
try:
     for t in np.arange( 1, cumret.shape[0] ):
           print( "The shape of <highwatermark[t-1]>-object was: ",
                                 highwatermark[t-1].shape, " for t == ", t
                   )

except:
     print(                "The <highwatermark[t-1]>-object was not a numpy array",
                                                           " for t == ", t
            )

finally:
     print( np.maximum.__doc__ )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57045421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档