一、TuShare簡介和環境安裝
TuShare是一個著名的免費、開源的python財經數據接口包。其官網主頁為:TuShare -財經數據接口包。該接口包如今提供了大量的金融數據,涵蓋了股票、基本面、宏觀、新聞的等諸多類別數據(具體請自行查看官網),並還在不斷更新中。TuShare可以基本滿足量化初學者的回測需求
環境安裝:pip install tushare。如果是老版本升級,可以用升級命令pip install tushare --upgrade3,在python中導入包:import tushare as ts
二、Tushare的應用
我們主要還是應該掌握如何用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:換手率[注:指數無此項]
三、案例分析一(某股票的歷史行情數據)
from typing import Any, Union import tushare as ts import numpy as np import pandas as pd # 使用 df = ts.get_k_data(code="600519", start="2000-01-01") # print(df) # 保存數據到文件 df.to_csv("./600519.csv") # index_col='date' 將源數據中date這一列轉換成行索引index。 # parse_dates=['date'] 將data這一列的數據由str類型轉換成date類型 df = pd.read_csv('./600519.csv', index_col='date', parse_dates=['date']) # 刪除DataFrame數據中多余行 “Unnamed: 0” # 在DataFrame中axis=1表示列 # inplace=True 表示替換源數據 df.drop(labels='Unnamed: 0', axis=1, inplace=True) # print(df) # 需求:輸出該股票所有收盤比開盤上漲3%以上的日期。 #(收盤-開盤)/開盤 >= 0.03 # 偽代碼分析:(df['close'] - df['open']) / df['open'] >= 0.03 # 將上述表達式返回的布爾值作為df的行索引:取出了所有符合需求的行數據 df_row = df.loc[(df['close'] - df['open']) / df['open'] >= 0.03] # print(df_row) # 只獲取行數據的index日期 df_date = df.loc[(df['close'] - df['open']) / df['open'] >= 0.03].index print(df_date) # 需求:輸出該股票所有開盤比前日收盤跌幅超過2%的日期。 # 偽代碼分析:(開盤 - 前日收盤) / 前日收盤 < -0.02 # 獲取滿足條件的返回結果True # shift(1) 當前列向下移一位 df_flag = Union[bool, Any] = (df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02 print(df_flag) # 獲取滿足條件的結果 df_row = df.loc[(df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02] # 只獲取行數據的index日期 df_date = df_row.index print(df_date) # 需求:假如我從2010年1月1日開始,每月第一個交易日買入1手股票,每年最后一個交易日賣出所有股票,到今天為止,我的收益如何? # 數據的重新取樣 # 獲取每月的第一條數據 df_monthly = df.resample('M').first() print(df_monthly) # 獲取每年的最后一條數據,切片[:-1]不獲取最后一年 df_yearly = df.resample('A').last()[:-1] # 所有年份每月第一個交易日購買的股票總數 cost_money = df_monthly['open'].sum()*100 # 所有年份每年最后一個交易日賣出的股票總數 recv_monry = df['open'][-1] * 800 + df_yearly['open'].sum()*1200 # 賣出的股票數-買入的股票數 = 獲取的盈利 print(recv_monry - cost_money)
四、案例分析二(某股票的歷史行情數據)
#o使用tushare包獲取某股票的歷史行情數據 df = pd.read_csv("600519.csv",index_col='date', parse_dates=['date'])[['open','close','low','high']] #o使用pandas包計算該股票歷史數據的5日均線和60日均線 df['ma5']=df['open'].rolling(5).mean() df['ma30']=df['open'].rolling(30).mean() 什么是均線? 對於每一個交易日,都可以計算出前N天的移動平均值,然后把這些移動平均值連起來,成為一條線,就叫做N日移動平均線。移動平均線常用線有5天、10天、30天、60天、120天和240天的指標。 5天和10天的是短線操作的參照指標,稱做日均線指標; 30天和60天的是中期均線指標,稱做季均線指標; 120天和240天的是長期均線指標,稱做年均線指標。 均線計算方法:MA=(C1+C2+C3+...+Cn)/N C:某日收盤價 N:移動平均周期(天數)
o使用matplotlib包可視化歷史數據的收盤價和兩條均線 plt.plot(df[['close','ma5','ma30']].iloc[:100]) o分析輸出所有金叉日期和死叉日期 sr1 = df['ma5'] < df['ma30'] sr2 = df['ma5'] >= df['ma30'] death_cross = df[sr1 & sr2.shift(1)].index golden_cross = df[~(sr1 | sr2.shift(1))].index 股票分析技術中的金叉和死叉,可以簡單解釋為: 分析指標中的兩根線,一根為短時間內的指標線,另一根為較長時間的指標線。 如果短時間的指標線方向拐頭向上,並且穿過了較長時間的指標線,這種狀態叫“金叉”; 如果短時間的指標線方向拐頭向下,並且穿過了較長時間的指標線,這種狀態叫“死叉”; 一般情況下,出現金叉后,操作趨向買入;死叉則趨向賣出。當然,金叉和死叉只是分析指標之一,要和其他很多指標配合使用,才能增加操作的准確性。 o如果我從假如我從2010年1月1日開始,初始資金為100000元,金叉盡量買入,死叉全部賣出,則到今天為止,我的炒股收益率如何? first_money = 100000 money = first_money hold = 0#持有多少股 sr1 = pd.Series(1, index=golden_cross) sr2 = pd.Series(0, index=death_cross) #根據時間排序 sr = sr1.append(sr2).sort_index() for i in range(0, len(sr)): p = df['open'][sr.index[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)