利用jupyter notebook(一勞永逸)繪制期貨價(jià)差統(tǒng)計(jì)圖

Terrace Class 1:利用jupyter notebook繪制期貨價(jià)差統(tǒng)計(jì)圖

準(zhǔn)備材料

閱讀本文之前只需要完成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)瀏覽器的方法,僅供參考:

  1. 修改工作目錄

    1. 打開(kāi)命令提示付(Win + r), 輸入命令jupyter notebook --generate-config

    2. 找到文件 jupyter_notebook_config.py

    3. 打開(kāi)該文件,找到

      #c.NotebookApp.notebook_dir = '' 
      

      將其修改為:

      c.NotebookApp.notebook_dir = u'目標(biāo)工作路徑' 
      
  2. 修改默認(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à)差圖表了址愿!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冻璃,隨后出現(xiàn)的幾起案子响谓,更是在濱河造成了極大的恐慌损合,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘纷,死亡現(xiàn)場(chǎng)離奇詭異嫁审,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赖晶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)律适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嬉探,你說(shuō)我怎么就攤上這事擦耀∶奕Γ” “怎么了涩堤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)分瘾。 經(jīng)常有香客問(wèn)我胎围,道長(zhǎng),這世上最難降的妖魔是什么德召? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任白魂,我火速辦了婚禮,結(jié)果婚禮上上岗,老公的妹妹穿的比我還像新娘福荸。我一直安慰自己,他們只是感情好肴掷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布敬锐。 她就那樣靜靜地躺著,像睡著了一般呆瞻。 火紅的嫁衣襯著肌膚如雪台夺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天痴脾,我揣著相機(jī)與錄音颤介,去河邊找鬼。 笑死赞赖,一個(gè)胖子當(dāng)著我的面吹牛滚朵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播前域,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辕近,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了话侄?” 一聲冷哼從身側(cè)響起亏推,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤学赛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后吞杭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盏浇,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年芽狗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绢掰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡童擎,死狀恐怖滴劲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顾复,我是刑警寧澤班挖,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站芯砸,受9級(jí)特大地震影響萧芙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜假丧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一双揪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧包帚,春花似錦渔期、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至几莽,卻和暖如春迅办,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背章蚣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工站欺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纤垂。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓矾策,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親峭沦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贾虽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容