Python量化交易实战:获取股票数据并做分析处理大大降低投资者情绪波动的影响。量化交易的主要优势在于:快速检测、客观、理性、自动化的量化交易。量化交易的核心是筛选策略,也是通过数学或物理模型创建的,将数学语言转化为计算机语言。量化交易的过程是从数据获取到数据分析处理。数据采集??数据分析工作的第一步是获取数据,即数据采集。获取数据的方式有很多种。一般来说,数据来源主要分为两类:外部来源(外部采购、网络爬取、免费开源数据等)和内部来源(自有公司销售数据、财务数据等)。因为我们不生产数据,所以只能从外部获取数据。获取方式为第三方开源库tushare。使用tushare获取历史股票数据tushare是一个免费、开源的Python金融数据接口包。主要实现股票等金融数据从数据采集、清洗、处理到数据存储的全过程,能够为金融分析师提供快速、干净、多样、易于分析的数据,减轻他们在数据获取上的工作量。要安装tushare库,在JupterNotebook中输入以下命令:%pipinstalltusharerestartthekernel,然后输入以下命令。importtushareprint("tushare版本号{}".format(tushare.__version__))tushare版本号1.2.85获取个股历史成交数据(含均线数据),用户可获取日K线、周K-线,月度K线通过参数设置K线,5分钟,15分钟,30分钟,60分钟K线数据。该接口只能获取近3年的日数据,适用于有均线数据的选股分析。Python代码如下:importtushareaststs.get_hist_data('000001')#一次性获取所有日k线数据'''参数说明:code:股票代码,即6位代码,或者一个指数代码(sh=上证指数sz=深成指hs300=沪深300指数sz50=上证50zxb=中小板cyb=创业板)start:startdate,格式YYYY-MM-DDend:结束日期,格式YYYY-MM-DDktype:数据类型,D=日k线W=周M=月5=5分钟15=15分钟30=30分钟60=60分钟,默认为Dretry_count:次数网络异常时重试,默认3pause:重试时暂停秒数,默认例如:ts.get_hist_data('000001',ktype='W')#获取周k线数据ts.get_hist_data('000001',ktype='M')#获取月k线数据ts.get_hist_data('000001',ktype='5')#获取5分钟k线数据ts.get_hist_data('000001',ktype='15')#获取15分钟k线数据ts.get_hist_data('000001',ktype='30')#获取30分钟k线数据ts.get_hist_data('000001',ktype='60')#获取60分钟k线数据ts.get_hist_data('sh')#获取上证指数k线datats.get_hist_data('sz')#获取深成指k线数据ts.get_hist_data('hs300')#获取沪深300指数k线数据ts.get_hist_data('000001',start='2021-01-01',end='2021-03-20')#获取“000001”从2021-01-01到2021-03-20的k线数据'''返回值解释如下.日期:日期;open:开盘价;高:最高价;close:收盘价;low:最低价;volume:交易量;price_change:价格变动;pchange:变化;mas:5天平均价;10天平均价;ma20:20日均价;v_mas:5天平均成交量;v_ma10:10天平均交易量;v_ma20:20天平均成交量;turnover:换手率(注:此项不计入指标)。使用tushare获取所有股票的实时数据。个股历史成交数据为滞后数据。面对实时变化的价格数据,我们可以利用更方便的当日实时行情,用Python量化快速把握行情,挑选出符合当下条件的优秀个股。接下来使用第三方库tushare中的get_today_all()函数获取所有股票的实时数据(如果是节假日则为前一个交易日)。代码如下:importtushareaststs.get_today_all()数据获取是数据研究的基础。一个快速、准确、稳定的API将大大缩短个人获取数据的时间,让研究人员可以将更多的精力投入到数据处理和建模中。tushare库也是笔者获取资料的主要途径之一。为量化工作提供稳定、强大的数据源,让一行简单的代码即可实现数据采集。数据预处理无论是量化策略还是纯机器学习项目,数据预处理都是非常重要的一环。从量化学习的角度来看,数据预处理主要包括数据清洗、排序、缺失值或异常值处理、统计分析、相关分析和主成分分析(PCA)等。由于前书收集的是常规的股票数据,因此数据预处理对本章要介绍的是预先剔除不合格的库存数据,然后对剩余库存进行优化筛选。本章主要使用Pandas库,读者重点理解过滤思想。ST股清理ST股通常表示对财务状况或其他情况异常的上市公司股票进行特殊处理。由于“特殊待遇”,简称前加ST,故这类股票称为ST股票。在任何股票名称前加上ST,都是对市场的警示。该股有投资风险,起到警示作用,但该股高风险高收益。如果加*ST,表示该股退市风险意味着要提高警惕。具体而言,2021年4月前后,若公司连续多年亏损向证监会提交财务报表,则存在退市风险。股票的交易规则也限制在报价日上涨5%和下跌5%。我们要避开这样的“地雷股”(ST股),所以可以用下面的代码来洗出ST股。importtushareastscsv_data=ts.get_today_all()csv_data[~csv_data.name.str.contains('ST')]我们对csv_data的name列进行操作,过滤掉包含ST字母的行,并对整个DataFrame取反,然后过滤排除不包含ST股票的行。经过观察,我们发现运行结果中没有ST股,初步实现了数据清洗。清理无量股,首先要明确什么是无量股。没有成交量并不代表成交量为零,而是一只股票单位时间内的成交量不活跃。成交量是反映股市火爆程度的一面镜子。人气旺盛,交易活跃,交易量自然会增加;相反,人气低、交易不活跃,必然导致交易量萎缩。成交量是观察大庄家动态的有效途径。接下来开始清理没有成交量的个股,在原来的基础上添加如下代码:importtushareastscsv_data=ts.get_today_all()csv_data=csv_data[~csv_data.name.str.contains('ST')]csv_data[csv_data["volume"]>15000000]#150,000手在上面的代码中,我们对csv_data的volume列进行了操作。这150,000手是为了过滤掉不活跃和未交易的股票,主要是小盘股。其运行结果为:指数出现线状调整现象,即剔除15万只成交量小的个股。清理成交量过小的个股。成交量是成交价格与成交量的乘积,是指当日股票已成交的总量。最好的交易至少取决于市场的投资热情。我们每天看行情,一个重要的指标就是大A股的成交量是否超过1万亿元,如果超过了,就是交投活跃。筛选成交额超亿元的个股,代码如下:"volume"]>15000000]#150,000手csv_data["amount"]=round(csv_data["amount"]/100000000,2)#100,000,000,保留2位数csv_data[(csv_data["amount"]>1)]筛选个股市场成交量并没有大幅下降,这是因为成交量-成交价×成交量。有的股票价格低,成交量巨大,产品刚过亿元;部分个股价格偏高,成交量相对较小,产品至今仍突破亿元。同样的成交量,2元股的成交量与20元、200元股的成交量相差10到100倍。同样的成交量,一些个股的成交量是100亿元,是成交量只有1亿元的个股的100倍。用户可以调整1亿元的参数,但笔者并不是特别支持。因为放大成交量是对大盘股的侧重,而之前的成交量筛选也对大盘股的成交量进行了偏向筛选。这样双重筛选之后,全部变成大盘股,数据就会出现偏差。说真的,没有理由。预处理的思路就是简单的先对数据进行过滤。笔者认为后期的策略比这里的参数调整更重要,策略是未来交易的核心。清理换手率低的股票=一定时期内的换手率/流通股总数×100%。一般情况下,大部分股票的日换手率在1%至2.5%之间(不包括新上市股票)。70%个股换手率基本在3%以下,3%成为分界线。当一只股票的换手率在3%到7%之间时,这只股票就进入了相对活跃的状态。当换手率在7%到10%之间时,就是强势股的出现,股价高度活跃。筛选换手率超过3的个股,代码如下:importtushareastscsv_data=ts.get_today_all()csv_data=csv_data[~csv_data.name.str.contains('ST')]csv_data=csv_data[csv_data["volume"]>15000000]#150,000手csv_data["amount"]=round(csv_data["amount"]/100000000,2)#1亿手,保留2位csv_data=csv_data[(csv_data["amount"]>1)]csv_data["liutongliang"]=csv_data["nmc"]/csv_data["trade"]#增加流通盘的columncsv_data["turnoverratio"]=round(csv_data["turnoverratio"],2)#Reserve2digitsforturnoverratecsv_data[csv_data["turnoverratio"]>3]筛选的股票数量减半。当然,也有换手率低于3%的好股,但根据正态分布,我们不选择小概率事件。选择换手率较好的股票,意味着该股票的交易越活跃,人们购买该股票的意愿就越高,该股票就是热门股票。换手率商数一般表示股票流动性好,进出市较容易。不会出现想买就买不到,想卖就卖不出去的现象。它有我强大的流动性。但值得注意的是,换手率高的个股往往是短线资金追逐的目标。投机性强,股价波动大,风险相对较高。将换手率降序排列并保存数据换手率是最重要的指标,所以将选取的股票换手率降序排列保存,以备日后取证研究。使用sort_values()对两个数字进行排序,并使用to_csv()函数保存它们。这两个函数很常用,也比较简单。代码如下:importtushareastsdeftoday_data():csv_data=ts.get_today_all()csv_data=csv_data[~csv_data.name.str.contains('ST')]csv_data=csv_data[csv_data["volume"]>15000000]#150,000手csv_data["amount"]=round(csv_data["amount"]/100000000,2)#1亿,保留2位csv_data=csv_data[(csv_data["amount"]>1)]csv_data["liutongliang"]=csv_data["nmc"]/csv_data["trade"]#增加流通盘的栏目csv_data["turnoverratio"]=round(csv_data["turnoverratio"],2)#预留2位数的成交额ratecsv_data=csv_data[csv_data["turnoverratio"]>3]csv_data=csv_data.sort_values(by="turnoverratio",ascending=False)returncsv_data经过一系列的数据清洗筛选,选择符合要求的股票数据并将其保存在JupterNotebook中。我们将上面的代码功能化,并将其命名为get_data.py。以后只要运行下面的代码,就会显示得到的csv_data:importget_dataget_data.today_data()经过模块化处理,去掉大量重复的代码,专注于一个功能也会增强可读性代码。本文节选自《Python量化交易实战》,经发布者授权发布。(书号:9787522602820)
