前言
各位朋友大家好,小之今天又來給大家帶來一些乾貨了。上篇文章機器學習股票價格預測初級實戰是我在剛接觸量化交易那會,因為苦於找不到資料來源,所以找的一個第三方平臺來獲取股票資料。
後來對平臺上使用的ipython notebook感興趣了,我畢竟Python學習的時間不長,所以接觸到這樣特殊美好的編譯環境,真的很欣喜。ipython中程式碼、文字、圖表混合在一起,非常方便做文件演示,而且它可以即時編譯,總之用起來很爽。
所以我就查閱了一些資料,瞭解到實際上我們自己也是可以使用ipython來作為本地編輯器的,這讓我特別開心,加上這週五,也就是明天,我要在全公司面前做一個人工智慧和量化交易方面的分享會,所以我就趁機把演示程式碼寫在ipython notebook上,等明天的時候,先把程式碼跑好,然後邊演示程式碼邊演示圖表,舒服,等會大家也會在文章中感受到ipython notebook的魅力。
這個PPT我會分享出來,並且還會用一篇文章,專門的說說我在這次分享會演講中說了什麼,想到了什麼,希望可以和大家一起交流。
當然,PPT 的樣式可能真的不太符合你的期望,我只是一個程式設計師,實在是不太擅長這些,所以白底黑字,感覺也是極好的。
URL分析
像上篇文章,我是用的股票中的指數資料來分析,不過呢,週五的分享會中,我需要用一個我們公司平時比較熟悉的一個品種(我們公司涉及的是貴金屬現貨),所以我就詢問了我們的CTO,讓他給我些路子拿到黃金的資料,後來CTO給了我個地址,華爾街見聞網站。然後點開我需要的品種的圖表,用chrome的檢查工具,輕易的就抓到了URL資料。網頁上大概是這樣的
這個資料的請求url是這樣的
https://forexdata.wallstreetcn.com/kline?prod_code=XAUUSD&candle_period=8&data_count=1000&end_time=1413158399&fields=time_stamp%2Copen_px%2Cclose_px%2Chigh_px%2Clow_px
複製程式碼
資料的格式很清晰,我們大概可以猜測到請求引數data_count代表的是請求的資料量,end_time是時間戳,這兩個資料結合在一起就是從end_time開始往前data_count個交易日的資料。
後面帶&號的就是我們需要獲取的資料了,time_stamp是每筆資料的時間戳,close是收盤價,open是開盤價,high是最高價,low是最低價,這五個資料是我們需要繪製K線圖的基本資料,就是所謂的蠟燭圖了,K線有不太瞭解的夥伴可以自己查閱下,我在這裡就不多細說了。
爬取資料
分析好url,我們就要正式的爬取資料了,我希望獲取黃金(這裡實際上是黃金/美金,代號是XAUUSD,是一種外匯)10年的資料,這裡注意下,經過我的嘗試,這個url中,data_count最多隻能獲取1000的資料,如果大於1000,也會預設返回1000條資料。那麼自然,我們的請求引數end_time就得動態變化。
為了方便,我決定每次只爬取一年的資料,所以data_count固定死為365,而end_time通過format函式從引數中獲取,程式碼如下
def get_data(end_time,count):
url = "https://forexdata.wallstreetcn.com/kline?prod_code=XAUUSD&candle_period=8&data_count=365&end_time="
"{end_time}"
"&fields=time_stamp%2Copen_px%2Cclose_px%2Chigh_px%2Clow_px".format(end_time=end_time)
response = requests.get(url) # 請求資料
data_list = json.loads(response.text) # json 解析
data = data_list.get("data").get("candle").get("XAUUSD")
# 轉化為 DataFrame
df = pd.DataFrame(data,columns=[`date`,`open`,`close`,`high`,`low`],index=list(range(count,count+365)))
return df
複製程式碼
這裡,我們使用requests第三方包來請求資料,拿到資料後先用json來解析資料,最後把資料轉化為pandas的DataFrame結構。這個是常規操作了,大家應該都沒什麼問題。
獲取資料的方法寫好後,我們迴圈呼叫10次get_data函式,並且把DataFrame物件進行拼接,就完整的拿到我們黃金的10年資料了,注意每次迴圈間隔要有一定延時,免得被反爬蟲機制封了iP啦。
init_time = 1237507200 # 2009年3月20日
window = 60*60*24*365 # 每次獲取365天的資料
df = pd.DataFrame()
for i in range(10):
df = pd.concat([df,get_data(init_time + i * window,i*365)])
print("get data success ",i)
time.sleep(0.5)
複製程式碼
好了,程式碼執行完之後,我們來看看df的資料,截一個ipython notebook的樣式。
ipython這種體驗我可以歸納為:及時行樂。
玩弄資料
好了,現在我們有了3650條DataFrame資料了,作為擁有資料分析三大神器的Python來說,下面就可以隨意的玩弄資料了。(import matplotlib.pyplot as plt)
比如我們繪製下黃金的收盤價走勢圖,三行程式碼就可以咯
df[`close`].plot(figsize=(15,10))
plt.grid(True)
plt.show()
複製程式碼
那我們有了繪製K線資料的5個基本資料,不繪製個K線顯然說不過去。繪製K線的程式碼稍微複雜一些,主要就是處理橫座標的時間,需要有一個資料的轉化,把時間戳轉化為%Y-%m-%d,再把這種格式轉化為pyplot支援的時間樣式。
import matplotlib.finance as mpf
from matplotlib.pylab import date2num
import datetime
r = map(lambda x : time.strftime(`%Y-%m-%d`,time.localtime(x)),df[`date`])
df[`date`] = list(r)
def date_to_num(dates):
num_time = []
for date in dates:
date_time = datetime.datetime.strptime(date,`%Y-%m-%d`)
num_date = date2num(date_time)
num_time.append(num_date)
return num_time
fig,ax = plt.subplots(figsize=(15,10))
mat_data = df.as_matrix()
num_time = date_to_num(mat_data[:,0])
mat_data[:,0] = num_time
fig.subplots_adjust(bottom=0.2)
ax.xaxis_date()
mpf.candlestick_ochl(ax,mat_data,width=0.6,colorup=`r`,colordown=`g`)
plt.grid(True)
plt.xlabel(`Data`)
plt.ylabel(`Price`)
plt.show()
複製程式碼
我們還可以繪製這10年來每天的漲跌幅狀態,從中能看出黃金走勢的牛熊和震盪
rate_of_return = (df[`close`]-df[`open`])/df[`open`]
rate_of_return.plot(kind=`line`,style=`k--`,figsize=(15,10))
plt.show()
複製程式碼
可以看出,黃金大部分時間都是在震盪,剛開始和中間有一些比較反常的情況,剛開始那個我推測是經濟危機之後那段時間的調整,美元大跌那會吧。
哦對了,這裡我要糾正下我上篇文章的一個錯誤,記得那個彎曲的柱狀圖嗎,沒錯,就是它了
我當時以為是ipython的bug,後來發現並不是,而是程式碼中我加了這一行
with plt.xkcd():
複製程式碼
xkcd是一部漫畫的名稱,然後這個函式代表就是用類似於這部漫畫的style來畫圖,所以,這漫畫是啥樣的呢?
emm…看起來確實很手工。
結尾
好了,資料爬取篇就這樣了,實際上和大部分爬取工作都差不多,只是行情有一定的特殊性。
下一篇我將針對這些資料玩弄一些機器學習程式碼,來和大家一起調調參。
推薦閱讀