发布时间:2025-11-04 00:18:28 来源:云智核 作者:系统运维
一.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:换手率[注:指数无此项]
案例应用_1:
o使用tushare包获取某股票的网站模板历史行情数据。
#获取k线数据,加载至DataFrame中
df = ts.get_k_data("600519",start="1988-01-01")
#将从Tushare中获取的数据存储至本地
df.to_csv("600519.csv")
#将原数据中的时间作为行索引,并将字符串类型的时间序列化成时间对象类型
df = pd.read_csv("600519.csv", index_col=date,parse_dates=[date])[[open,close,high,low]]
o输出该股票所有收盘比开盘上涨3%以上的日期。
#指定条件
condition = (df[close]-df[open])/df[open]>=0.03
#获取满足条件的行索引
df[condition].index
执行后结果为:
DatetimeIndex([2001-08-27, 2001-08-28, 2001-09-10, 2001-12-21,
2002-01-18, 2002-01-31, 2003-01-14, 2003-10-29,
2004-01-05, 2004-01-14,
...
2018-06-20, 2018-08-09, 2018-08-21, 2018-08-27,
2018-09-18, 2018-09-26, 2018-10-19, 2018-10-31,
2018-11-13, 2018-12-28],
dtype=datetime64[ns], name=date, length=291, freq=None)
o输出该股票所有开盘比前日收盘跌幅超过2%的日期。
condition = (df[open]-df[close].shift(1))/df[close].shift(1)<=-0.02
df[condition].index
执行结果为:
DatetimeIndex([2001-09-12, 2002-06-26, 2002-12-13, 2004-07-01,
2004-10-29, 2006-08-21, 2006-08-23, 2007-01-25,
2007-02-01, 2007-02-06, 2007-03-19, 2007-05-21,
2007-05-30, 2007-06-05, 2007-07-27, 2007-09-05,
2007-09-10, 2008-03-13, 2008-03-17, 2008-03-25,
2008-03-27, 2008-04-22, 2008-04-23, 2008-04-29,
2008-05-13, 2008-06-10, 2008-06-13, 2008-06-24,
2008-06-27, 2008-08-11, 2008-08-19, 2008-09-23,
2008-10-10, 2008-10-15, 2008-10-16, 2008-10-20,
2008-10-23, 2008-10-27, 2008-11-06, 2008-11-12,
2008-11-20, 2008-11-21, 2008-12-02, 2009-02-27,
2009-03-25, 2009-08-13, 2010-04-26, 2010-04-30,
2011-08-05, 2012-03-27, 2012-08-10, 2012-11-22,
2012-12-04, 2012-12-24, 2013-01-16, 2013-01-25,
2013-09-02, 2014-04-25, 2015-01-19, 2015-05-25,
2015-07-03, 2015-07-08, 2015-07-13, 2015-08-24,
2015-09-02, 2015-09-15, 2017-11-17, 2018-02-06,
2018-02-09, 2018-03-23, 2018-03-28, 2018-07-11,
2018-10-11, 2018-10-24, 2018-10-25, 2018-10-29,
2018-10-30],
dtype=datetime64[ns], name=date, freq=None)
o假如我从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("A").last()[:-1] #去除最后一年
cost_money = 0
hold = 0 #每年持有的股票
for year in range(2010, 2019):
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)
案例应用_2:
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)