原文連接python
個人GitHub博客地址git
各位朋友你們好,小之今天又來給你們帶來一些乾貨了。上篇文章機器學習股票價格預測初級實戰是我在剛接觸量化交易那會,由於苦於找不到數據源,因此找的一個第三方平臺來獲取股票數據。程序員
後來對平臺上使用的ipython notebook感興趣了,我畢竟Python學習的時間不長,因此接觸到這樣特殊美好的編譯環境,真的很欣喜。ipython中代碼、文字、圖表混合在一塊兒,很是方便作文檔演示,並且它能夠即時編譯,總之用起來很爽。github
因此我就查閱了一些資料,瞭解到實際上咱們本身也是可使用ipython來做爲本地編輯器的,這讓我特別開心,加上這週五,也就是明天,我要在全公司面前作一我的工智能和量化交易方面的分享會,因此我就趁機把演示代碼寫在ipython notebook上,等明天的時候,先把代碼跑好,而後邊演示代碼邊演示圖表,舒服,等會你們也會在文章中感覺到ipython notebook的魅力。chrome
這個PPT我會分享出來,而且還會用一篇文章,專門的說說我在此次分享會演講中說了什麼,想到了什麼,但願能夠和你們一塊兒交流。json
固然,PPT 的樣式可能真的不太符合你的指望,我只是一個程序員,實在是不太擅長這些,因此白底黑字,感受也是極好的。bash
像上篇文章,我是用的股票中的指數數據來分析,不過呢,週五的分享會中,我須要用一個咱們公司平時比較熟悉的一個品種(咱們公司涉及的是貴金屬現貨),因此我就詢問了咱們的CTO,讓他給我些路子拿到黃金的數據,後來CTO給了我個地址,華爾街見聞網站。而後點開我須要的品種的圖表,用chrome的檢查工具,輕易的就抓到了URL數據。網頁上大概是這樣的app
這個數據的請求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...看起來確實很手工。
好了,數據爬取篇就這樣了,實際上和大部分爬取工做都差很少,只是行情有必定的特殊性。
下一篇我將針對這些數據玩弄一些機器學習代碼,來和你們一塊兒調調參。
推薦閱讀