计算持仓收益
一、股票持仓的常用参数
可以参考一下股票持仓是怎么计算的。
证券代码 | 证券名称 | 市价 | 盈亏 | 当日盈亏 | 浮动盈亏比 | 股数 | 股票余额 | 可用余额 | 冻结数量 | 成本价 |
---|---|---|---|---|---|---|---|---|---|---|
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”的数据就都被干掉了
计算收益率:
#计算单次收益率:开仓、平仓(开仓的全部股数)
data = data[data['signal']!=0]
data['profit_pct'] = (data['close']-data['close'].shift(1))/data['close'].shift(1)
return data
运行结果:可以看到每次的收益率
这里有个问题,我们只需要算:一对的收益率。
也就是说,一次开仓,一次平仓的收益率。 也就是只要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
这里的收益率只剩下4条了。如果我想更长一点观察这个策略是否有效,只需要取更加长的时间范围的数据。我可以将开始时间
设置为公司的上市时间:
优化get_single_price
:
# 获取单个股票行情数据
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年到现在的数据都有了。
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())
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运行,这张可视化的数据就可以看到了:
从数据种可以看到 上市的前5年数据波动比较大,后面就比较稳定了
这就是我们能够从这张图解读出来的基本的信息、
转载请注明:xuhss » Python量化交易实战-15计算一支股票历史持仓收益