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.columnselse: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 = 242elif Period is 'W' or 'WEEK' or 'WEEKLY': # 周频数据T = 49elif Period is 'M' or 'MONTH' or 'MONTHLY': # 月频数据T = 12elif Period is 'S' or 'SEASON' or 'SEASONAL' or 'Q' or 'Quarter' or 'Quarterly': # 季频数据T = 4elif Period is 'Y' or 'YEAR' or 'YEARLY': # 年化数据T = 1else: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.kurtosis(r_series[i] * T))# Step 4: 返回函数值outcome = pd.DataFrame({'Return':r, 'Sigma':sigma, 'R/S': R_S, 'Skew':skew, 'Kurt':kurt}, index = columns)[indicators]if output_type.upper() == 'LIST':return np.transpose(outcome.values.tolist())else:return outcome#######################################
####### Module 2: 净值序列计算模块 #######
#######################################
# 1. 最大回撤类名称索引函数(支持最大回撤、最大回撤比率和最大回撤长度)
def MDD_indicators():return ['MDD', 'MDD_R', 'MDD_P']# 2. 计算一维序列的最大回撤族指标
def MDD_single(nv_series, output = 'All', output_type = 'DataFrame'):"""计算最大回撤、最大回撤率与最大回撤周期。算法时间复杂度:O(n):param nv_series: list格式,净值序列:param output: str格式,返回指定指标代码。默认为返回全部指标。:param output_type: str格式,输出格式(可以输入:'list', 'dataframe'。默认输出格式为 dataframe):return:"""output = str(output).upper()# Step 1: 计算回撤指标start = start_temp = 0 # 最大回撤起始点临时指针end = end_temp = 0 # 最大回撤结束点临时指针for i in range(1, len(nv_series)):if nv_series[i] > nv_series[start_temp]:start_temp = iend_temp = ielif nv_series[i] < nv_series[end_temp]:end_temp = iif (nv_series[start_temp] - nv_series[end_temp]) > (nv_series[start] - nv_series[end]):start = start_tempend = end_tempif start == end:  #若没有任何回撤start = end = 0MDD = nv_series[start] - nv_series[end] #最大回撤MDD_RATE = (nv_series[start] - nv_series[end]) / nv_series[start] #最大回撤比率MDD_PERIOD = end - start #最大回撤周期# Step2: 返回对应的回撤指标if output == 'MDD':return MDDelif output == 'MDD_R':return MDD_RATEelif output == 'MDD_P':return MDD_PERIODelse:if output_type.upper() == 'LIST':return [MDD, MDD_RATE, MDD_PERIOD]else:outcome = pd.DataFrame({'MDD':MDD, 'MDD_R': MDD_RATE, 'MDD_P':MDD_PERIOD})return outcome# 3. 计算多个净值序列的最大回撤族指标
def MDD(nv_series, indicators=MDD_indicators(), output_type='pd.DataFrame'):"""指标计算函数:param nv_series: 输入的净值序列(既可以是二维list格式,也可以是pd.DataFrame格式):param indicators: str格式或list格式,希望输出的风险指标(可以输入MDD_indicators()中的指标,默认为全部输出):param output_type: str格式,输出格式(可以输入:'list', 'dataframe'。默认输出格式为 dataframe):return: pd.DataFrame"""# Step 1: 设置策略名称columns = set_name(nv_series)# Step 2: 计算各指标MDDs = []for i in range(len(nv_series)):MDD_i = MDD_single(nv_series[i], output = 'all', output_type = 'list')MDDs.append(MDD_i)# Step 3: 设置输出格式if output_type.upper() == 'LIST':return MDDselse:outcome = pd.DataFrame(MDDs, columns = ['MDD', 'MDD_R', 'MDD_P'], index = columns)[indicators]return outcome########################################
####### Module 3: 尾部风险计算模块  #######
########################################
# 1. VaR类指标(支持VaR和CVaR)
def VaR_indicators():return ['VaR', 'CVaR']# 2. VaR指标计算
def VaR(r_series, alpha = 0.05, indicators = VaR_indicators(), output_type = 'pd.DataFrame'):""":param r_series: 二维list类型或DataFrame类型。:param alpha: float类型。设置置信度(默认为0.05):param indicators: list格式,选择输出哪些矩量(可以输入:VaR_indicators()函数中的全部指标。默认全部变量):param output_type: str格式,输出格式(可以输入:'list', 'dataframe'。默认输出格式为 dataframe):return:"""# Step 1: 处理序列输入模块columns = set_name(r_series)# Step 2: 计算矩变量VaR = []CVaR = []for i in range(len(r_series)):loc = int(alpha * len(r_series[i])) # 寻找VaR点位置r_series_sort = np.sort(r_series[i])VaR.append(np.max([0, -r_series_sort[loc]]))CVaR.append(np.max([0, -np.mean(r_series_sort[0:(loc+1)])]))# Step 3: 返回函数值outcome = pd.DataFrame({'VaR': VaR, 'CVaR': CVaR}, index=columns)[indicators]if output_type.upper() == 'LIST':return np.transpose(outcome.values.tolist())else:return outcome########################################
####### Module 4: 其他表现指标模块  #######
########################################
# 1. 一元回归模型(x为因变量,y为自变量,输入变量可以是一维array或一维list)
def SLR(x, y):""":param x: list类型或array类型。自变量。:param y: list类型或array类型。因变量。:return: 返回类型为元组"""x = list(x)y = list(y)n = len(x)dinominator = 0numerator = 0for i in range(n):numerator += (x[i] - np.mean(x)) * (y[i] - np.mean(y))dinominator += (x[i] - np.mean(x)) ** 2beta = numerator / float(dinominator) # 计算斜率项alpha = np.mean(y) - beta * float(np.mean(x)) # 计算截距项return (alpha, beta)# 2. Performance类指标(支持夏普比率SR、下行风险DR、赔率Odd、詹森Alpha、系统风险Beta和特雷诺比率TR)
def Performance_indicators():return ['Odd', 'DR', 'SR', 'Alpha', 'Beta', 'TR']# 3. Performance类指标计算模块
def Performance(r_series, rf_series = None, bm_series = None, Period = 'Y', indicators = Performance_indicators(), output_type = 'pd.DataFrame'):# Step 1: 处理周期输入变量T = set_period(Period)# Step 2: 处理序列输入模块columns = set_name(r_series)# Step 3: 指标计算Odd = [] # 组合赔率DR = [] # 下行风险SR = [] # 夏普比率 Sharpe Ratio(需要输入无风险利率)Alpha = [] # 詹森Alpha (需要输入无风险利率和基准收益序列)Beta = [] # 系统性风险Beta(需要输入无风险利率和基准收益序列)TR = [] # 策略的特雷诺比率(需要输入无风险利率和基准收益序列)for i in range(len(r_series)):# (1)计算策略的赢率n_win = np.sum(list(map(lambda x: x >= 0, r_series[i])))n_lose = np.sum(list(map(lambda x: x < 0, r_series[i])))if n_lose != 0:Odd.append(n_win/n_lose)else:Odd.append(np.inf)# (2) 计算策略的下行风险sum = 0for j in range(len(r_series[i])):ave = np.mean(r_series[i])if r_series[i][j] < ave:sum += (r_series[i][j] - ave)**2DR.append(np.sqrt(sum/(len(r_series[i])-1)) * np.sqrt(T))# (3)计算策略的夏普比率if r_series is not None:rf = np.mean(rf_series)SR.append((np.mean(r_series[i]) - rf) / np.std(r_series[i]) * np.sqrt(T))# (4) 计算策略的系统风险beta和詹森alpha:if bm_series is not None:alpha, beta = SLR(np.array(bm_series) - rf, np.array(r_series[i]) - rf)Alpha.append(alpha)Beta.append(beta)# (5) 计算策略的特雷诺比率TR.append((np.mean(r_series[i]) - rf) / beta * T)# Step 4: 返回函数值if rf_series is not None and bm_series is not None:outcome = pd.DataFrame({'Odd': Odd, 'DR': DR, 'SR': SR, 'Alpha': Alpha, 'Beta': Beta, 'TR': TR}, index=columns)[indicators]elif rf_series is not None and bm_series is None:ids = [id for id in indicators if id in ['Odd', 'DR', 'SR']]outcome = pd.DataFrame({'Odd': Odd, 'DR': DR, 'SR': SR}, index=columns)[ids]else:ids = [id for id in indicators if id in ['Odd', 'DR']]outcome = pd.DataFrame({'Odd': Odd, 'DR': DR}, index=columns)[ids]if output_type.upper() == 'LIST':return np.transpose(outcome.values.tolist())else:return outcome##############################
## Module 5: 汇总输出计算模块  ##
##############################
# 1. 风险指标汇总输出
def Risk_Indicators(r_series, nv_series, rf_series = None, bm_series = None, Period = 'Y', Indicators = 'All', alpha = 0.05, output_type = 'pd.DataFrame'):# Step 1: 计算全部风险指标Risks = pd.concat([Annualized_Moment(r_series, Period = Period),MDD(nv_series),VaR(r_series, alpha = alpha),Performance(r_series, rf_series = rf_series, bm_series = bm_series, Period = Period)], axis=1)# Step 2: 找到对应的风险指标# 若为“ALL”指令,则把库函数中设置的全部风险指标全部打印出来if type(Indicators) == str and Indicators.upper() == 'ALL':pass# 若为指标集,则应从指标库中找出对应的风险指标,剔除不存在的指标(剔除的指标以warning形式输出)else:Indicators_Moment = [indicator for indicator in Indicators if indicator in Annualized_Moment_indicators()]Indicators_MDD = [indicator for indicator in Indicators if indicator in MDD_indicators()]Indicators_VaR = [indicator for indicator in Indicators if indicator in VaR_indicators()]Indicators_Performance = [indicator for indicator in Indicators if indicator in Performance_indicators()]Indicators_All = Indicators_Moment + Indicators_MDD + Indicators_VaR + Indicators_PerformanceRisks = Risks[Indicators_All]output_type = str(output_type)# Step 3: 按给定输出格式if output_type.upper() == 'LIST': # 以list格式输出return np.transpose(Risks.value.tolist())else: # 否则,以默认格式输出。默认格式为pd.DataFramereturn Risks####### Test Run ########
def test():r_series = [[0.012, 0.032, -0.04, -0.013, -0.034, 0.0045, 0.002, 0.023, 0, 0, 0, 0, 0],[0.012, 0.032, -0.04, -0.013, -0.034, 0.0045, 0.002, 0.023, 0, 0, 0, 0, 0]]#r_series = pd.DataFrame(np.transpose(r_series), columns=['纯股策略', '纯债策略'])nv_series = [[1, 1.1, 1.21, 1.3, 1.2, 1.1, 1.12, 1.13, 1.08, 1.06],[1, 1.01, 1.021, 1.03, 1.02, 1.01, 1.012, 1.013, 1.008, 1.006]]rf = 0.0008bm_series = [0.012, 0.032, -0.04, -0.013, -0.034, 0.0045, 0.002, 0.023, 0, 0, 0, 0, 0]Period = 'D'Indicators = 'ALL'alpha = 0.05output_type = 'DataFrame'Risks = Risk_Indicators(r_series, nv_series, rf_series=rf, bm_series=bm_series, Period=Period,Indicators=Indicators, alpha=alpha, output_type=output_type)# 打印风险值情况print(Risks[Risks.columns[:5]])print(Risks[Risks.columns[5:10]])print(Risks[Risks.columns[10:]])#test()

