python财务报表预测股票价格_机器学习股票价格预测从爬虫到预测-数据爬取部分...
聲明:本文已授權公眾號「AI極客研修站」獨家發布
前言
各位朋友大家好,小之今天又來給大家帶來一些干貨了。上篇文章機器學習股票價格預測初級實戰是我在剛接觸量化交易那會,因為苦于找不到數據源,所以找的一個第三方平臺來獲取股票數據。
后來對平臺上使用的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...看起來確實很手工。
結尾
好了,數據爬取篇就這樣了,實際上和大部分爬取工作都差不多,只是行情有一定的特殊性。
下一篇我將針對這些數據玩弄一些機器學習代碼,來和大家一起調調參。
推薦閱讀
總結
以上是生活随笔為你收集整理的python财务报表预测股票价格_机器学习股票价格预测从爬虫到预测-数据爬取部分...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么用python处理数据_Python
- 下一篇: python读取配置文件 分段_Pyth