如何在没有ValueError异常的情况下运行我的最大提款代码?

时间:2019-07-15 18:35:53

标签: python-3.7 valueerror trading algorithmic-trading

我正在尝试练习计算市场中性与多头交易策略的最大跌幅和最大跌幅持续时间。

我将代码一直跟踪到T,直到现在为止,它的性能都非常好,我似乎得到了ValueError Exception。我需要更改什么代码才能工作?

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)

这是我从上述代码中获得的结果:

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上的输出为-0.09529268047208683
maxDrawdwnduration上的输出为497
{{1 }}设为startDrawdownday

1 个答案:

答案 0 :(得分:0)

  

问:要使代码正常工作,我需要更改什么代码?

您的代码使用对numpy函数的调用,该函数的最小调用签名定义为:
np.maximum( <array_like_A>, <array_like_B> )

一旦在报告的行中仅传递了一对预期值(请参见右括号),或者标量或任何其他非数组类型的对象,则这根本无法满足预期的行为)尝试传递到呼叫签名中:

highwatermark[t] = ( np.maximum( highwatermark[t-1] ), cumret[t] )

试图在值分配的右侧构造一个元组(当然,实际上是在python中分配了一个对象引用,但是试图在此处保持简短以快速告诉它)阅读),期望通过调用上面记录的 np.maximum(...) 函数将其第一项分配给返回值。还有 Hic Sunt Leones ...

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

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__ )