Python实现交易策略评价指标-夏普比率

1.夏普比率的定义

在投资的过程中,仅关注策略的收益率是不够的,同时还需要关注承受的风险,也就是收益风险比。

夏普比率正是这样一个指标,它表示承担单位的风险会产生多少超额收益。用数学公式描述就是:

S h a r p R a t i o = E ( R p ) − R f σ p SharpRatio = \frac{ E(R_p) - R_f}{\sigma_p} SharpRatio=σpE(Rp)−Rf

参数说明:

E ( R p ) E(R_p) E(Rp): 表示投资组合预期收益率
R f R_f Rf: 表示无风险收益率,一般用国债收益率代替
σ p \sigma_p σp: 投资组合收益率的标准差(投资组合的风险)

2. 计算夏普比率
  1. 获取贵州茅台2015.1.1 ~ 2020.12.31期间的日k数据并保存到文件中

    python 复制代码
    import pandas as pd
    import numpy as np
    import baostock as bs
    
    lg = bs.login()
    # 显示登陆返回信息
    print('login respond error_code:'+lg.error_code)
    print('login respond  error_msg:'+lg.error_msg)
    
    #### 获取沪深A股历史K线数据 ####
    # 获取后复权数据
    rs = bs.query_history_k_data_plus("sh.600519",
        "date,code,open,high,low,close,volume",
        start_date='2015-01-01', end_date='2020-12-31',
        frequency="d", adjustflag="1")
    print('query_history_k_data_plus respond error_code:'+ rs.error_code)
    print('query_history_k_data_plus respond  error_msg:'+ rs.error_msg)
    
    data_list = []
    while (rs.error_code == '0') & rs.next():
        # 获取一条记录,将记录合并在一起
        data_list.append(rs.get_row_data())
    result = pd.DataFrame(data_list, columns=rs.fields)
    
    #### 结果集输出到csv文件 ####   
    result.to_csv("贵州茅台_k_data.csv", index=False)
    print(result)
    
    #### 登出系统 ####
    bs.logout()
  2. 读取贵州茅台日k数据

    python 复制代码
    # 读取贵州茅台的日k数据,读入日期和收盘价
    data = pd.read_csv("贵州茅台_k_data.csv")[['date', 'open', 'high', 'low', 'close']];
  3. 将日k数据转换为年k(计算夏普比率的收益率以年为单位进行计算,当然也可以选择其他周期)

    python 复制代码
    data['date'] = pd.to_datetime(data.date)
    data['year'] = data.date.dt.to_period('Y')
    year_k_data = data.groupby('year').agg({'open':'first', 'high':'max', 'low' :'min', 'close' :'last'})
    print(year_k_data)
  4. 计算每年的年化收益率

    python 复制代码
    year_k_data['return_rate'] = (year_k_data['close'] - year_k_data['open']) / year_k_data['open']
    print(year_k_data)
  1. 计算夏普比率
python 复制代码
# 无风险收益率一般用国债收益率代替,本例中取3%
sharp_ration = (year_k_data['return_rate'].mean() - 0.03) / year_k_data['return_rate'].std()
print(sharp_ration)

1.2137091184299078

相关推荐
全栈练习生8 小时前
Jev 决策模型
python·ai·1024程序员节
LMT流氓兔8 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
光依旧8 小时前
day-trader-skill实测:让Claude Code当交易助理,纯Python+确定性+fail-closed
python·量化交易·ai agent·a股·风控·claude code·开源项目实测
CCblandy9 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化
Sakura_j_h_9 小时前
给 FastAPI 接大模型:超时、重试和 token 成本该怎么管
python·大模型·fastapi·超时重试·token计费
forest_099 小时前
用Python复刻ClaudeDuet:主动式Agent四件套,定时晨报、后台巡检、危险动作审批(附完整可运行代码)
人工智能·python·架构·prompt·agi
小小张说故事10 小时前
Python 的函数调用到底贵在哪?拆开一次 call:51 纳秒栈帧与 *args 的 40 纳秒罚单
python
2401_8858850410 小时前
国际语音C#接口怎么写?.NET环境下实现国际语音验证码批量下发
开发语言·c#·.net
程序猿乐锅11 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节