Python股票数据分析——策略、收益率计算

技术分析指标 移动平均值、波动率、交易量

基于历史价格信息的技术分析是金融专业人士和感兴趣的业余人士感兴趣的典型任务。在维基百科上可以找到如下定义:

在金融学中,技术分析是通过对过去市场数据(主要是价格和成交量)的研究预测价格方向的证券分析方法。

在下面的段落中,我们将重点放在用于事后验证的过去市场数据的研究,而不是过多地关注使用我们的认识预测未来股价变动。我们的研究目标是标准普尔(S&P)500基准指数,这通常被认为是整个美国股票市场很油代表性的指标,因为指数中包含许多著名公司的股票,代表着高额的市场资本。而且,该指数还具有高流动性的期货和期权市场。

我们将通过Yahoo的web数据接口来读取历史指数水平信息,并为一个基于趋势信号的交易系统实现简单的事后验证。

import pandas as pd
import numpy as np
from pandas_datareader import data, wb
stock_code = '^GSPC'
start_date = "2000-11-01"
end_date = "2019-03-30"
sp500 = data.get_data_yahoo(stock_code, start_date, end_date)
# 展示前5行
sp500.info()

在这里插入图片描述
data.get_data_yahoo已经通过互联网线路连接到数据源,并读取了从2000年的11-01交易日到结束日期2019-03-30的S&P指数事件序列数据,而且自动地用TimeStamp对象生成一个时间索引。

可以绘制收盘价的时间序列图,如下:
在这里插入图片描述
我们要实现的趋势策略基于两个月(42个交易日)和一年(252个交易日)的趋势(也就是两种期间指数水平的移动平均数)。同样,pandas可以高效地生成各个时间序列,并在一张图上绘制3个相关的事件序列。首先是生成趋势数据:

sp500['42d'] = np.round(sp500['Close'].rolling(window=42, center=False).mean(), 2)
sp500['252d'] = np.round(sp500['Close'].rolling(window=252, center=False).mean(), 2)
sp500[['Close', '42d', '252d']].plot(grid=True, figsize=(8,5))

在这里插入图片描述

sp500['42-252'] = sp500['42d'] - sp500['252d']
# 生成投资体制 Regime
SD = 50
sp500['Regime'] = np.where(sp500['42-252'] > SD, 1, 0)
sp500['Regime'] = np.where(sp500['42-252'] < -SD, -1, sp500['Regime'])
sp500['Regime'].plot(lw=1.5)
plt.ylim([-1.1, 1.1])

在这里插入图片描述

做多、做空策略

假设投资者可能做空、做多市场(指数)或者持币观望。投资者做多时形成市场收益(1),做空时形成负的市场收益(-1),持币时不形成任何市场收益(0)。首先先计算每日的对数收益率:

sp500['Market'] = np.log(sp500['Close']/sp500['Close'].shift(1))
sp500['Stragety'] = sp500['Regime'].shift(1) * sp500['Market']
sp500[['Market', 'Stragety']].cumsum().apply(np.exp).plot(grid=True, figsize=(8, 5))

在这里插入图片描述
可以看到,在研究中忽略操作问题(比如交易执行)和相关市场的围观因素(例如交易成本)的话,在上证A股的收益率可以到7倍,但是在真实环境中还需要考虑市场的操作条件和买卖成本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章