In [1]:
import pandas as pd
import numpy as np
In [12]:
# Sharp Ratio(夏普率)
year_list = []
month_list = []
rtn_list = []
# 随机生成收益率,以半年为周期
for year in range(2006,2017):
for month in [6,12]:
year_list.append(year)
month_list.append(month)
rtn = round((-1)**(month/6)*(month/6/10), 3) + (np.random.random()-0.5)*0.1
rtn_list.append(rtn)
# 生成半年为周期收益率的二维表df
df = pd.DataFrame()
df['year'] = year_list
df['month'] = month_list
df['rtn'] = rtn_list
# 收益率要乘以2,波动率要乘以根号2
sr = round(df['rtn'].mean()/df['rtn'].std() * np.sqrt(2), 3)
print df
print sr
# 直接以年为周期计算夏普率
df_year = df.groupby(['year']).sum()
del df_year['month']
print df_year
sr = round(df['rtn'].mean()/df['rtn'].std(), 3)
print sr
In [23]:
spy = pd.Series([1, 5, 3, 6, 7, 3, 2, 5, 6, 4, 9], index=[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55])
def drawdown(pnl):
"""
pnl is a pandas Series
calculate max drawdown and duration
Returns:
drawdown : vector of drawdwon values
duration : vector of drawdown duration
"""
cumret = pnl
highwatermark = [0]
idx = pnl.index
drawdown = pd.Series(index = idx)
drawdowndur = pd.Series(index = idx)
drawdown.values[0] = 0
drawdowndur.values[0] = 0
for t in range(1, len(idx)) :
highwatermark.append(max(highwatermark[t-1], cumret.values[t]))
cur = cumret.index[t]
drawdown[cur] = (highwatermark[t] - cumret.values[t])
drawdowndur[cur] = (0 if drawdown[cur] == 0 else drawdowndur[cumret.index[t - 1]] + 1)
print highwatermark
return drawdown, drawdowndur
drawdown, drawdowndur = drawdown(spy)
print drawdown.values
print drawdowndur.values
print "The maximum drawdown is : %.2f!" % (drawdown.values.max())
print "The maximum drawdown duration is : %d!" % (drawdowndur.values.max())
In [3]:
spy = pd.Series([1, 5, 3, 6, 7, 3, 2, 5, 6, 4, 9], index=[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55])
def dd(s):
'''
simple drawdown function
'''
highwatermark = np.zeros(len(s))
drawdown = np.zeros(len(s))
drawdowndur = np.zeros(len(s))
for t in range(1, len(s)):
highwatermark[t] = max(highwatermark[t-1], s[t])
drawdown[t] = (highwatermark[t] - s[t])
drawdowndur[t]= (0 if drawdown[t] == 0 else drawdowndur[t-1] + 1)
return drawdown, drawdowndur
drawdown, drawdowndur = dd(spy.values)
print drawdown
print '---------------'
print drawdowndur