请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于计算cum_profit的问题

Hi DeltaF:
关于本节有一个问题向您请教,视频中的计算cum_profit()是基于卖出信号(signal == -1)计算出来的,但是profit_pct()又是基于买入卖出信号(signal == 1 | signal == -1)计算的,我的理解如下,请老师判断

  1. profit_pct() # 计算浮动盈亏比 在这里可以理解成:
    • 设:买入信号产生时以当天收盘价买入为buy
    • 设:卖出信号产生时以当天收盘价卖出为sell
    • 根据公式得出pct:
      pct=sell−buybuypct = \frac{sell - buy}{buy}pct=buysellbuy
  2. cum_profit() # 计算累积收益率在这里可以理解成:
    • 设:买入信号产生时以当天收盘价买入为buy
    • 设:卖出信号产生时以当天收盘价卖出为sell
    • 设:基础单位为1
    • 根据公式可以得出cum:
      cum=∏(1+sell−buybuy)−1cum = \prod(1 + \frac{sell - buy}{buy}) -1cum=(1+buysellbuy)1
  3. 根据视频中的讲解,cum 就被抽象成了:
    • 设:卖出信号为sell
    • 设:上一卖出信号为exsell
    • 根据公式得出视频中的cum:
      cum=∏(1+sell−exsellexsell−1)cum = \prod(1 + \frac{sell - exsell}{exsell} - 1)cum=(1+exsellsellexsell1)

以下是视频的结果:

05:10截图

以下是我的计算结果:

自己代码运行结果

正在回答 回答被采纳积分+3

1回答

提问者 xfcy_晓风残月 2021-04-22 14:11:55


https://img1.sycdn.imooc.com//szimg/60811164095ed00c15872245.jpg

#  发现3个BUG:


1. signal整理时,应该将周期内的第一个-1(卖出)信号删除,添加以下代码:

# 删除首行是-1的行,因为在这个周期内假设是不持仓的
first_signal = data.iloc[0]["signal"]
if first_signal == -1:
    data.drop(data.iloc[0].name, inplace=True)


2.  根据close计算的累积收益率和根据浮动盈亏比计算的累积收益率是不同的,代码如下:

 # --------------根据close算出来的浮动盈亏再计算的累积收益率------------------ #
def cum_prof(data: pd.DataFrame):
    """
    计算累积收益率(以单位1为基数上涨)
    公式:  (1 + 当天收益率)的累积 - 1
    :param data:
    :return:
    """
    # data["gross_profit"] = (data["profit_pct"] + 1).cumprod()
    data["cum_profit"] = pd.DataFrame(1 + data["close"].pct_change()).cumprod() - 1
    return data
    
 # --------------根据已计算出来的浮动盈亏计算的累积收益率------------------ #
 def cum_prof_by_pct(data: pd.DataFrame):
    """
    data中必须含有profit_pct向量
    :param data:
    :return:
    """
    data["cum_profit_pct"] = pd.DataFrame(1 + data["profit_pct"]).cumprod() - 1
    return data


第3个bug正在验证中,之后上代码,请DeltaF老师指导。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信