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