金融量化之Tushare模塊


一、介紹

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環境和全部依賴包,減少問題出現的幾率。

 

下載安裝

 

版本升級

  • 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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM