一、介紹
Tushare是一個免費、開源的python財經數據接口包。主要實現對股票等金融數據從數據采集、清洗加工 到 數據存儲的過程,能夠為金融分析人員提供快速、整潔、和多樣的便於分析的數據,為他們在數據獲取方面極大地減輕工作量,使他們更加專注於策略和模型的研究與實現上。考慮到Python pandas包在金融量化分析中體現出的優勢,Tushare返回的絕大部分的數據格式都是pandas DataFrame類型,非常便於用pandas/NumPy/Matplotlib進行數據分析和可視化。當然,如果您習慣了用Excel或者關系型數據庫做分析,您也可以通過Tushare的數據存儲功能,將數據全部保存到本地后進行分析。應一些用戶的請求,從0.2.5版本開始,Tushare同時兼容Python 2.x和Python 3.x,對部分代碼進行了重構,並優化了一些算法,確保數據獲取的高效和穩定。
需要強調的是,TuShare庫里不僅僅有股票數據,而是一個綜合的財經庫。只是因為股票數據數據量比較大,特別鍛煉數據分析能力,所以才選擇股票數據練手。其余的數據也是很有意思的,比如全國電影票房排名
使用前提
- 安裝Python
- 安裝pandas
- lxml也是必須的,正常情況下安裝了Anaconda后無須單獨安裝,如果沒有可執行:pip install lxml
建議安裝Anaconda(http://www.continuum.io/downloads),一次安裝包括了Python環境和全部依賴包,減少問題出現的幾率。
- 方式1:pip install tushare
- 方式2:訪問https://pypi.python.org/pypi/Tushare/下載安裝
- pip install tushare --upgrade
查看當前版本的方法:
import tushare print(tushare.__version__)
二、Tushare的應用
1、概念
1.K線:K線起源於日本德川幕府時代,因為圖形像蠟燭,所以又稱蠟燭圖,日本線。K線是代表這一天股票的開盤價,收盤價,最高價和最低價。
2.均線:均線一般分為5日(MA5),10日(MA10),20日(MA20),30日(MA30),60日(MA60),120日(MA120)和250日平均線(MA250),它指的是在這些天里這個股票收盤的平均價格,通過K線與均線的對比可以看出股票的強弱,一般在5日均線以上屬於較強勢。
2、獲取股票行情的函數
我們主要還是應該掌握如何用tushare獲取股票行情數據,使用的是ts.get_hist_data()函數或者ts.get_k_data()函數
參數:
code:股票代碼,即6位數字代碼,或者指數代碼(sh=上證指數 sz=深圳成指 hs300=滬深300指數 sz50=上證50 zxb=中小板 cyb=創業板) start:開始日期,格式YYYY-MM-DD end:結束日期,格式YYYY-MM-DD ktype:數據類型,D=日k線 W=周 M=月 5=5分鍾 15=15分鍾 30=30分鍾 60=60分鍾,默認為D retry_count:當網絡異常后重試次數,默認為3 pause:重試時停頓秒數,默認為0
返回值說明: date:日期 open:開盤價 high:最高價 close:收盤價 low:最低價 volume:成交量 price_change:價格變動 p_change:漲跌幅 ma5:5日均價 ma10:10日均價 ma20:20日均價 v_ma5:5日均量 v_ma10:10日均量 v_ma20:20日均量 turnover:換手率[注:指數無此項]
3、案例
import pandas as pd import numpy as np from pandas import DataFrame,Series import tushare as ts # 獲取k線數據,加載至DataFrame中 df = ts.get_k_data('600519',start='2000-01-01') # 茅台 df.head() # 將從Tushare中獲取的數據存儲至本地 df.to_csv('./maotai.csv') # 將原數據中的時間作為行索引,並將字符串類型的時間序列化成時間對象類型 # index_col參數:把某一列col作為行索引index # parse_dates:把字符串類型的時間序列化成時間對象類型 df = pd.read_csv('./maotai.csv',index_col='date',parse_dates=['date']) df.drop(labels='Unnamed: 0',axis=1,inplace=True) df.head() # 分析1:輸出該股票所有收盤比開盤上漲3%以上的日期 # 獲取滿足條件的行索引 df.loc[(df['close'] - df['open'])/df['open'] > 0.03].index # 分析2:輸出該股票所有開盤比前日收盤跌幅超過2%的日期 df.loc[(df['open'] - df['close'].shift(1)) / df['close'].shift(1) <= -0.02].index # 分析3:假如我從2010年1月1日開始,每月第一個交易日買入1手股票,每年最后一個交易日賣出所有股票,到今天為止,我的收益如何 price_last = df['open'][-1] df = df['2010-01':'2019-01'] # 剔除首尾無用的數據 # Pandas提供了resample函數用便捷的方式對時間序列進行重采樣,根據時間粒度的變大或者變小分為降采樣和升采樣: df_monthly = df.resample("M").first() # 獲取每月第一個交易日對應的行數據 df_yearly = df.resample("Y").last()[:-1] # 獲取每年第最后一個交易日對應的行數據並去除最后一年 cost_money = 0 hold = 0 # 每年持有的股票 for year in range(2010, 2020): cost_money -= df_monthly.loc[str(year)]['open'].sum()*100 hold += len(df_monthly[str(year)]['open']) * 100 if year != 2019: cost_money += df_yearly[str(year)]['open'][0] * hold hold = 0 # 每年持有的股票 cost_money += hold * price_last print(cost_money)
4、雙均線策略
概念
- 金叉:就是指短期的均線向上穿越中期或長期的均線,交點就為金叉,應該買入。
- 死叉:就是指短期的均線向下穿越中期或長期的均線,交點就為死叉,應該賣出。
- 其它指標以此類推
""" 如果我從假如我從2010年1月1日開始,初始資金為100000元,金叉盡量買入,死叉全部賣出,則到今天為止,我的炒股收益率如何?(雙均線策略) """ import tushare as ts import pandas as pd import numpy as np from pandas import DataFrame,Series # 獲取k線數據,加載至DataFrame中 df = ts.get_k_data('600519',start='2000-01-01') # 將從Tushare中獲取的數據存儲至本地 df.to_csv('./maotai.csv') # 將原數據中的時間作為行索引,並將字符串類型的時間序列化成時間對象類型 # index_col參數:把某一列col作為行索引index # parse_dates:把字符串類型的時間序列化成時間對象類型 df = pd.read_csv('./maotai.csv',index_col='date',parse_dates=['date']) df.drop(labels='Unnamed: 0',axis=1,inplace=True) # 獲取需要的數據 df = df['2010':'2019'] # 計算均線 ma5 = df['close'].rolling(5).mean() # 5日均值 ma30 = df['close'].rolling(30).mean() # 30日均值 # 計算出金叉和死叉 s1 = ma5 < ma30 s2 = ma5 > ma30
# 計算金叉死叉圖解
gold = df.loc[~(s1 | s2.shift(1))].index # 金叉 dead = df.loc[s1&s2.shift(1)].index # 死叉 # 計算出結果 first_money = 100000 money = first_money hold = 0 # 持有多少股 sr1 = Series(1, index=gold) # 把所有金叉點組成一個行索引為金叉日期,值為1的Series數組 sr2 = Series(0, index=dead) # 把所有死叉點組成一個行索引為死叉日期,值為0的Series數組 # 合並金叉死叉,並根據時間排序 sr = sr1.append(sr2).sort_index() for i in range(0, len(sr)): p = df['open'][sr.index[i]] # sr.index取到Series索引,sr.index[i],第i個索引 if sr.iloc[i] == 1: # 金叉 buy = (money // (100 * p)) hold += buy*100 money -= buy*100*p else: money += hold * p hold = 0 p = df['open'][-1] now_money = hold * p + money print(now_money - first_money)