Python量化交易实战-15计算一支股票历史持仓收益

auto-trade xuhss 1426℃ 0评论

计算持仓收益

一、股票持仓的常用参数

可以参考一下股票持仓是怎么计算的。

证券代码 证券名称 市价 盈亏 当日盈亏 浮动盈亏比 股数 股票余额 可用余额 冻结数量 成本价
000001 平安银行 47 313 -201 7.355 100 100 100 0 43.771

总盈亏=(市价 - 成本价)*股数

如果市价高于成本价,你就赚钱了。反过来你就亏了。

浮动盈亏比=(市价 - 成本价)/成本价

成本价 = 总买入金额/总持有股数

因为在我们实际的投资过程中,可能分多次多批量买入,每次买入的金额不一样 ,那么就需要将数据汇总计算最终的平均成本价。

股数 = 累计买入的股数

以上数据在现实生活中,券商都会帮你算好,你的每一笔交易都会记录到券商的后台,我们不用太操心。只要在之后从数据接口去查询这些数据就好了。

但是 “浮动盈亏比”这个参数 ,是非常常见的。会被经常使用到,因为它是评价一个股票赚钱最直接的指标。它的计算方式和“涨跌幅”的计算方式类似。就是算2个价格之间变化的幅度。正的还是负的。

二、实战计算交易后的收益率

先运行上节课的代码,看一下股票数据,从而计算我们想要计算的数据。

2.1计算收益率

怎么计算交易后的收益率呢,这里有个简单的方式:

我们需要筛选一下数据,将没有开仓信号的数据都过滤掉。只保留有开仓信号的。最后的signal数据就会变成只有1-1字,我们就可以利用之前讲解用到的shift函数了。

#用来创建交易策略、生成交易信号
def week_period_strategy(stock_code, timefrequency, startdate, enddate):
    #获取数据
    data = st.get_single_price(stock_code, timefrequency, startdate, enddate)
    print(data)
    #创建周期字段
    data['weekday'] = data.index.weekday
    #周四交易:买入(0:不操作 1:买入)
    data['buy_signal'] = np.where((data['weekday']==3),1,0) 
    #周一交易:卖出(0:不操作 1:卖出)
    data['sell_signal'] = np.where((data['weekday']==0),-1,0)

    #整合信号
    data['buy_signal'] = np.where((data['buy_signal']==1) & (data['buy_signal'].shift(1)==1),0,data['buy_signal'])
    data['sell_signal'] = np.where((data['sell_signal']==-1) & (data['sell_signal'].shift(1)==-1),0,data['sell_signal'])
    #合并信号
    data['signal'] = data['buy_signal'] + data['sell_signal']

    #计算单次收益率:开仓、平仓(开仓的全部股数)
    data = data[data['signal']!=0]
    return data

运行结果:

这就是我要得,signal列的“0”的数据就都被干掉了

20210606150727 - Python量化交易实战-15计算一支股票历史持仓收益

计算收益率:

    #计算单次收益率:开仓、平仓(开仓的全部股数)
    data = data[data['signal']!=0]
    data['profit_pct'] = (data['close']-data['close'].shift(1))/data['close'].shift(1)
    return data

运行结果:可以看到每次的收益率

20210606151142 - Python量化交易实战-15计算一支股票历史持仓收益

这里有个问题,我们只需要算:一对的收益率。

也就是说,一次开仓,一次平仓的收益率。 也就是只要signal的值为“-1”对应的收益率,signal的值为“1”对应的收益率不要。应该怎么修改呢?很简单:通过筛选即可

    #计算单次收益率:开仓、平仓(开仓的全部股数)
    data = data[data['signal']!=0]
    data['profit_pct'] = (data['close']-data['close'].shift(1))/data['close'].shift(1)
    data = data[data['signal']!=1]
    return data

20210606151507 - Python量化交易实战-15计算一支股票历史持仓收益

这里的收益率只剩下4条了。如果我想更长一点观察这个策略是否有效,只需要取更加长的时间范围的数据。我可以将开始时间设置为公司的上市时间

优化get_single_price:

20210606151939 - Python量化交易实战-15计算一支股票历史持仓收益

# 获取单个股票行情数据
def get_single_price(stock_code, timefrequency, startdate, enddate):
    #如果startdate为None你默认从上市日期开始计算
    if startdate is None:
        startdate = get_security_info(stock_code).start_date

    data = get_price(stock_code, start_date=startdate, end_date=enddate, frequency=timefrequency)
    return修改

修改get_single_price调用方式:

if __name__ == '__main__':
    data = week_period_strategy(stock_code='000001.XSHE', timefrequency='daily', startdate=None, enddate='2021-03-01')
    print(data)

运行:可以看到从05年到现在的数据都有了。

20210606152504 - Python量化交易实战-15计算一支股票历史持仓收益

2.2优化函数

由于week_period_strategy代码行数较多,优化一下:

将这2个内容抽取陈为函数:

#整合信号
def compose_signal(data):
    data['buy_signal'] = np.where((data['buy_signal']==1) & (data['buy_signal'].shift(1)==1),0,data['buy_signal'])
    data['sell_signal'] = np.where((data['sell_signal']==-1) & (data['sell_signal'].shift(1)==-1),0,data['sell_signal'])
    #合并信号
    data['signal'] = data['buy_signal'] + data['sell_signal']
    return data

#计算单次收益率:开仓、平仓(开仓的全部股数)
def calculate_profit_pct(data):
    data = data[data['signal']!=0]
    data['profit_pct'] = (data['close']-data['close'].shift(1))/data['close'].shift(1)
    data = data[data['signal']!=1]
    return data

我们可以仔细观察一下收益率,有涨有跌,有了这些数据我们就可以计算他的平均收益率,我们也可以使用matplotlib这个python的可视化库来把这些数据展现一下。

2.3计算平均收益率

if __name__ == '__main__':
    data = week_period_strategy(stock_code='000001.XSHE', timefrequency='daily', startdate=None, enddate='2021-03-01')
    print(data)
    print(data.describe())

20210606153616 - Python量化交易实战-15计算一支股票历史持仓收益

  • count表示整个data的条数,也就是说,我们进行了769次开仓平仓。
  • mean表述平均值,也就是平均收益率为0.003842.收益率为0.3842%
  • std代表波动反差,
  • min代表最小值,
  • max代表最大值

从数据来看,它是正收益的,虽然收益不高。这就是数据层面的考量。

2.4 matplotlib可视化

import matplotlib.pyplot as plt
if __name__ == '__main__':
    data = week_period_strategy(stock_code='000001.XSHE', timefrequency='daily', startdate=None, enddate='2021-03-01')
    print(data)
    print(data.describe())
    data['profit_pct'].plot()
    plt.show()

y运行,这张可视化的数据就可以看到了:

20210606154411 - Python量化交易实战-15计算一支股票历史持仓收益

从数据种可以看到 上市的前5年数据波动比较大,后面就比较稳定了

这就是我们能够从这张图解读出来的基本的信息、

转载请注明:xuhss » Python量化交易实战-15计算一支股票历史持仓收益

喜欢 (0)

您必须 登录 才能发表评论!