一、Tushare介紹
Tushare是一個免費、開源的python財經數據接口包。主要實現對股票等金融數據從數據采集、清洗加工到數據存儲的過程,能夠為金融分析人員提供快速、整潔、多樣的便於分析的數據,使得數據獲取方面極大地減輕工作量,更加專注於策略和模型的研究和實現。
Tushare從新浪財經、騰訊財經、上交所、深交所獲取數據。
1、Tushare使用和安裝
(1)使用前提
安裝python、安裝pandas包、安裝lxml包、bs4包、requests包。環境如下所示:
(2)下載安裝
# 方法一: pip install tushare # 方法二: 訪問https://pypi.python.org/pypi/Tushare
(3)版本升級
# 版本更新 pip install tushare --update # 檢查版本信息 print(tushare.__version__)
二、歷史行情(get_hist_data/get_h_data)接口
get_hist_data接口:獲取個股歷史交易數據(包含均線數據),可以通過參數設置獲取日k線、周k線、月k線,以及5分鍾、15分鍾、30分鍾和60分鍾k線數據。本接口只能獲取近3年的日線數據,適合搭配均線數據進行選股和分析。
start為空取API所提供最早日期數據,end為空取最近一個交易日數據。
import tushare as ts print(ts.get_hist_data("601318")) """ open high close low ... ma20 v_ma5 v_ma10 v_ma20 date ... 2020-01-23 84.01 84.56 83.49 82.48 ... 85.610 807119.55 711352.85 634487.17 2020-01-22 85.00 85.48 85.22 83.83 ... 85.632 690831.24 663221.99 596297.65 2020-01-21 87.00 87.29 85.60 85.60 ... 85.594 648759.18 652369.61 574079.03 2020-01-20 88.30 88.70 87.60 87.35 ... 85.528 646579.65 624830.50 560559.15 2020-01-17 86.15 86.90 86.25 85.85 ... 85.425 621487.27 594870.25 531672.07 ... ... ... ... ... ... ... ... ... ... 2017-07-31 51.88 52.64 52.02 51.41 ... 52.094 587775.69 587775.69 587775.69 2017-07-28 52.20 52.46 51.89 51.80 ... 52.113 580718.35 580718.35 580718.35 2017-07-27 51.85 52.74 52.36 51.09 ... 52.187 610526.22 610526.22 610526.22 2017-07-26 52.10 52.50 51.89 51.28 ... 52.100 582222.86 582222.86 582222.86 2017-07-25 52.62 53.05 52.31 52.18 ... 52.310 506834.84 506834.84 506834.84 """
get_h_date接口:獲取個股全部歷史數據,其他同上。(已失效)
start為空取當前日期,end為空取去年今日。
get_k_data接口:獲取k線數據,融合了get_hist_data和get_h_data兩個接口的功能,即能方便獲取日周月的低頻數據,也可以獲取5、15、30和60分組相對高頻的數據。同時,上市以來的前后復權數據也能在一行代碼中輕松獲得。
start為空取上市首日,end為空取最近一個交易日
import tushare as ts # print(ts.get_hist_data("601318")) print(ts.get_k_data("601318")) """ date open close high low volume code 0 2017-06-15 44.946 43.984 45.212 43.727 1041983.0 601318 1 2017-06-16 43.908 44.479 44.936 43.908 807231.0 601318 2 2017-06-19 44.727 46.251 46.317 44.470 808481.0 601318 3 2017-06-20 46.451 45.812 46.603 45.403 616355.0 601318 4 2017-06-21 46.003 47.079 47.203 45.298 849757.0 601318 .. ... ... ... ... ... ... ... 635 2020-01-17 86.150 86.250 86.900 85.850 555370.0 601318 636 2020-01-20 88.300 87.600 88.700 87.350 936050.0 601318 637 2020-01-21 87.000 85.600 87.290 85.600 727579.0 601318 638 2020-01-22 85.000 85.220 85.480 83.830 736576.0 601318 639 2020-01-23 84.010 83.490 84.560 82.480 1080020.0 601318 """
1、參數說明
code:股票代碼,即六位數字代碼,或者指數代碼(sh:上證指數,sz:深圳指數,hs300:滬深300指數,sz50:上證50,zxb:中小板,cyb:創業板)
start:開始日期,格式YYYY-MM-DD
end:結束日期,格式YYYY-MM-DD
ktype:數據類型,(D:日k線,W:周k線,M:月,5:5分鍾,15:15分鍾,30:30分鍾,60:60分鍾,默認為D)
retry_count:當網絡異常后重試次數,默認為3
pause:重復請求數據過程中暫停的秒數,防止請求間隔時間太短出現的問題,默認為0
autype:復權類型,qfq-前復權,hfq-后復權,None-不復權,默認為qfq
index:是否為指數,設置為True時認為code為指數代碼,默認為False
2、返回值說明
data:日期
volume:成交量 turnover:換手率(指數無此項)
open:開盤價 close:收盤價
high:最高價 low:最低價
price_change:價格變動 p_change:漲跌幅
ma5:5日均價 ma10:10日均價 ma20:20日均價
v_ma5:5日均量 v_ma10:10日均量 v_ma20:20日均量
3、用index指定指數代碼
設置為True時認定為指數代碼。
import tushare as ts df = ts.get_k_data("000016", index=True) print(df) """ date open close high low volume code 0 2017-06-15 2474.26 2461.97 2481.80 2453.13 20702545.0 sh000016 1 2017-06-16 2454.84 2452.79 2466.69 2448.31 16518044.0 sh000016 2 2017-06-19 2455.03 2484.12 2486.31 2453.35 20594004.0 sh000016 3 2017-06-20 2489.20 2474.43 2492.22 2467.77 17771153.0 sh000016 4 2017-06-21 2487.85 2497.25 2498.19 2468.51 20354217.0 sh000016 .. ... ... ... ... ... ... ... 635 2020-01-17 3054.04 3053.17 3067.56 3042.59 23304514.0 sh000016 636 2020-01-20 3070.67 3065.99 3072.29 3054.45 27274849.0 sh000016 637 2020-01-21 3048.95 3012.11 3050.82 3011.18 32801291.0 sh000016 638 2020-01-22 2996.81 3017.88 3023.90 2965.66 33159760.0 sh000016 639 2020-01-23 2993.77 2932.49 2993.77 2910.39 42839352.0 sh000016 """
三、復權數據
1、復權概念
復權就是對股價和成交量進行權息修復,按照股票的實際漲跌繪制股價走勢圖,並把成交量調整為相同的股本口徑,然后用相同成本進行比較。復權可以消除由於除權除息造成的價格走勢畸變,保持股價走勢的連續性。
不復權就是除權后,不人工填補股價走勢圖上的巨大空隙,任由斷層存在。
前復權就是以目前股價為基准,保持現有價位不變,縮減以前價格,把除權前的 K 線向下平移,使圖形吻合,保持股價走勢的連續性。簡單說就是把除權前的價格按現在的價格換算過來,復權后現在價格不變,以前的價格減少。
前復權公式:復權后價格 = ( 復權前價格 - 現金紅利 ) / ( 1+ 流通股份變動比例 )
后復權是指在 K 線圖上以除權前的價格為基准來測算除權后股票的市場成本價。簡單說就是把除權后的價格按以前的價格換算過來,復權后以前的價格不變,現在的價格增加。通過后復權我們可以看出該股上市以來累計漲幅,如果當時買入,參與全部配送、分紅,一直持有到目前的價位。
后復權公式:復權后價格 = 復權前價格 × ( 1+ 流通股份變動比例 ) + 現金紅利
2、查看個股上市日期
import tushare as ts df = ts.get_stock_basics() date = df.ix['600848']['timeToMarket'] print(date) # 19940324
3、獲取個股復權數據
import tushare as ts # 獲取個股復權數據 df1 = ts.get_k_data('002337') # 前復權 print(df1) """ date open close high low volume code 0 2017-06-15 5.884 5.953 5.973 5.834 38690.0 002337 1 2017-06-16 5.953 5.963 5.973 5.913 21518.0 002337 2 2017-06-19 5.933 5.983 5.993 5.933 23512.0 002337 3 2017-06-20 6.003 5.953 6.003 5.943 27808.0 002337 4 2017-06-21 5.953 5.953 6.023 5.884 25967.0 002337 .. ... ... ... ... ... ... ... 635 2020-01-17 3.730 3.660 3.730 3.660 29073.0 002337 636 2020-01-20 3.650 3.660 3.690 3.620 23381.0 002337 637 2020-01-21 3.660 3.610 3.670 3.610 23591.0 002337 638 2020-01-22 3.600 3.610 3.630 3.520 32295.0 002337 639 2020-01-23 3.610 3.500 3.650 3.400 42815.0 002337 """ df2 = ts.get_k_data('002337', autype='hfq') # 后復權 print(df2) """ date open close high low volume code 0 2017-06-15 30.589 30.952 31.056 30.330 38690.0 002337 1 2017-06-16 30.952 31.004 31.056 30.745 21518.0 002337 2 2017-06-19 30.849 31.108 31.160 30.849 23512.0 002337 3 2017-06-20 31.211 30.952 31.211 30.900 27808.0 002337 4 2017-06-21 30.952 30.952 31.315 30.589 25967.0 002337 .. ... ... ... ... ... ... ... 635 2020-01-17 19.393 19.029 19.393 19.029 29073.0 002337 636 2020-01-20 18.977 19.029 19.185 18.821 23381.0 002337 637 2020-01-21 19.029 18.769 19.081 18.769 23591.0 002337 638 2020-01-22 18.717 18.769 18.873 18.301 32295.0 002337 639 2020-01-23 18.769 18.197 18.977 17.677 42815.0 002337 """ df3 = ts.get_k_data('002337', autype=None) # 不復權 print(df3) """ date open close high low volume code 0 2017-06-15 5.90 5.97 5.99 5.85 38690.0 002337 1 2017-06-16 5.97 5.98 5.99 5.93 21518.0 002337 2 2017-06-19 5.95 6.00 6.01 5.95 23512.0 002337 3 2017-06-20 6.02 5.97 6.02 5.96 27808.0 002337 4 2017-06-21 5.97 5.97 6.04 5.90 25967.0 002337 .. ... ... ... ... ... ... ... 635 2020-01-17 3.73 3.66 3.73 3.66 29073.0 002337 636 2020-01-20 3.65 3.66 3.69 3.62 23381.0 002337 637 2020-01-21 3.66 3.61 3.67 3.61 23591.0 002337 638 2020-01-22 3.60 3.61 3.63 3.52 32295.0 002337 639 2020-01-23 3.61 3.50 3.65 3.40 42815.0 002337 """ df4 = ts.get_k_data('002337', start='2015-01-01', end='2015-03-16') # 兩個日期間前復權數據 print(df4) """ date open close high low volume code 0 2015-01-05 8.677 8.744 9.475 8.644 117051.0 002337 1 2015-01-06 8.385 9.153 9.309 8.182 142634.0 002337 2 2015-01-07 9.060 9.718 10.067 8.711 235935.0 002337 3 2015-01-08 9.342 9.406 9.715 9.246 128256.0 002337 .. ... ... ... ... ... ... ... 41 2015-03-10 13.123 13.552 13.632 12.684 1057530.0 002337 42 2015-03-11 13.313 13.113 13.442 12.964 591102.0 002337 43 2015-03-12 13.253 13.243 13.911 12.924 715057.0 002337 44 2015-03-13 13.004 13.333 13.343 12.964 405488.0 002337 45 2015-03-16 13.233 13.353 13.412 12.964 812129.0 002337 """
四、大盤指數行情列表
獲取大盤指數實時行情列表,以表格的形式展示大盤指數實時行情。
1、調用方法
import tushare as ts df = ts.get_index() print(df)
2、返回值說明
code:指數代碼
name:指數名稱
change:漲跌幅
open:開盤點位
preclose:昨天收盤點位
close:收盤點位
high:最高點位
low:最低點位
volume:成交量(手)
amount:成教金額(億元)
3、調用結果顯示
code name change ... low volume amount 0 000001 上證指數 -2.75 ... 2955.3460 272763234 3274.9036 1 000002 A股指數 -2.75 ... 3096.7191 272375143 3272.4163 2 000003 B股指數 -3.47 ... 246.4306 388091 2.4873 3 000008 綜合指數 -2.51 ... 2834.5232 61940755 716.1844 4 000009 上證380 -3.43 ... 4770.1956 57463666 700.2298 5 000010 上證180 -2.90 ... 8513.7663 97054465 1428.8354 .. ... ... ... ... ... ... ... 16 399005 中小板指 -3.31 ... 6944.9460 4628035966 830.3480 17 399006 創業板指 -3.32 ... 1904.2750 11576635669 1710.6619 18 399008 中小300 -3.43 ... 1321.9150 9981028403 1409.6974 19 399100 新 指 數 -3.49 ... 7974.4380 39492412447 4787.0620 20 399101 中小板綜 -3.30 ... 9899.0470 17783593837 2065.2582 21 399106 深證綜指 -3.45 ... 1740.1390 40289425936 4815.4754 22 399107 深證A指 -3.45 ... 1820.2840 40248235084 4813.7496 23 399108 深證B指 -2.26 ... 963.9610 41190852 1.7258 24 399333 中小板R -3.31 ... 7818.6200 4628035966 830.3480 25 399606 創業板R -3.32 ... 2008.9970 3195889692 672.5783
五、數據存儲
數據存儲模塊主要是引導用戶將數據保存在本地磁盤或數據庫服務器中,便於后期量化分析和回測使用。
在以文件格式保存在電腦磁盤的方式上,調用的是pandas本身自帶的方法。
1、CSV文件
pandas的DataFrame和Series對象提供了直接保存csv文件格式的方法,通過參數設定,輕松將數據內容保存在本地磁盤。
(1)保存csv文件示例
import tushare as ts # 保存為csv文件 df = ts.get_k_data("000875") # 直接保存 df.to_csv('000875.csv') # 選擇保存 df.to_csv('000875.csv', columns=['open', 'high', 'low', 'close'])
直接保存,保存效果如下所示:
選擇保存,覆蓋直接保存內容,保存效果如下所示:
(2)追加數據示例
在需要將同類數據保存在一個大文件時,需要將數據追加到同一個文件內:
import tushare as ts import os filename = 'bigfile.csv' for code in ['000875', '600848', '000981']: df = ts.get_hist_data(code) if os.path.exists(filename): df.to_csv(filename, mode='a', header=None) else: df.to_csv(filename)
程序運行完顯示效果:
注意:如果不考慮header,直接df.to_csv(filename, mode='a')即可。否則,每次循環都會把columns名稱append進去。
(3)參數說明
path_or_buf:csv文件存放路徑或StringIO對象
sep:文件內容分隔符,默認為逗號
na_rep:在遇到NaN值時保存為某字符,默認為' '空字符
float_format:float類型的格式
columns:需要保持的列,默認為None
header:是否保存columns名,默認為True
index:是否保存index,默認為True
mode:創建新文件還是追加到現有文件,默認為新建
encoding:文件編碼格式
date_format:日期格式
2、Excel文件
pandas將數據保存為MicroSoft Excel文件格式。
(1)調用示例
import tushare as ts df = ts.get_hist_data('000875') #直接保存 df.to_excel('000875.xlsx') #設定數據位置(從第3行,第6列開始插入數據) # df.to_excel('000875.xlsx', startrow=2,startcol=5)
(2)參數說明
excel_writer:文件路徑或ExcelWriter對象
sheet_name:sheet名稱,默認為Sheet1
sep:文件內容分隔符,默認為 ',' 逗號
na_rep:在遇到NaN值時保存為某字符,默認為' '空字符
float_format:float類型的格式
columns:需要保持的列,默認為None
header:是否保存columns名,默認為True
index:是否保存index,默認為True
encoding:文件編碼格式
startrow:在數據頭部留出startrow行空行
startcol:在數據左邊留出startcol列空列
3、其他存儲類型
pandas利用PyTables包將數據保存為HDF5格式的文件。需要確認的是,運行時PyTables包的版本需要 >=3.0.0。
pandas生成Json格式的文件或字符串。
pandas提供了將數據便捷存入關系型數據庫的方法,在新版的pandas中,主要是已sqlalchemy方式與數據建立連接,支持MySQL、Postgresql、Oracle、MS SQLServer、SQLite等主流數據庫。
參數和使用方法見:http://tushare.org/storing.html
六、股票分析練習
(1)獲取某股票的歷史行情數據
import tushare as ts import pandas as pd ts.get_k_data("600570", start="2004-01-30").to_csv('600570.csv') # pandas讀取文件,date列作為索引和時間對象,且僅保留骨架四列 df = pd.read_csv('600570.csv', index_col="date", parse_dates=['date'])[['open', 'close', 'high', 'low']]
(2)輸出該股票所有收盤比開盤上漲3%以上的日期
res = df[(df['close']-df['open'])/df['open']>=0.03].index print(res) """ DatetimeIndex(['2004-02-03', '2004-02-16', '2004-03-30', '2004-04-08', '2004-04-27', '2004-05-12', '2004-05-18', '2004-05-31', '2004-06-01', '2004-06-21', ... '2019-07-23', '2019-08-15', '2019-08-19', '2019-08-27', '2019-09-02', '2019-10-25', '2019-12-10', '2019-12-30', '2020-01-17', '2020-01-22'], dtype='datetime64[ns]', name='date', length=592, freq=None) """
(3)輸出該股票所有開盤比前日收盤跌幅超過2%的日期
# shift:對某一列進行向上或向下平移 res_2 = df[(df['open']-df['close'].shift(1))/df['close'].shift(1) <= -0.02].index print(res_2) """ DatetimeIndex(['2004-04-12', '2004-04-27', '2004-07-05', '2004-07-06', '2004-10-29', '2004-12-13', '2004-12-15', '2005-04-27', '2005-04-28', '2005-07-12', ... '2019-03-08', '2019-03-25', '2019-04-09', '2019-05-06', '2019-05-08', '2019-05-15', '2019-08-02', '2019-08-06', '2019-08-15', '2019-08-26'], dtype='datetime64[ns]', name='date', length=197, freq=None) """
(4)假如我從2010年1月1日開始,每月第一個交易日買入1手股票,每年最后一個交易日賣出所有股票,到今天為止,我的收益如何?
df = df["2010-01-01":] # 剔除無用數據 # Pandas中的resample,重新采樣,是對原樣本重新處理的一個方法,是一個對常規時間序列數據重新采樣和頻率轉換的便捷的方法。 df_monthly = df.resample('M').first() # 每個月第一個交易日的行情 # print(df_monthly['2011']) # 這樣可以切出2011年的數據 df_yearly = df.resample('A').last() # 每年最后一個交易日的行情 cost_money = 0 # 錢 hold = 0 # 股票 for year in range(2010, 2021): # 2010年到2020年 cost_money += df_monthly[str(year)]['open'].sum() * 100 # 對應年每個月首個交易日開盤價之和 乘以 100 得到當年消費的錢 hold += len(df_monthly[str(year)]['open']) * 100 # 對應年購買的股票數量總和 if year != 2020: # 現在是2020年2月,需刨去2020年 cost_money -= df_yearly[str(year)]['open'][0] * hold # 每年最后一個交易日賣出得到的錢 hold = 0 # 股票清零 price_last = df['open'][-1] # 當前最后一日開盤價 cost_money -= hold * price_last # 花掉的錢應刨去手里最后持有的股票價值 if cost_money >= 0: print("掙了", cost_money) else: print("虧了", cost_money) """ 虧了 -11591.099999999977 """