首页 > 编程语言 >Python量化交易系统实战--计算交易指标

Python量化交易系统实战--计算交易指标

时间:2024-04-13 09:02:41浏览次数:30  
标签:实战 夏普 return Python pct -- 计算 close data

 作者:麦克煎蛋   出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!

  本节主要包括以下内容:

1、计算涨跌幅

使用shift函数计算涨跌幅

def calculate_change_pct(data):
    """
    涨跌幅 = (当期收盘价-前期收盘价) / 前期收盘价
    :param data: dataframe,带有收盘价
    :return: dataframe,带有涨跌幅
    """
    data['close_pct'] = (data['close'] - data['close'].shift(1)) \
                        / data['close'].shift(1)
    return data

其实也可以用更简单的计算方法:

data['close'].pct_change()

2、计算单次收益率

def calculate_prof_pct(data):
    """
    计算单次收益率:开仓、平仓(开仓的全部股数)
    :param data:
    :return:
    """
    # 筛选信号不为0的,并且计算涨跌幅
    data.loc[data['signal'] != 0, 'profit_pct'] = data['close'].pct_change()
    data = data[data['signal'] == -1]  # 筛选平仓后的数据:单次收益
    return data

3、计算累计收益率

累计收益率的计算理论:

理财产品(本金100元)

第1天:3% :(1+3%) ✖ 100 = 103
第2天:2% :(1+2%)✖ 以上 = 103 +2.06
第3天:5% : (1+5%)✖ 以上 = 收益 ✖ 以上
第4天:6% :(1+6%)✖ 以上 = 收益 ✖ 以上
第n天:累计收益 = (1+当天收益率)的累计乘积-1
这里的计算公式为什么需要减1呢? 因为我们上面的公式都是包括本金的,比如说103应该减去100,只有3元才是我们的利润,所以这里需要减去1,将本金去掉。

代码计算时重点是要理解cumprod的使用方法:

def calculate_cum_prof(data):
    """
    计算累计收益率(个股收益率)
    :param data: dataframe
    :return:
    """
    # 累计收益
    data['cum_profit'] = pd.DataFrame(1 + data['profit_pct']).cumprod() - 1
    return data

4、计算风险指标:最大回撤

股票最大回撤是指股票或投资组合在特定时期内,从最高点跌至最低点的最大幅度。

这个指标反映了投资的潜在损失,是评估投资风险的一个重要方式。例如,如果某股票的价格在一段时间内从最高点100元降至最低点80元,那么其最大回撤为20%。

视频作者中采用了(谷值 — 峰值),我感觉是不是应该反过来计算。

def caculate_max_drawdown(data, window=252):
    """
    计算最大回撤比
    :param data:
    :param window: int, 时间窗口设置,默认为252(日k)
    :return:
    """
    # 模拟持仓金额:投入的总金额 *(1+收益率)
    # data['close'] = 10000 * (1 + data['cum_profit'])

    # 选取时间周期中的最大净值
    data['roll_max'] = data['close'].rolling(window=window, min_periods=1).max()

    # 计算当天的回撤比 = (谷值 — 峰值)/峰值 = 谷值/峰值 - 1
    data['daily_dd'] = data['close'] / data['roll_max'] - 1

    # 选取时间周期内最大的回撤比,即最大回撤
    data['max_dd'] = data['daily_dd'].rolling(window, min_periods=1).min()

    return data

5、计算风险收益指标:夏普比率

夏普比率(Sharpe Ratio),又称为夏普指数,是一种用于评估基金或投资组合绩效的指标。

夏普比率基于现代投资理论,特别是在资本资产定价模型(CAPM)的基础上发展起来的。

夏普比率通过将投资组合的超额收益(即超过无风险利率的部分)除以该组合的标准差(即风险)来计算,这个比率反映了单位风险所带来的超额回报。

夏普比率越大,表明投资组合在相同风险下能够获得更高的超额回报,或者在同一超额回报下承担更低的风险。

夏普比率的一个重要应用是帮助投资者在承受相同风险的情况下选择那些能够提供更高预期回报的投资组合,或者在预期回报相同的情况下选择风险更低的投资组合。