版权声明

本文所附代码为作者原创,版权归作者所有,未经允许或授权不得转载或用于商业用途。

【基于python的量化策略回测框架搭建】策略表现衡量指标模块相关推荐

  1. python量化回测框架_股票量化交易回测框架pyalgotrade源码阅读(一)

    PyAlgoTrade是什么呢? 一个股票量化交易的策略回测框架. 而作者的说明如下. To make it easy to backtest stock trading strategies. 简单 ...

  2. 【mindgo】 爱问财策略回测框架(分钟级回测)

    # 爱问财策略回测框架(分钟级回测)import datetime# 初始化账户 def init(context):# 设置策略问句get_iwencai('非停牌;非st;业绩预增大于50%:市值 ...

  3. python 量化策略回测_在python中创建和回测对交易策略

    python 量化策略回测 Pairs trading is one of the many mean-reversion strategies. It is considered non-direc ...

  4. 6款优秀的量化交易回测框架!VNPY位居第一

    一个策略从想法,到测试,在到实盘,然后改进,进入另一个循环,需要很多的时间和精力.这时候选择一款高效.灵活的测试系统就是当务之急了.即使最后你可能需要写自己的系统,但是这些框架的软工架构还是很值得借鉴 ...

  5. Pyalgotrade量化交易回测框架

    现在就开始干活了.先要测试一下pyalgotrade回测数据对不对.我找了个参照标准:在聚宽上开通了个账号,按入门教程写了个策略:2016-2018年每个交易日买入100股平安银行(000001),回 ...

  6. python tushare backtrader股票回测双均线策略

    前言: 在前面学了点机器学习知识后,发现自己还没有一个回测框架,找了短时间学习资料,还是决定使用backtrader,至于聚宽优米那些平台感觉使用起来好像没那么自由,还是先学习下backtrader, ...

  7. python ui自动化测试框架_基于python语言下的UI自动化测试框架搭建(一)

    最近在搭一个UI自动化测试框架,想把整个搭建过程分享出来,如果有不对的地方,希望大家能够指正,首先创建一个名称为,antomation_framework_demo的工程文件, pycharm中工程及 ...

  8. 基于python语言下的UI自动化测试框架搭建(四)

    testsuits:案例执行 创建baidu_search1.py文件,这里会展示两种执行方式,一种是直接调用base_page中封装好的常用操作方法,另外一种是先调用baidu_homepage.p ...

  9. python量化策略源码_Python量化交易进阶讲堂-创建自定义量化回测框架

    欢迎大家订阅<Python实战-构建基于股票的量化交易系统>小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍,并且会有选择地收录至小册中,更便于广大读 ...

  10. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    1 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的,交易将无利可图.均值回归是金融学的一个重要概念,指股票价格无 ...

