Terrace Class 1:利用jupyter notebook繪制期貨價(jià)差統(tǒng)計(jì)圖
準(zhǔn)備材料
- Wind CG
- 在Wind命令行中輸入CG斩披,調(diào)出代碼生成器
- python
- python official
- 建議下載 python 3.6 以上版本
- jupyter notebook
- 說(shuō)明文件
- Download-Anaconda
- 使用pip安裝:
pip3 install jupyter
- Windows Powershell
閱讀本文之前只需要完成Python和Jupyter notebook的安裝,在python安裝時(shí)净宵,注意環(huán)境變量的設(shè)置挽铁。
Step 1: 通過(guò)Windows Powershell 啟動(dòng) juputer notebook
在安裝完成jupyter notebook 之后,在powershell中輸入如下命令:
$ jupyter notebook
注意:jupyter notebook 開(kāi)啟時(shí)使用默認(rèn)瀏覽器和默認(rèn)工作目錄
修改工作目錄和默認(rèn)瀏覽器的方法,僅供參考:
-
修改工作目錄
打開(kāi)命令提示付(Win + r), 輸入命令
jupyter notebook --generate-config
找到文件 jupyter_notebook_config.py
-
打開(kāi)該文件,找到
#c.NotebookApp.notebook_dir = ''
將其修改為:
c.NotebookApp.notebook_dir = u'目標(biāo)工作路徑'
-
修改默認(rèn)瀏覽器
同樣找到文件 jupyter_notebook_config.py
打開(kāi)該文件,找到
#c.NotebookApp.notebook_dir = ''
將其修改為:
import webbrowser webbrowser.register("瀏覽器名稱",None,webbrowser.GenericBrowser(u"瀏覽器exe文件路徑")) c.NotebookApp.browser = '瀏覽器名稱'
Step2: 引入關(guān)鍵包
First cell imput:
#基礎(chǔ)數(shù)據(jù)包
import numpy as np
import pandas as pd
import math as m
from pandas import DataFrame
from datetime import *
#數(shù)據(jù)分析包
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
#數(shù)據(jù)引入包
import xlrd
##Wind接口
from WindPy import w
w.start()
以上是我的常用包鳄橘,每個(gè)包的不同用途可以查看其官方文檔和Github源文件。
本篇文章并不需要應(yīng)用以上所有包芒炼。
在引入各種包之前瘫怜,我們需要事先安裝,建議使用pip/conda安裝方式本刽。
Step3: 數(shù)據(jù)輸入(使用wind接口)
利用Wind接口鲸湃,我們可以快速得獲取相關(guān)數(shù)據(jù)。
關(guān)于Wind接口的說(shuō)明子寓,請(qǐng)查看Wind官方文檔暗挑。
Wind本身接口提供的數(shù)據(jù)提取命令為:
w.wsd("AP01M.CZC", "close", "2017-12-22", datetime.today(), "TradingCalendar=CZCE")
w.wsd函數(shù)說(shuō)明:
項(xiàng)目 | 解釋 |
---|---|
w | 是我們之前引入的wind接口包,用于啟動(dòng)整個(gè)接口 |
wsd | 表明是日期序列 |
AP01M.CZC | 是我們當(dāng)前提取的合約 |
close | 收盤(pán)價(jià)(也可以是其他項(xiàng)目) |
2017-12-22 | 提取開(kāi)始時(shí)間 |
datetime.today() | 提取結(jié)束時(shí)間别瞭,datetime庫(kù)中提取今日日期的函數(shù) |
為了更好地處理數(shù)據(jù)窿祥,我們?cè)O(shè)置了windframe函數(shù),可以將wind數(shù)據(jù)轉(zhuǎn)換為DataFrame的格式:
#將Wind數(shù)據(jù)轉(zhuǎn)換為DataFrame
#input-windata wind接口數(shù)據(jù)
def windframe(windata):
df = DataFrame(windata.Data,index=windata.Codes,columns=windata.Times) #以data為內(nèi)容蝙寨,以code(收盤(pán)價(jià)等項(xiàng)目)為行晒衩,時(shí)間為列。
df = df.T #轉(zhuǎn)置(行列交換)
df.index = pd.to_datetime(df.index,format='%Y-%m-%d') #將時(shí)間設(shè)為datetime格式的index
return df #返回建立的DataFrame
#蘋(píng)果期貨價(jià)格
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"))
#雞蛋期貨價(jià)格
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"))
當(dāng)前我們提取了雞蛋期貨2014年以來(lái)的收盤(pán)價(jià)格數(shù)據(jù)以及蘋(píng)果期貨2017年上市以來(lái)各個(gè)合約的收盤(pán)價(jià)數(shù)據(jù)墙歪。
Step4: 價(jià)差計(jì)算
我們?cè)谶@里使用了一個(gè)價(jià)差計(jì)算函數(shù)听系,實(shí)際上,我們可以step by step的在jupyter notebook 上運(yùn)行虹菲,只要用你正在使用的變量替函數(shù)中的對(duì)應(yīng)變量即可靠胜。
參數(shù) | 含義 | 示例 |
---|---|---|
name | 這個(gè)價(jià)差的名字 | ""JD09-01"" |
lcon | 用于計(jì)算價(jià)差的合約1 | jd09[JD09M.DCE] |
rcon | 用于計(jì)算價(jià)差的合約2 | jd01[JD01M.DCE] |
def diff_ccl_egg(name, lcon, rcon):
list = DataFrame(columns = ["Date",name]) #構(gòu)建一個(gè)list來(lái)儲(chǔ)存價(jià)差
list[name] = lcon - rcon #獲取價(jià)差
list["Date"] = list.index #將Date設(shè)置為index
#以下五個(gè)語(yǔ)句將價(jià)差list與日期框格匹配后,形成可以用做作圖的數(shù)據(jù)
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") #設(shè)置一列完整日期為index
#以下語(yǔ)句用于省略middle中用不到的行列毕源,并生成最終的out數(shù)據(jù)表
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
上一個(gè)函數(shù)所需要用到的日期框格浪漠,跟我們?cè)谟肊XCEL制圖時(shí)類似
#設(shè)置一個(gè)日期框格,這個(gè)框格內(nèi)容就是我們想要的日期模式(每一年的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 | 橫坐標(biāo)旋轉(zhuǎn)角度 | 70 |
contract | 價(jià)差數(shù)據(jù) | 從diff_ccl_egg得到的數(shù)據(jù) |
title | 圖片名稱 | "JD09-01" |
#繪圖函數(shù)
def makeplot(sizex, sizey, rotate, contract, title):
#清除之前的圖片緩存
plt.clf()
#設(shè)置行坐標(biāo)格式
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)
#按照每個(gè)繪制圖片
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: 函數(shù)嵌套
def onestep(name, lcon, rcon, sizex, sizey, rotate):
#引用價(jià)差計(jì)算函數(shù)
contract = diff_ccl_egg(name, lcon, rcon)
title = name
#引用繪圖函數(shù)
fig = makeplot(sizex, sizey, rotate, contract, title)
return fig
Arguments | 含義 | 舉例 |
---|---|---|
name | 圖片名稱 | "09-01" |
lcon | 用于計(jì)算價(jià)差的合約1 | jd09[JD09M.DCE] |
rcon | 用于計(jì)算價(jià)差的合約2 | jd01[JD01M.DCE] |
sizex | 圖片寬度 | 10 |
sizey | 圖片高度 | 8 |
rotate | 橫坐標(biāo)旋轉(zhuǎn)角度 | 70 |
Final Step: 執(zhí)行程序
onestep("09-01",jd09["JD09M.DCE"], jd01["JD01M.DCE"], sizex = 10, sizey = 10, rotate = 70)
只要設(shè)定好相關(guān)參數(shù)霎褐,就可以直接獲取價(jià)差圖表了址愿!