def calculate_sharpe(data):
    """
    计算夏普比率,返回的是年化的夏普比率
    :param data: dataframe, stock
    :return: float
    """
    # 公式:sharpe = (回报率的均值 - 无风险利率) / 回报率的标准差
    daily_return = data['close'].pct_change()  # 演示部分
    # daily_return = data['profit_pct']  # 策略应用后
    avg_return = daily_return.mean()
    sd_return = daily_return.std()

    # 计算夏普:每日收益率 * 252 = 每年收益率
    sharpe = avg_return / sd_return
    sharpe_year = sharpe * np.sqrt(252)

    return sharpe, sharpe_year

 

标签:实战,夏普,return,Python,pct,--,计算,close,data
From: https://www.cnblogs.com/mazhiyong/p/18132247

相关文章

  • P3313 [SDOI2014] 旅行
    题目大意给定一颗树与一些集合。树上的每个结点一开始都属于一个集合,且都拥有一个点权。定义\(C_x\)表示\(x\)结点所处的集合。维护一些操作:将结点\(x\)改到\(c\)集合中。将结点\(x\)的权值改为\(w\)。求出\(x\)到\(y\)链上所有位于\(C_x\)的结点点权最大......
  • 你在信奥上能走多远?
    题目描述叶老师有很多学生,在算法竞赛上取得了非常好的成就,在工作后也非常出色。那么你能在信奥上走多远?假设每个人起始分为0,根据以下规则,最后的得分越高,你就能走得越远。(1)如果你对信奥非常感兴趣,加30分,有兴趣或者想去了解产生兴趣加5分,一点也不感兴趣扣30分(2)如果你是5年级及以......
  • HBuildx如何启用IOS真机调试?
    制作标准基座:安装爱思助手(www.i4.cn),用爱思助手制作ipa签名。添加ipa文件: 添加Hbuildx所在目录:HBuilderX.3.7.3.20230223\HBuilderX\plugins\launcher\base下的iPhone_base.ipa 添加之后勾选,选择使用AppleID签名,这里需要登录你的苹果ID,然后点开始签名。签名成功之后打......
  • windows下的重装是最笨也是最简单的重复解决问题的方法,解决goldendict的qt库链接问题
    goldendict✔goldendict:symbollookuperror:goldendict:undefinedsymbol:_ZN10QAudioSink12stateChangedEN6QAudio5StateE,versionQt_6~yay-Sgoldendict......
  • 在线直播系统源码,前后端大文件上传代码分析
    在线直播系统源码,前后端大文件上传代码分析前端代码:<template><div><[email protected]="hanldeClick"class="upload_container"><inputname="请上传文件"type="file"ref="uploadRef"......
  • MD5哈希长度延展攻击
    1.哈希长度延展攻击的机制哈希长度延展攻击利用的是哈希函数如MD5和SHA-1的特性。当计算哈希时,如果攻击者知道原始数据的哈希值但不知道原始数据内容,他们仍然可以在原始数据后添加一些数据,并且能计算出新数据串的哈希值,而不需要知道原始数据是什么。对于MD5哈希函数,攻击者利用......
  • CF1837E Play Fixing 题解
    首先来考虑什么情况方案数为\(0\):可以确定,在某一层中,两个原本都能晋级的队伍比赛;可以确定,在某一层中,两个原本都不能晋级的队伍比赛。发现假如写出每一场比赛及其胜者,可以形成一棵树形结构,在里面打标记即可判断是否为\(0\)。我们设\(a_i\)表示第\(i\)层新加的队伍中位......
  • C++ Prime 学习
    C++利用using语句:其一:指定别名点击查看代码intp[4][4]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};for(int(*i)[4]=p;i!=p+4;i++){ for(int*j=*i;j!=*i+4;j++){ cout<<*j<<endl; }}利用using之后点击查看代码<summary>点击查看代码</su......
  • en
    高精度加法//C=A+B,A>=0,B>=0vector<int>add(vector<int>&A,vector<int>&B){if(A.size()<B.size())returnadd(B,A);vector<int>C;intt=0;for(inti=0;i<A.size();i++){......
  • HX711压力传感器+树莓派python驱动程序
    #-*-coding:utf-8-*-importRPi.GPIOasGPIOimporttime#VCC接1号针脚,GND接6号针脚,SCK接11号针脚,DT接13号针脚classHx711():defsetup(self):self.SCK=11#物理引脚第11号,时钟self.DT=13#物理引脚第13号,数据self.flag=1......