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

Terrace Class 1:利用jupyter notebook绘制期货价差统计图

准备材料

阅读本文之前只需要完成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)
示例图片

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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容