最新文章

  1. win7删除计算机库文件,win7怎么将“库”从资源管理器导航栏中删除【图文】
  2. shell 输出数据到文本_Linux运维工程师从基础到进阶:Shell变量知识梳理
  3. 十八、梯度下降与反向传播
  4. Linux - chmod
  5. c# 单元测试工程如何取得当前项目路径
  6. 巧识滤波、稳压、比较、运放电路
  7. 2017-12-04HTML table布局
  8. (转)Django ==== 实战学习篇九 在session中保存购物车
  9. python ide是什么意思_初学Python使用什么IDE会更好?
  10. Swagger UI 可视化 web API 文档、Multiple Dockets with the same group name are not supported.
  11. 360安全浏览器安装adblock plus
  12. 谷歌浏览器如何截全屏长图,超级方便实用
  13. Windows系统口令扫描之——使用NTScan扫描Windows口令
  14. 明翰英语教学系列之形容词与副词篇V0.1(持续更新)
  15. 现代控制理论(机器人方向)习题与实践补充资料和复习说明(2019版)
  16. linux的命令解释器-----shell
  17. 【windows】在控制面板卸载软件的时候,出现2502,2503的问题
  18. 玩转curl指令—测试简单的HTTP接口
  19. 将折旧表分配至公司代码时提示公司代码分录不完全解决方案
  20. 我英语不好,能学会编程吗?你觉得呢 ?

热门文章

  1. Vue拦截器报错Uncaught (in promise) TypeError Cannot read properties of undefined (reading ‘code‘)
  2. 安利一个简单实用的小技巧:图片怎么批量改尺寸
  3. 麻省理工大学公开课笔记:算法导论(二)——课程简介及算法分析
  4. python数据分析基础之处理word格式文件
  5. Aerospike SSD模式下写入swb内的记录格式
  6. 完全免费:鲜为人知的桌面正文内容检索工具(支持epub/mobi/azw3/markdown)
  7. A Knee_Guided Evolutionary Algorithm for Compressing Deep Neural Network (KGEA)解读
  8. win11窗口桌面管理器突然很吃内存?
  9. linux系统盘下垃圾文件,Linux版一键清理系统垃圾文件
  10. 计算机组成与原理名词解释,计算机组成原理名词解释与简答