# -*- 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量化投资——市值加权+等权重+均值方差+最小方差模型 (1)均值方差策略,均值方差策略旨在通过最大化预期收益率的同时,最小化投资组合的方差(风险)。 (2)最小方差策略,与均值方差策略不同,最小方差策略不考虑投资组合的预期收益率,而是仅仅试图最小化投资组合的方差。 (3)市值加权策略,这是一种简单的投资组合配置策略,其中每个资产的权重与其市值成正比。 (4)等权重策略,在等权重策略中,投资组合中每个资产的权重是相等的。
资源推荐
资源详情
资源评论
收起资源包目录
9.市值加权+等权重+均值方差+最小方差模型.rar (9个子文件)
市值加权+等权重+均值方差+最小方差模型
均值方差策略+最小方差策略+市值加权策略+等权重策略.ipynb 476KB
收益汇总.xlsx 34KB
股票数据.xlsx 367KB
metric.py 5KB
市值加权+等权重.xlsx 6KB
性能比较.xlsx 6KB
__pycache__
metric.cpython-38.pyc 5KB
.ipynb_checkpoints
等权重和市值加权-checkpoint.ipynb 230KB
均值方差策略+最小方差策略+市值加权策略+等权重策略-checkpoint.ipynb 476KB
共 9 条
- 1
资源评论
Python量化投资、代码解析与论文精读
- 粉丝: 7544
- 资源: 36
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功