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倍,但是在真實環境中還需要考慮市場的操作條件和買賣成本。

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