读取csv绘制直方图_[python]用tushare接口绘制Bollinger Bands
股票的各個(gè)指標(biāo)中,Bollinger Bands(一般簡(jiǎn)稱為BOL指數(shù))簡(jiǎn)單暴力,卻又有著統(tǒng)計(jì)學(xué)內(nèi)涵,實(shí)在是深得我心。Bollinger Bands一般有三條線,中間一條就是20日均線MA,而上線和下線分別是MA加減2個(gè)20日標(biāo)準(zhǔn)差[1]。
是什么啊同學(xué)們,四舍五入就是 啊,正態(tài)曲線的95%區(qū)間啊,統(tǒng)計(jì)學(xué)啊!當(dāng)然了,如果你拉隨便一個(gè)股票的歷史股價(jià)繪制一個(gè)直方圖,你會(huì)發(fā)現(xiàn)其實(shí)這些股價(jià)并不符合正態(tài)分布,所以Bollinger Bands多少在理論上有點(diǎn)站不住腳。不過(guò)呢,如果你去統(tǒng)計(jì)一下,基本上價(jià)格波動(dòng)95%的時(shí)候都在Bands內(nèi),5%都在Bands外。所以究竟如何還是自己思考吧。
tushare是很好用的一個(gè)國(guó)內(nèi)的交易數(shù)據(jù)api,獲取數(shù)據(jù)流程簡(jiǎn)單,而且和pandas無(wú)縫連接,所以很值得試試?,F(xiàn)在有專業(yè)版,可以免費(fèi)用,初始的積分可以做一些簡(jiǎn)單操作,以日線數(shù)據(jù)為例,基礎(chǔ)積分每分鐘內(nèi)最多調(diào)取500次,每次5000條數(shù)據(jù),相當(dāng)于23年歷史,所以基本上夠用的了。但是tushare也還有很多很好的數(shù)據(jù)需要更高的積分才能調(diào)取,付費(fèi)50元加入高級(jí)用戶群可以買(mǎi)500積分,然后也基本夠用的了。
整個(gè)工作流程分以下幾個(gè)部分:
配置環(huán)境
首先肯定要安裝tushare
pip install tushare --upgrade然后在程序開(kāi)頭載入tushare以及pandas,matplotlib
import pandas as pd import tushare as ts import snoop import matplotlib.pyplot as plt import os from datetime import datesnoop是用來(lái)查錯(cuò),不是必須
接下來(lái)配置tushare接口:
from yaml import full_load with open('config.yaml') as config_file:_config_yaml = full_load(config_file)TOKEN = _config_yaml['token']pro = ts.pro_api(TOKEN)tushare專業(yè)版需要提供token訪問(wèn)api,這個(gè)api可以在個(gè)人主頁(yè)下面的接口TOKEN中看到。我是將token寫(xiě)在了一個(gè)config.yaml文件中,這樣只需要將這個(gè)文件在.gitignore里面聲明一下,自己的token信息就不會(huì)被不小心寫(xiě)進(jìn)git庫(kù),甚至在網(wǎng)上公開(kāi)了。ts.pro_api將建立一個(gè)api連接,只要提供TOKEN就行了
讀取數(shù)據(jù)
tushare的日線數(shù)據(jù)調(diào)取代碼如下:
df = pro.daily(ts_code='000001.SZ,600000.SH', start_date='20180701', end_date='20180718')主要是提供ts_code, start_date和end_date三個(gè)數(shù)據(jù)。從例程可以看到start_date和end_date兩個(gè)參數(shù)的日期格式是%Y%m%d的形式,所以可以用date.today().strftime("%Y%m%d")將今天的日期轉(zhuǎn)化成符合函數(shù)參數(shù)需求的格式
我想將股票從上市開(kāi)始到現(xiàn)在的全部日線信息都下載下來(lái)。如前所述,end_date設(shè)置成當(dāng)前日期只需要對(duì)date.today()進(jìn)行格式轉(zhuǎn)化就好,而 start_date和ts_code 則需要根據(jù)具體股票進(jìn)行調(diào)整。下面以??低?002352)為例展示一下如何從股票代碼(symbol)獲取ts_code和start_date。
使用tushare的stock_basic接口可以獲得各個(gè)股票的基本信息,所以可以先用這個(gè)接口抓取一次股票基本信息,然后保存在本地,這樣就不需要每次調(diào)試都走線上了(index=False避免存儲(chǔ)的時(shí)候?qū)⒆詣?dòng)生成的數(shù)值index也寫(xiě)入csv):
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date') data.to_csv('stock_basic_info.csv',index=False)上面的代碼運(yùn)行后,下次要用數(shù)據(jù)信息的時(shí)候只需要直接載入就好,不過(guò)要注意的一點(diǎn)是,pandas讀取csv的時(shí)候會(huì)做一些數(shù)據(jù)類型轉(zhuǎn)化,所以symbol里面像平安銀行(000001)這種就會(huì)變成1,為了避免這種情況要在讀取的時(shí)候設(shè)置好 dtype 。
df_stock_basic = pd.read_csv(stock_basic_path, dtype={'symbol':str,'list_date':str}).set_index('symbol')symbol一列保存的是股票代碼,用這個(gè)作為index,后續(xù)就能夠使用loc命令查詢了,比如海康威視的002352
symbol = '002352' ts_code = df_stock_basic.loc[symbol,'ts_code'] list_date = df_stock_basic.loc[symbol,'ts_code']有了上面的ts_code和list_date,獲取日線數(shù)據(jù)就很簡(jiǎn)單了
df_daily:pd.DataFrame = pro.daily(ts_code=ts_code,start_date = list_date,end_date= date.today().strftime("%Y%m%d"))df_daily:pd.DataFrame里面的冒號(hào)是為了聲明df_daily的類型,明確類型以后在pycharm才能更好的幫你做代碼補(bǔ)全。
計(jì)算MA,std與繪圖
這里的時(shí)移均線主要靠的是pandas的rolling實(shí)現(xiàn)。但是在開(kāi)始計(jì)算以前,首先我們要對(duì)下載下來(lái)的df_daily做一些處理,按照常規(guī)的時(shí)序分析流程:
2. 將數(shù)據(jù)框升序排列(原本數(shù)據(jù)是按照從新到舊的順序排列的,在分析的時(shí)候這會(huì)造成問(wèn)題)
df_daily = df_daily.sort_index()然后就可以計(jì)算MA以及std了
rolling_days = 20 std_multiplier = 2 df_daily['MA'] = df_daily['close'].rolling(rolling_days).mean() df_daily['std'] = df_daily['close'].rolling(rolling_days).std() df_daily['upper_bound'] = df_daily['MA']+df_daily['std']*std_multiplier df_daily['lower_bound'] = df_daily['MA']-df_daily['std']*std_multiplier繪圖就只要用
df_daily[['MA','close','upper_bound','lower_bound']].plot(grid=True) plt.show()當(dāng)然了,上面只是放了收盤(pán)價(jià),時(shí)移均線以及Bollinger Band上下界,還可以進(jìn)一步放蠟燭圖一類的。
這些代碼可能最好做成一個(gè)類,然后通過(guò)調(diào)用方法的形式組織代碼才比較好。
參考
總結(jié)
以上是生活随笔為你收集整理的读取csv绘制直方图_[python]用tushare接口绘制Bollinger Bands的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java实现红包要多少钱_Java实现发
- 下一篇: beanshell断言_jmeter学习