利用jupyter notebook(一劳永逸)绘制期货价差统计图

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 开启时使用默认浏览器和默认工作目录


修改工作目录和默认浏览器的方法,仅供参考:

  1. 修改工作目录

    1. 打开命令提示付(Win + r), 输入命令jupyter notebook --generate-config

    2. 找到文件 jupyter_notebook_config.py

    3. 打开该文件,找到

      #c.NotebookApp.notebook_dir = '' 
      

      将其修改为:

      c.NotebookApp.notebook_dir = u'目标工作路径' 
      
  2. 修改默认浏览器
    同样找到文件 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)
示例图片

只要设定好相关参数,就可以直接获取价差图表了!


你可能感兴趣的:(利用jupyter notebook(一劳永逸)绘制期货价差统计图)