原文连接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...看起来确实很手工。
好了,数据爬取篇就这样了,实际上和大部分爬取工做都差很少,只是行情有必定的特殊性。
下一篇我将针对这些数据玩弄一些机器学习代码,来和你们一块儿调调参。
推荐阅读