用 Python 基于均线交叉策略进行回测
Python中文社区
共 2453字,需浏览 5分钟
·
2021-08-30 10:42
import pandas as pd
import numpy as np
from pandas_datareader import data
pandas_datareader
从 Yahoo Finance 下载标准普尔 500 指数从 2000 年第一个交易日到今天的价格数据,如下所示:sp500 = data.DataReader('^GSPC', 'yahoo',start='1/1/2000')
sp500.head()
sp500['Close'].plot(grid=True,figsize=(8,5))
sp500['42d'] = np.round(sp500['Close'].rolling(window=42).mean(),2)
sp500['252d'] = np.round(sp500['Close'].rolling(window=252).mean(),2)
.tail
调用,因为移动平均线实际上直到第 42 天和第 252 天才有3值,因此在.head
调用中仅显示为NaN
):sp500[['Close','42d','252d']].plot(grid=True,figsize=(8,5))
sp500['42-252'] = sp500['42d'] - sp500['252d']
Stance
的另一列来形式化信号。我们还将信号阈值“X”设置为 50(这个值设置得很随意,可以在某些时候进行优化)。X = 50
sp500['Stance'] = np.where(sp500['42-252'] > X, 1, 0)
sp500['Stance'] = np.where(sp500['42-252'] < -X, -1, sp500['Stance'])
sp500['Stance'].value_counts()
-1 2077
1 1865
0 251
Name: Stance, dtype: int64
表明在我们选择回测的时间段内,有2077个交易日,42天移动平均线位于252天移动平均线下方50多点,有1865个交易日,42天移动平均线位于252天移动平均线上方50多点。
绘图显示了“Stance”的视觉表现。我已将“ylim”(即 y 轴限制)设置为略高于 1 且略低于 -1,因此我们实际上可以看到线的水平部分。
sp500['Stance'].plot(lw=1.5,ylim=[-1.1,1.1])
sp500['Market Returns'] = np.log(sp500['Close'] / sp500['Close'].shift(1))
sp500['Strategy'] = sp500['Market Returns'] * sp500['Stance'].shift(1)
sp[‘Close’]
列表向下移动,以便我们使用前一天收盘时的“Stance”来计算第二天的回报。sp500[['Market Returns','Strategy']].cumsum().plot(grid=True,figsize=(8,5))
评论