最近發(fā)現(xiàn)PYTHON與TABLEAU的組合簡直就是我們數(shù)據(jù)分析愛好者的絕佳工具組合分衫。最近對(duì)大類資產(chǎn)配置這個(gè)問題產(chǎn)生了較大的興趣,筆者就使用python作為數(shù)據(jù)獲取珠叔、數(shù)據(jù)處理的工具,同時(shí)采用tableau作為數(shù)據(jù)展現(xiàn)的工具簡單分析了8大類資產(chǎn)近5年多的價(jià)格走勢(shì),也許會(huì)對(duì)當(dāng)下大類資產(chǎn)配置決策提供一些參考依據(jù)蚓曼。這8大類資產(chǎn)包括:
- 小麥
- 大豆
- 新華富時(shí)A50指數(shù)
- 銅
- 原油
- 黃金
- 美元指數(shù)
- 道瓊斯指數(shù)
數(shù)據(jù)獲取
數(shù)據(jù)來源,直接爬取investing.com網(wǎng)站公布的各大類資產(chǎn)日行情數(shù)據(jù)钦扭,以黃金為例python源代碼如下:
#首先需要安裝selenium以及chrome驅(qū)動(dòng)
from selenium import webdriver
def crawlMainIndex():
'''
在INVESTING.COM網(wǎng)站下下載最新的常見指數(shù)行情
'''
driver=webdriver.Chrome()
#爬取黃金指數(shù)行情
mainIndexDownloader(driver,'gold','http://cn.investing.com/commodities/gold-historical-data')
#此處省略爬取其它指數(shù)行情...
driver.quit()
def mainIndexDownloader(driver,indextype,url):
'''
根據(jù)xpath定位交易日纫版、收盤價(jià)、開盤價(jià)客情、最高價(jià)其弊、最低價(jià)、成交量膀斋、日漲幅等日行情數(shù)據(jù)
最后保存到數(shù)據(jù)庫當(dāng)中梭伐,為了可以每天增量下載,這里直接使用django的持久化框架概页。
'''
time.sleep(1)
driver.get(url)
time.sleep(1)
i = 1
while True:
quotes = driver.find_elements_by_xpath('//*[@id="curr_table"]/tbody/tr[%d]/td' % i)
if len(quotes) == 0:
break
#mainIndexQuote類直接映射為mysql數(shù)據(jù)庫當(dāng)中cron_mainindexquote表
data = mainIndexQuote(
tradeday=dateConverter(quotes[0].text),
closeprice=quotes[1].text,
openprice=quotes[2].text,
highprice=quotes[3].text,
lowprice=quotes[4].text,
tradevol=quotes[5].text,
chgpcnt=quotes[6].text.replace('%', ''),
type=indextype
)
existList = mainIndexQuote.objects.filter(tradeday=dateConverter(quotes[0].text)).filter(type=indextype)
#判斷是否數(shù)據(jù)庫當(dāng)中已經(jīng)存在籽御,不存在則插入
if len(existList) == 0:
#持久化,保存在數(shù)據(jù)庫當(dāng)中
data.save()
i += 1
數(shù)據(jù)處理
想要分析抓取下來的8類資產(chǎn)價(jià)格走勢(shì)惰匙,必須要解決以下幾個(gè)問題:
- 不同品種的交易日期并不完全相同技掏,放到一起展示,存在不對(duì)齊現(xiàn)象项鬼,即缺失值哑梳,必須對(duì)缺失值進(jìn)行處理
- 不同交易品種,價(jià)格分布的區(qū)間不一樣绘盟,需要進(jìn)行規(guī)一化處理
- 由于數(shù)據(jù)庫當(dāng)中表的存儲(chǔ)方式為長表鸠真,需要轉(zhuǎn)換為寬表悯仙,具體原理請(qǐng)參見筆者的另一篇簡書筆記Python數(shù)據(jù)分析之重塑reshaping與交叉表pivot table(1)
python語言當(dāng)中的數(shù)據(jù)分析包pandas為解決上述數(shù)據(jù)分析過程當(dāng)中的常見問題提供了非常便捷的方法,對(duì)應(yīng)的源代碼如下吠卷,可以看出上述三個(gè)問題锡垄,只需要兩行代碼
import pandas as pd
def analyseMainIndex():
'''
根據(jù)歷史數(shù)據(jù)抓取的各主要指數(shù)行情,分析大類資產(chǎn)栩置情況
:return:
'''
with engine.connect() as conn, conn.begin():
df = pd.read_sql_table('cron_mainindexquote', conn)
#由于數(shù)據(jù)庫當(dāng)中表的存儲(chǔ)方式為長表祭隔,需要轉(zhuǎn)換為寬表货岭,具體原理請(qǐng)參見筆者的另一篇簡書筆記
#http://www.reibang.com/p/e7ac9a0f5e6c
df1=df.pivot(index='tradeday', columns='type', values='closeprice')
#使用后向填充,作為缺失值處理方式,當(dāng)然也可以使用前期填充疾渴,修改bfill參數(shù)值即可
#通過使用lambda匿名函數(shù)可以將不同大類資產(chǎn)的價(jià)格規(guī)范化為[0,1]區(qū)間千贯,方便合并展示
df2=df1.fillna(method='bfill').apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))
#將處理后的規(guī)范化的數(shù)據(jù)直接存儲(chǔ)到CSV文件當(dāng)中,當(dāng)然此處也可以直接保存到數(shù)據(jù)庫當(dāng)中
df2.to_csv(r'd:\temp\normalization.csv')
數(shù)據(jù)展現(xiàn)
數(shù)據(jù)可視化的意義在于搞坝,讓人在信息爆炸時(shí)代快速搔谴、直觀地獲取自已關(guān)注的信息。通過tableau直連前面已經(jīng)清理整理好的csv數(shù)據(jù)文件之后桩撮,幾秒鐘之內(nèi)即可繪制出8類資產(chǎn)價(jià)格走勢(shì)圖敦第。效果如下:
從上圖中可以發(fā)現(xiàn),在這八大類資產(chǎn)當(dāng)中距境,小麥申尼、大豆、銅垫桂、石油都處于近5年來的相對(duì)價(jià)格低位师幕,而美元指數(shù)、道指诬滩、已經(jīng)處于5年內(nèi)價(jià)格高位霹粥,正所謂,人往高處走疼鸟,水往低處流后控,那是不是說近5年來的相對(duì)低位的資產(chǎn)種類看多就會(huì)因?yàn)楸坏凸蓝容^安全呢?至少從近期來看空镜,結(jié)論似乎是對(duì)的浩淘,但相信答案沒有那么簡單。
提出問題吴攒,收集數(shù)據(jù)张抄,學(xué)習(xí)原理,嘗試回答問題洼怔,正是數(shù)據(jù)分析的迷人之處署惯。