您的位置:首页 > 编程语言 > Python开发

Python学习笔记(三):一个简单策略的实现与可视化

2019-08-01 21:06 465 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_43647192/article/details/98104240

文章目录

声明

本文为北风网(网址:www.ibeifeng.com)的网课笔记,代码主要来自北风网的网课,讲师为朱彤老师。
笔记对原代码做出了一定的修改,注释,添加,删减。

一、策略介绍

以42日均线与252日均线为指标,当42日均线大于252均线50点时做多,当42日均线小于252日均线50点时做空。
50点设为可调参数S0。

二、代码

import numpy as np
import pandas as pd
import pandas_datareader as web
import matplotlib.pyplot as plt
#%matplotlib inline

#数据下载
sp500 = web.DataReader('^GSPC', data_source = 'yahoo', start = '1/1/2000', end = '4/14/2014')
#sp500['Close'].plot(grid = 'True', figsize = (8,5))

#指标计算
sp500['42d'] = sp500['Close'].rolling(window = 42).mean()
sp500['252d'] = sp500['Close'].rolling(window = 252).mean()
#sp500[['Close','42d','252d']].plot(grid = 'True', figsize = (8,6))
sp500['42-252'] = sp500['42d'] - sp500['252d']

#买卖指令
#当42日均线高于252日均线S0个单位的时候买入,当42日均线低于252日均线S0个单位的时候卖出
S0 = 50
sp500['Regime'] = np.where(sp500['42-252'] > S0,1,0)
sp500['Regime'] = np.where(sp500['42-252'] < -S0,-1,sp500['Regime'])
#sp500['Regime'].value_counts()   #计算买卖次数

sp500['Market'] = np.log(sp500['Close']/sp500['Close'].shift(1))  #计算指数收益率
sp500['Strategy'] = sp500['Regime'].shift(1) * sp500['Market']   #使用前一天确定的买卖指令来对今天进行操作

# 计算收益率
sp500['Strategy_Return'] = sp500['Strategy'].cumsum().apply(np.exp)

#计算以10000元投资所得到的财富,对比策略结果以及指数结果
nonzero = pd.Series.nonzero(sp500['Regime'])[0][0]
sp500['wealth_strategy'] = 10000 * sp500['Strategy_Return']
sp500['wealth_buyandhold'] = 10000/sp500['Open'][0] * sp500['Close']

# 绘图显示结果
#%matplotlib qt5
grid = plt.GridSpec(7, 2)
#走势与指标
plt.subplot(grid[2:5,:1])
plt.plot(sp500[['Close']],label = 'Close')
plt.plot(sp500['42d'], label = 'average price of 42 days')
plt.plot(sp500['252d'], label = 'average price of 252 days')
plt.title('index_price', size = '23')
plt.xlabel('Time', size = '15')
plt.ylabel('Points', size = '15')
plt.tick_params(labelsize = 13)
plt.legend()

#买卖指令图像
plt.subplot(grid[:3,1:])
plt.plot(sp500[['Regime']])
plt.title('bid_ask', size = '23')
plt.xlabel('Time', size = '15')
plt.ylabel('Order_directions', size = '15')
plt.tick_params(labelsize = 13)
plt.legend()

#收益情况
plt.subplot(grid[4:,1:])
plt.plot(sp500[['wealth_strategy']], label = 'wealth of strategy')
plt.plot(sp500['wealth_buyandhold'], label = 'wealth of buy and hold')
plt.title('strategy_return', size = '23')
plt.xlabel('Time', size = '15')
plt.ylabel('Wealth', size = '15')
plt.tick_params(labelsize = 13)
plt.legend()

三、结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: