首页 > 自考资讯 > 自考知识

如何获取a股数据,获取股票数据的2个简单方法

头条共创 2024-07-05

01

介绍

我们收到了许多有量化思维的读者的反馈,他们虽然已经学会了Python编程的基础知识,但他们仍然不知道如何进行股票量化分析,二是他们不知道如何获取股票数据。我想获取股票数据,但不知道如何做定量回测。其实公众号已经分享了很多这方面的文章,可以作为参考模板:《【手把手教你】Python获取交易数据》、《【手把手教你】搭建自己的量化分析数据库》、《【手把手教你】Python面向对象编程入门及股票数据管理应用实例》、《手把手教你用Python搭建自己的量化回测框架【均值回归策略】》、《【手把手教你】用Python量化海龟交易法则》;专业用于量化收益测试框架的话,可以参考Backtrader系列文章,包括【分步指导】量化回测入门最强大神器:Backtrader(一)。目前公众号文章主要使用tusahre来检索数据。其实Python中还有很多可用的数据检索API,比如akshare、baostock、pandas_datareader等开源API(国内外数据丰富,但往往无法检索)。 (连接外网)、alpha_vantage(国外)、quandl(国外)、yfinance(原雅虎财经,经常无法连接外网)、WindPy(Wind付费插件)、恒友数hs_udata(恒盛)等有关这些库和数据API的更多信息,例如Cloud)、聚宽JQData(可试用),请直接访问百度官网了解更多信息。本文主要介绍如何使用开源数据包来检索和执行数据。定量回测提供最简单的代码输出和专业的分析图表。

02

数据采集

下面,我们使用当前流行的四个开源数据包(tusahre、tushare pro、akshare 和baostock)中的统一参数构建数据检索功能,并比较数据检索所需的编程复杂度和时间。

首先导入pandas、matplotlib等常用包。

import pandas as pd import numpy as npimport matplotlib.pyplot as plt#pylab 绘图时正常显示中文和减号import mplmpl.rcParams['font.sans-serif']=['SimHei' ]mpl.rcParams[ 'axes. unicode_minus']=False#不显示警告信息import warningswarnings.filterwarnings('ignore')

构建具有统一参数的数据检索功能。恢复时间、开始时间和结束时间设置为默认参数。请注意,要使用tushare pro,您需要注册才能获取令牌。某些数据权限受到积分限制。旧版本的界面非常简单易用,但已不再维护。 akshare代表一个通过网络连接开放数据源API(新浪财经、同花顺、东方财富等)的数据网站。由于软件包更新,某些功能将不再可用。 Basostock是免费的,不需要注册,但是函数调用有点麻烦。

#使用旧版本的tushare获取数据import tushare as tsdef get_from_tushare(code,adj='hfq',start='2010-01-01',end='2021-11-05'): df=ts .get_k_data (code ,autype=adj,start=start,end=end) df.index=pd.to_datetime(df.date) #原始数据默认按照日期排序return df#获取数据using tushare pro import tushare as tstoken='输入您自己的令牌' pro=ts.pro_api(token)ts.set_token(token)def get_from_tushare_pro(code,adj='hfq',start='2010-01-01',end='2021-11-05 ') : # code: Please Enter a numeric string such as '300002' #开始和结束输入code.startswith('6'): 对于code=,'年月日'必须转换为'年月日'格式code+' .SH' else: 代码=code+'.SZ' start=''.join(start.split('-')) end=''.join(end.split('-')) df=ts.pro_bar (ts_code=code,adj=adj,start_date=start,end_date=end) #原数据是倒序的,所以对时间进行索引,并根据索引排序df.index=pd.to_datetime(df.trade_date ) df=df. sort_index() return df# 使用akshare 检索数据。数据来源来自于新浪,与老版本的tushare类似。 import akshare as akdef get_from_akshare(code,adj='hfq',start=) '2010-01-01',end='2021-11-05') : if code.startswith('6'): code='sh '+code else: code='sz'+code start=''.join (start.split('-')) end=''.join(end .split('-')) df=ak.stock_zh_a_daily(symbol=code, start_date=start, end_date=end,Adjust=adj) return df 使用#baostock 获取数据import baostock as bsdef get_from_baostock(code,adj='hfq' ,start='2010-01-01', end='2021 -11-05'): if code.startswith('6') : code='sh.'+code else: code='sz.'+code # 将权重转换为数字if adj==' hfq': adj=' 1' elif adj=='qfq': adj='2 ' else: adj='3' #必须登录和退出系统bs.login() #登录系统rs=bs.='date,code,open,high,low,close,volume' , start_date=start, end_date=end,Frequency='d', adjustmentflag=adj) #adjustflag: 恢复类型,默认为右不恢复: 1; data_list=[] 之后恢复权限while (rs.error_code=='0') rs.next(): data_list.append(rs.get_row_data()) #追加数据数据帧格式转换为df=pd.DataFrame(data_list , columns=rs.fields) df.index=pd.to_datetime(df.date) bs.logout() #退出系统return df

下面,我们使用这四个API接口来检索数据并比较所消耗的时间。结果显示,tushare pro和akshare只需要0.6到0.8秒即可检索“300002”的数据。 2010.1-2021.11,tushare接口老版本代码最简单,但在baostock上耗时1.05秒。 当然,结果会受到网络状况的影响。

func={'tushare':get_from_tushare, 'tushare pro':get_from_tushare_pro, 'akshare':get_from_akshare, 'baostock':get_from_baostock}#以个股神州泰岳为例code='300002'from time import timedata=pd.DataFrame() for name , f in func.items(): t0=time() data[name]=f(code).close t1=time() print(f'{name}花了:{t1-t0:04f} 秒') 输出结果:

tushare 耗时:1.0488 秒

tushare pro 耗时:0.6780 秒

akshare 花费了:0.7795 秒

登陆成功!

注销成功!

baostock耗时:1.6439秒

对比4个API获取的“300002”回收后价格数据,结果发现4个API获取的数据存在一定差异。其中,途尚股份和宝股股份的数据接近且吻合较好。它与akshare 不同,但这可能是由于计算方法的不同所致。由于收养后权利恢复,分红随着时间的推移而增加,差额越来越大。

数据.tail() 38436c7b765542d29eb4b90165487cf8~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720786583&x-signature=X%2F9u%2FtkaYz6m6CjOFjBrs7dkeQw%3D

(data['tushare pro']-data['akshare']).plot(figsize=(12,5),c='r');

77890aba9310494285c17bbc54fac206~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720786583&x-signature=BOTxGqPBq241qvgOqeJPSf0XD4g%3D

03

策略回测

下面,我们以旧版本的tushare接口为例,获取数据并根据技术指标进行量化回测。从图中可以看出,“300002”股价在2010年1月4日至2021年11月5日期间波动较大,累计收益率为-14.5%,年化收益率为-1.4%,年化波动率为53.8% 你可以看看我做了什么。最大回撤为89%,每日VaR为-6.7%。因此,如果你从2010 年1 月4 日开始持有该股票,到2021 年11 月5 日你将损失14.5%,但如果你在高峰时买入,你的最大损失将是89%。我于2012年12月购买并持有至2015年6月21日。股价上涨了近十倍。现实是,随着股价持续剧烈波动,大量投资者像大葱一样被收割。

df=get_from_tushare('300002')df.close.plot(figsize=(12,6));plt.title('中国泰岳股价走势\n2010-2021',size=15)

e822ae4623d349ef8bf0d00f23e41789~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720786583&x-signature=1vKNT9SVzoPvHJwabGsUMUU%2B%2FYM%3D

将pyfolio 导入为pfpf.create_simple_tear_sheet((df.close.pct_change()).fillna(0).tz_localize('UTC'))

f03bba4b5b81431e969eef7ccf75e0ca~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720786583&x-signature=ZS%2FfIt54z%2BpMIXNqT3Myz9lPBtA%3D

746cb04b3d8e4067bcf60c17ab7560bd~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720786583&x-signature=bXeycM4VAH%2FBhn1gW1fF779FPlw%3D

下面我们将使用趋势指标ADX结合移动平均线和MACD指标来构建量化回测的交易策略。 ADX是常用的趋势衡量指标;指标值越高,趋势越强,但它可以与移动平均线和MACD指标结合使用来确认趋势的方向。是市场趋势并衡量趋势的强度。以13日、55日、89日均线(斐波那契数列)、MACD(12、26、9)、ADX(阈值设置为前值和25)指标为例,如下得到回测结果。

#导入技术分析包talib为tadef adx_strategy(df,ma1=13,ma2=55,ma3=89,adx=25): #计算MACD和ADX指标df['EMA1']=ta.EMA(df.close, ma1) df['EMA2']=ta.EMA(df.close,ma2) df['EMA3']=ta.EMA(df.close,ma3) df['MACD'],df['MACDSignal' ], df['MACDHist']=ta.MACD(df.close,12,26,9) df['ADX']=ta.ADX(df.high,df.low,df.close,14) #Design 购买和卖出信号:21 日均线大于42日均线,42日均线大于63日均线。 ADX 大于先前值且MACD 大于25。先前值df['Buy_Sig']=(df['EMA1']df['EMA2'])(df ['EMA2']df['EMA3'])(df['ADX']=adx)\ ( df ['ADX']df['ADX'].shift(1))(df['MACDHist']df ['MACDHist'].shift(1)) df.loc[df.Buy_Sig,'Buy_Trade']=1 df.loc[df.Buy_Trade.shift(1)==1,'Buy_Trade']=' ' #避免最近3 天内发生的交易df.Buy_Trade.iloc[-3:]=' ' df .loc[df .Buy_Trade==1,'Buy_Price']=df.close df.Buy_Price=df.Buy_Price.ffill() df['Buy_Daily_Return']=(df.close - df.Buy_Price)/df.Buy_Price df .loc[df .Buy_Trade.shift(3)==1,'Sell_Trade']=-1 df.loc[df.Sell_Trade==- 1,'Buy_Total_Return']=df.Buy_Daily_Return df.loc[(df.Sell_Trade==-1) ) (df.Buy_Daily_Return==0),'Buy_Total_Return']=\ (df.Buy_Price - df.Buy_Price.shift(1 ))/df.Buy_Price.shift(1) df.loc[(df.Sell_Trade==- 1) )(df.Buy_Trade.shift(1)==1),'Buy_Total_Return']=\ (df.close-df .Buy_Price.shift(2))/df.Buy_Price.shift(2) #每日回报率策略回报return df.Buy_Total_Return.fillna(0)

回测结果显示,使用该交易策略,可以获得年化收益11.3%,累计收益221.5%,最大回撤-24.2%,夏普比率0.63。采用该策略后,各项指标均得到有效改善。

将pyfolio 导入为pfpf.create_simple_tear_sheet(adx_strategy(df).tz_localize('UTC')) 36bf079fb3f74ee3b0bd6274eefdd978~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720786583&x-signature=wUC%2Bb9p2tYLwWqnL2bpbRNvqi5o%3D 2da6bfcfec8f4e7db21380217a9b0c1c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720786583&x-signature=ie8CuqVZ1Rlt1RjAWZVBEkbZzgc%3D

04

结论

在本文中,我们将为tushare、tushare pro、akshare、baostock 的开源数据API 构建一个使用统一参数的数据检索功能,检索个股的恢复后数据,并计算移动平均线和MACD。综合技术指标ADX。建立定量回测的交易策略。在此基础上,本文旨在提供利用开源数据进行定量分析的思路和模板,以便读者进一步了解市场。请注意,本文提到的交易策略仅供教育参考,不应直接用于实际交易。事实上,本文中的单一目标“300002”回测得到的结果并不意味着该交易策略有效,只是表明它适用于任何基于技术的交易策略。指标有一定的局限性。 具体问题具体分析。

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