Terrace Class 1:利用jupyter notebook绘制期货价差统计图
准备材料
- Wind CG
- 在Wind命令行中输入CG,调出代码生成器
- python
- python official
- 建议下载 python 3.6 以上版本
- jupyter notebook
- 说明文件
- Download-Anaconda
- 使用pip安装:
pip3 install jupyter
- Windows Powershell
- Windows Powershell
阅读本文之前只需要完成Python和Jupyter notebook的安装,在python安装时,注意环境变量的设置。
Step 1: 通过Windows Powershell 启动 juputer notebook
在安装完成jupyter notebook 之后,在powershell中输入如下命令:
$ jupyter notebook
注意:jupyter notebook 开启时使用默认浏览器和默认工作目录
修改工作目录和默认浏览器的方法,仅供参考:
-
修改工作目录
打开命令提示付(Win + r), 输入命令
jupyter notebook --generate-config
找到文件 jupyter_notebook_config.py
-
打开该文件,找到
#c.NotebookApp.notebook_dir = ''
将其修改为:
c.NotebookApp.notebook_dir = u'目标工作路径'
-
修改默认浏览器
同样找到文件 jupyter_notebook_config.py
打开该文件,找到
#c.NotebookApp.notebook_dir = ''
将其修改为:
import webbrowser webbrowser.register("浏览器名称",None,webbrowser.GenericBrowser(u"浏览器exe文件路径")) c.NotebookApp.browser = '浏览器名称'
Step2: 引入关键包
First cell imput:
#基础数据包
import numpy as np
import pandas as pd
import math as m
from pandas import DataFrame
from datetime import *
#数据分析包
import statsmodels.api as sm
import statsmodels.tsa.api as smts
import statsmodels.tsa.stattools as ts
import statsmodels.formula.api as smf
#作图包
import matplotlib.pyplot as plt
import seaborn as sns
import calendar
#数据引入包
import xlrd
##Wind接口
from WindPy import w
w.start()
以上是我的常用包,每个包的不同用途可以查看其官方文档和Github源文件。
本篇文章并不需要应用以上所有包。
在引入各种包之前,我们需要事先安装,建议使用pip/conda安装方式。
Step3: 数据输入(使用wind接口)
利用Wind接口,我们可以快速得获取相关数据。
关于Wind接口的说明,请查看Wind官方文档。
Wind本身接口提供的数据提取命令为:
w.wsd("AP01M.CZC", "close", "2017-12-22", datetime.today(), "TradingCalendar=CZCE")
w.wsd函数说明:
项目 | 解释 |
---|---|
w | 是我们之前引入的wind接口包,用于启动整个接口 |
wsd | 表明是日期序列 |
AP01M.CZC | 是我们当前提取的合约 |
close | 收盘价(也可以是其他项目) |
2017-12-22 | 提取开始时间 |
datetime.today() | 提取结束时间,datetime库中提取今日日期的函数 |
为了更好地处理数据,我们设置了windframe函数,可以将wind数据转换为DataFrame的格式:
#将Wind数据转换为DataFrame
#input-windata wind接口数据
def windframe(windata):
df = DataFrame(windata.Data,index=windata.Codes,columns=windata.Times) #以data为内容,以code(收盘价等项目)为行,时间为列。
df = df.T #转置(行列交换)
df.index = pd.to_datetime(df.index,format='%Y-%m-%d') #将时间设为datetime格式的index
return df #返回建立的DataFrame
#苹果期货价格
ap01 = windframe(w.wsd("AP01M.CZC", "close", "2017-12-22", datetime.today(), "TradingCalendar=CZCE"))
ap03 = windframe(w.wsd("AP03M.CZC", "close", "2017-12-22", datetime.today(), "TradingCalendar=CZCE"))
ap05 = windframe(w.wsd("AP05M.CZC", "close", "2017-12-22", datetime.today(), "TradingCalendar=CZCE"))
ap07 = windframe(w.wsd("AP07M.CZC", "close", "2017-12-22", datetime.today(), "TradingCalendar=CZCE"))
ap10 = windframe(w.wsd("AP10M.CZC", "close", "2017-12-22", datetime.today(), "TradingCalendar=CZCE"))
ap11 = windframe(w.wsd("AP11M.CZC", "close", "2017-12-22", datetime.today(), "TradingCalendar=CZCE"))
ap12 = windframe(w.wsd("AP12M.CZC", "close", "2017-12-22", datetime.today(), "TradingCalendar=CZCE"))
#鸡蛋期货价格
jd01 = windframe(w.wsd("JD01M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd02 = windframe(w.wsd("JD02M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd03 = windframe(w.wsd("JD03M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd04 = windframe(w.wsd("JD04M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd05 = windframe(w.wsd("JD05M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd06 = windframe(w.wsd("JD06M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd07 = windframe(w.wsd("JD07M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd08 = windframe(w.wsd("JD08M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd09 = windframe(w.wsd("JD09M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd10 = windframe(w.wsd("JD10M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd11 = windframe(w.wsd("JD11M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
jd12 = windframe(w.wsd("JD12M.DCE", "close", "2014-01-01", datetime.today(), "TradingCalendar=DCE"))
当前我们提取了鸡蛋期货2014年以来的收盘价格数据以及苹果期货2017年上市以来各个合约的收盘价数据。
Step4: 价差计算
我们在这里使用了一个价差计算函数,实际上,我们可以step by step的在jupyter notebook 上运行,只要用你正在使用的变量替函数中的对应变量即可。
参数 | 含义 | 示例 |
---|---|---|
name | 这个价差的名字 | ""JD09-01"" |
lcon | 用于计算价差的合约1 | jd09[JD09M.DCE] |
rcon | 用于计算价差的合约2 | jd01[JD01M.DCE] |
def diff_ccl_egg(name, lcon, rcon):
list = DataFrame(columns = ["Date",name]) #构建一个list来储存价差
list[name] = lcon - rcon #获取价差
list["Date"] = list.index #将Date设置为index
#以下五个语句将价差list与日期框格匹配后,形成可以用做作图的数据
middle = df.merge(list, left_on='2014', right_on='Date', how = "left", left_index = True)
middle = middle.merge(list, left_on='2015', right_on='Date', how = "left", left_index = True)
middle = middle.merge(list, left_on='2016', right_on='Date', how = "left", left_index = True)
middle = middle.merge(list, left_on='2017', right_on='Date', how = "left", left_index = True)
middle = middle.merge(list, left_on = "2018",right_on = "Date", how = "left", left_index = True)
middle['2014'] = middle['2014'].dt.strftime('%m/%d')
middle.columns = ["14", "15", "16", "17", "18", "del1", "2014", "del2", "2015","del3", "2016", "del4", "2017","del5", "2018"]
middle = middle.set_index("14") #设置一列完整日期为index
#以下语句用于省略middle中用不到的行列,并生成最终的out数据表
out = middle[["2014", "2015", "2016", "2017", "2018"]]
#out = out.dropna(axis = 0, how = "all")
out[["2014","2015","2016","2017"]] = out[["2014","2015","2016","2017"]].fillna(method = "ffill")
out.index.names = ['Date']
return out
上一个函数所需要用到的日期框格,跟我们在用EXCEL制图时类似
#设置一个日期框格,这个框格内容就是我们想要的日期模式(每一年的1月1日到12月31日为一列)
#文件路径:E:\OneDrive\Python\Date.xlsx
df = pd.read_excel("E:\OneDrive\Python\Date.xlsx", sheet_name=0)
df['Date'] = df['Date'].dt.strftime('%m/%d')
df = df.set_index("Date")
df.columns = ["2014","2015", "2016", "2017", "2018"]
Step5: 绘图操作
变量 | 含义 | 示例 |
---|---|---|
sizex | 图片宽度 | 10 |
sizey | 图片高度 | 8 |
rotate | 横坐标旋转角度 | 70 |
contract | 价差数据 | 从diff_ccl_egg得到的数据 |
title | 图片名称 | "JD09-01" |
#绘图函数
def makeplot(sizex, sizey, rotate, contract, title):
#清除之前的图片缓存
plt.clf()
#设置行坐标格式
fig,ax = plt.subplots()
fig.set_size_inches(sizex,sizey)
xtick = contract.index
xticks = range(0, len(xtick),10)
xlabels = [xtick[index] for index in xticks]
ax.set_xticks(xticks)
ax.set_xticklabels(xlabels, rotation = rotate)
#按照每个绘制图片
plt.plot(contract["2014"])
plt.plot(contract["2015"])
plt.plot(contract["2016"])
plt.plot(contract["2017"])
plt.plot(contract["2018"])
ax.legend()
plt.title(title)
return fig
Step6: 函数嵌套
def onestep(name, lcon, rcon, sizex, sizey, rotate):
#引用价差计算函数
contract = diff_ccl_egg(name, lcon, rcon)
title = name
#引用绘图函数
fig = makeplot(sizex, sizey, rotate, contract, title)
return fig
Arguments | 含义 | 举例 |
---|---|---|
name | 图片名称 | "09-01" |
lcon | 用于计算价差的合约1 | jd09[JD09M.DCE] |
rcon | 用于计算价差的合约2 | jd01[JD01M.DCE] |
sizex | 图片宽度 | 10 |
sizey | 图片高度 | 8 |
rotate | 横坐标旋转角度 | 70 |
Final Step: 执行程序
onestep("09-01",jd09["JD09M.DCE"], jd01["JD01M.DCE"], sizex = 10, sizey = 10, rotate = 70)
只要设定好相关参数,就可以直接获取价差图表了!