# -*- coding: utf-8 -*-
"""
Created on Mon Sep 13 19:35:36 2021
@author: 曹进辉
"""
import numpy as np
import pandas as pd
# 年化收益率
def annualizedRet(r, year_days):
'''
@param r : 每日收益率序列
@param year_days: 一年中交易股票所有交易日期天数(股票开市的天数)一般是250天
@return : 年化收益率
'''
cum_return = (1 + r).prod()
total_days = r.shape[0]
Annual_Returns = cum_return ** (year_days / total_days) - 1
return Annual_Returns
# 年化波动率
def annualizedVol(r, year_days, downside = False):
'''
@param r : 每日收益率序列
@param year_days: 一年中交易股票所有交易日期天数(股票开市的天数)一般是250天
@param downside : 是否计算下行偏差
@return: 年化波动率
'''
if downside:
semistd = r[r < 0].std()
return semistd * (year_days ** 0.5)
else:
return r.std() * (year_days ** 0.5)
# 最大回撤
def drawdown(r):
'''
@param r : 每日收益率序列
@return: 最大回撤
'''
index = 1000 * (1 + r).cumprod()
highwatermark = index.cummax() # .cummax是找到当前节点之前的最大收益率
drawdowns = (index - highwatermark) / highwatermark # 计算回撤
maxdrawdown = drawdowns.min()
return maxdrawdown
# 偏度
def skewness(r):
'''
@param r : 每日收益率序列
@return: 偏度
'''
centerMoment = r - r.mean()
sigR = r.std(ddof=0)
exp = (centerMoment ** 3).mean()
return exp / sigR ** 3
# 峰度
def kurtosis(r):
'''
@param r : 每日收益率序列
@return : 峰度
'''
centerMoment = r - r.mean()
sigR = r.std(ddof=0)
exp = (centerMoment ** 4).mean()
return exp / sigR ** 4
# VaR
def varGaussian(r, level=5, modified=False):
'''
@param r : 每日收益率序列
@param level: 置信水平
@param modified: 使用泰勒展开式修正VaR
@return: Value at Risk-风险价值
'''
from scipy.stats import norm
z = norm.ppf(level / 100)
if modified is True:
s = skewness(r)
k = kurtosis(r)
z = (z +
(z ** 2 - 1) * s / 6 +
(z ** 3 - 3 * z) * (k - 3) / 24 -
(2 * z ** 3 - 5 * z) * (s ** 2) / 36
)
return - (r.mean() + z * r.std(ddof=0))
# 夏普比率
def sharpeRatio(r, rf, year_days):
'''
@param r : 每日收益率序列
@param rf : 无风险收益率
@param year_days : 一年当中有多少个交易日
@return: 夏普比率,也称风险调整后的return
'''
# 将无风险收益率转换成日收益率,然后才能进行相加或者相减
rf = (1 + rf) ** (1 / year_days) - 1
excessRets = r - rf
annExcessRets = annualizedRet(excessRets, year_days)
annVol = annualizedVol(r, year_days)
return annExcessRets / annVol
def sortinoRatio(r,rf, year_days):
'''
@param r : 每日收益率序列
@param rf : 无风险收益率
@param year_days : 一年当中有多少个交易日
@return : 夏普比率,也称风险调整后的return
'''
rf = (1 + rf) ** (1 / year_days) - 1
excessRets = r - rf
annExcessRets = annualizedRet(excessRets, year_days)
anndownsideVol = annualizedVol(r, year_days, downside=True)
return annExcessRets / anndownsideVol
def summary_stats(r, riskFree=0, periodsInYear=252):
'''
@param r : 每日收益率序列
@param riskFree: 无风险收益率
@param year_days : 一年当中有多少个交易日
@return: 各个策略的性能(DataFrame)
'''
if not isinstance(r,pd.DataFrame):
r = pd.DataFrame(r)
# aggregate表明每一列均调用此函数,聚集函数
annR = r.aggregate(annualizedRet,year_days = periodsInYear)
annVol = r.aggregate(annualizedVol, year_days= periodsInYear)
dd = r.aggregate(lambda r: drawdown(r))
skew = r.aggregate(skewness)
kurt = r.aggregate(kurtosis)
modVar = r.aggregate(varGaussian, level=5, modified=True)
sharpe = r.aggregate(sharpeRatio, rf=riskFree, year_days = periodsInYear)
sortino = r.aggregate(sortinoRatio, rf = riskFree, year_days = periodsInYear)
stats = pd.DataFrame({
'Annualized Returns': annR*100,
'Annualized Volatility': annVol*100,
'Sharpe Ratio': sharpe,
'Sortino Ratio': sortino,
'Max Drawdown': dd*100,
'Skewness': skew,
'Kurtosis': kurt,
'Cornish Fisher adj. VAR 5%': modVar*100,
})
#formatting
stats['Annualized Returns'] = stats['Annualized Returns'].map('{:,.2f}%'.format)
stats['Annualized Volatility'] = stats['Annualized Volatility'].map('{:,.2f}%'.format)
stats['Sharpe Ratio'] = stats['Sharpe Ratio'].map('{:,.2f}'.format)
stats['Sortino Ratio'] = stats['Sortino Ratio'].map('{:,.2f}'.format)
stats['Max Drawdown'] = stats['Max Drawdown'].map('{:,.2f}%'.format)
stats['Skewness'] = stats['Skewness'].map('{:,.2f}'.format)
stats['Kurtosis'] = stats['Kurtosis'].map('{:,.2f}'.format)
stats['Cornish Fisher adj. VAR 5%'] = stats['Cornish Fisher adj. VAR 5%'].map('{:,.2f}%'.format)
return stats.T
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Python机器学习量化选择的全流程简介,包括XGBoost、支持向量机(SVM)、随机森林(RF)和决策树(DT)的内容:性能评估 这里有一些关于Python机器学习量化选择全流程的性能评估指标: 1. 准确性(Accuracy) 2. 精确度(Precision)和召回率(Recall) 3. F1分数 4. AUC-ROC(曲线下面积) 5. 回报率(Returns)(夏普比率、最大回撤等
资源推荐
资源详情
资源评论
收起资源包目录
Python机器学习量化选股全流程.rar (4个子文件)
daily_hfq.csv 38.3MB
沪深300指数.xls 103KB
Python基于机器学习的股票涨跌趋势预测模型搭建(多只)-技术指标.ipynb 263KB
metric.py 5KB
共 4 条
- 1
资源评论
Python量化投资、代码解析与论文精读
- 粉丝: 7540
- 资源: 36
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- #P0015. 全排列 超级简单
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功