1. 代码模块用途说明
本模块为量化策略回测框架中的指标系统,该模块用于衡量策略表现,现可支持如下指标:
表 1:回测系统策略表现衡量指标及说明
指标名称 | 代码指标 | 指标含义说明 |
---|---|---|
年化收益率 | Return | 策略的年化收益率 |
年化波动率 | Sigma | 策略的年化波动率 |
收益-风险比 | R/S | 策略年化收益率:策略年化波动率 |
偏度 | Skew | 策略收益率序列的偏度 |
峰度 | Kurt | 策略收益率序列的峰度 |
最大回撤 | MDD | 策略净值序列的最大回撤值 |
最大回撤比率 | MDD_R | 策略净值序列的的最大回撤比率 |
最大回撤周期 | MDD_P | 策略净值序列的的最大回撤周期长度 |
在险价值 | VaR | 策略最坏条件下的损失情况 |
条件在险价值 | CVaR | 策略最坏条件下的平均损失 |
策略赢率 | Odd | 策略正收益天数-负收益天数比率 |
下行风险(半方差) | DR | 低于平均收益率与均值的均方和 |
夏普比率 | SR | 策略单位波动率上的收益率 |
詹森Alpha | Alpha | 策略收益率无法由市场风险解释的收益 |
系统性风险 | Beta | 策略收益率在市场风险中的暴露敞口 |
特雷诺比率 | TR | 策略单位系统风险上的收益率 |
注:本模块会随着需求而升级换代。现在的版本为0.0.2,最后更新时间:5/29/2020
更新日志
0.0.1 版功能更新
该版本为原始版本。发布时间5/18/2020.
0.0.2 版功能更新
发布时间:5/29/2020
(1)加入Performance模块,加入更多指标
(2)修改了CVaR模块算法的bug
(3)收益序列和净值序列暂时仅支持二维list类型输入,暂不支持DataFrame格式,会在下一版本进行更新==
2. 代码块
# -*- coding: utf-8 -*-
# author: Mikey_Sun time: 5/16/2020
# all copyright belongs to the author. NO COPY ALLOWED.
import numpy as np
import pandas as pd
import math
from scipy import stats
##################################
##### Module 0: 更新版本说明 ######
##################################
def print_version():
version = '0.0.2'
print("现在版本为:{}".format{
version})
#########################################
##### Module 1: 名称、格式相关的内嵌模块 ####
#########################################
# 1. 设置策略名称(若收益序列为DataFrame格式,则保留该策略名称;否则根据输入顺序命名为“策略x号”)
def set_name(r_series):
columns = []
if type(r_series) == pd.DataFrame:
columns = r_series.columns
else:
for i in range(len(r_series)):
columns.append("策略" + str(i+1) + "号")
return columns
# 2. 设置收益序列的频率
def set_period(Period):
T = 1 # 首先默认参数为年化指标
Period = str(Period).upper()
if Period is 'D' or 'DAY' or 'DAILY': # 日频数据
T = 242
elif Period is 'W' or 'WEEK' or 'WEEKLY': # 周频数据
T = 49
elif Period is 'M' or 'MONTH' or 'MONTHLY': # 月频数据
T = 12
elif Period is 'S' or 'SEASON' or 'SEASONAL' or 'Q' or 'Quarter' or 'Quarterly': # 季频数据
T = 4
elif Period is 'Y' or 'YEAR' or 'YEARLY': # 年化数据
T = 1
else:
pass # 可以进一步拓展
return T
#########################################
## Module 1: 收益率序列一阶至三阶矩计算模块 ##
#########################################
# 1. 矩量名称索引函数(支持一阶、二阶、三阶、四阶矩量)
def Annualized_Moment_indicators():
return ['Return', 'Sigma', 'R/S', 'Skew', 'Kurt']
# 2. 矩量计算函数
def Annualized_Moment(r_series, Period = 'Y', indicators = Annualized_Moment_indicators(), output_type = 'DataFrame'):
"""
计算序列样本矩。矩算法时间复杂度:O(m·n)
:param r_series: 收益率数据,默认格式为pd.DataFrame
:param Period: str格式,输入的收益率数据频率(可以输入:‘D’(日频)、 ‘W’(周频)、 ‘M’(月频)、 ‘S’(季频)、 ‘Y’(年频)。默认收益率序列为年频数据)
:param indicators: list格式,选择输出哪些矩量(可以输入:Annualized_Moment_indicators()函数中的全部指标。默认全部矩量值)
:param output_type: str格式,输出格式(可以输入:'list', 'dataframe'。默认输出格式为 dataframe)
:return: pd.DataFrame
"""
# Step 1: 处理周期输入变量
T = set_period(Period)
# Step 2: 处理序列输入模块
columns = set_name(r_series)
# Step 3: 计算矩变量
r = []
sigma = []
skew = []
kurt = []
R_S = []
for i in range(len(r_series)):
r.append(np.mean(r_series[i]) * T)
sigma.append(np.std(r_series[i]) * math.sqrt(T))
R_S.append(r[i]/sigma[i])
skew.append(stats.skew(r_series[i] * T))
kurt.append(stats