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()
三、结果
相关文章推荐
- 使用python多线程实现一个简单spider
- Python 实现一个简单的http服务器
- 使用python实现一个简单的学生信息管理系统
- 使用python多线程实现一个简单spider
- 用Python实现一个简单的能够发送带附件的邮件程序的教程
- 写一个python脚本,实现简单的http服务器功能:
- 神经网络 ——一个很好的解释以及简单实现 Implementing a Neural Network from Scratch in Python – An Introduction
- 用python的wxpython模块实现一个简单的与用户可以交互计算器
- Python实现的一个简单LRU cache
- python实现一个简单的爬虫
- 构建垂直搜索引擎 本课程带领大家实现一个简单的垂直搜索引擎网站,使用nodejs、python、elasticsearch实现的。
- AngularJS+RestfulAPI+BasicAuth+Python/PHP/Node.JS来实现一个最简单的新闻管理后台
- 一个简单的语音识别实现---百度在线语音识别REST API SDK(Python)简单使用
- 用Python实现一个简单的文件传输协议
- Python使用multiprocessing实现一个最简单的分布式作业调度系统
- 一个最简单的用PYTHON实现的WINDOWS服务程序
- 实现一个简单的邮箱地址爬虫(python)
- Python 实现一个简单的http服务器
- 用Python实现一个简单的线程池
- 用Python实现一个简单的能够上传下载的HTTP服务器