量化交易是一种应用数学模型帮助投资者进行判断,并且根据计算机程序发送的指令进行交易的投资方式,它极大地减少了投资者情绪波动的影响。量化交易的主要优势如下:
快速检测客观、理性自动化
量化交易的核心是筛选策略,策略也是依靠数学或物理模型来创造,把数学语言变成计算机语言。量化交易的流程是从数据的获取到数据的分析、处理。
数据获取
数据分析工作的第一步就是获取数据,也就是数据采集。获取数据的方式有很多,一般来讲,数据来源主要分为两大类:外部来源和内部来源。
因为我们不生产数据,所以只能从外部获取数据。其获取途径是第三方开源库tushare。
使用tushare获取历史股票数据
tushare是一个免费、开源的Python财经数据接口包。其主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程,能够为金融分析人员提供快速、整洁和多样的便于分析的数据,以减轻他们在数据获取方面的工作量。
安装tushare库,在JupterNotebook下输入以下命令:
%pip install tushare
重启kernel,然后输入以下命令。
import tushare
print("tushare版本号{}".format(tushare.__version__))
tushare版本号1.2.85
获取个股历史交易数据,用户可以通过参数设置获取日K线、周K线、月K线,以及5分钟、15分钟、30分钟和60分钟K线数据。本接口只能获取近3年的日线数据,适合搭配均线数据进行选股和分析。Python代码如下:
返回值说明如下。
date:日期;open:开盘价;high:最高价;close:收盘价;low:最低价;volume:成交量;price_change:价格变动;pchange:涨跌幅;mas:5日均价;ma10日均价;ma20:20日均价;v_mas:5日均量;v_ma10:10日均量;v_ma20:20日均量;
turnover:换手率。
使用tushare获取所有股票即时数据
个股历史交易数据属于延迟数据。面对即时变动的价格数据,我们可以使用更加便捷的当日实时行情,以便在Python量化中快速把握行情,选择出当目符合条件的优秀股票。
下面使用第三方库tushare中的get_today_all两数获取所有股票的即时数据。代码如下:
import tushare as ts
ts.get_today_all()
数据的获取是数据研究的根本。一个快速、准确而稳定的API会极大缩短个人获取数据的时间,从而将研究者的精力更多地投入数据处理与建模中。tushare库也是笔者获取数据的主要方式之它为量化工作提供了稳定而强大的数据来源,从而使数据的采集简单地使用一行代码就可以实现。
数据预处理
无论是量化策略还是单纯的机器学习项目,数据预处理都是非常重要的一环。从量化学习的视角来看,数据预处理主要包括数据清洗、排序、缺失值或异常值处理、统计量分析、相关性分析和主成分分析(PCA)等。
清洗掉ST股票
ST股票通常表示对财务状况或其他状况出现异常的上市公司股票,对其交易要进行特别处理。由于“特别处理”,在简称前冠以ST,因此这类股票称为ST股。
哪支股票的名称前加上ST,就是给市场一个警示,该股票存在投资风险,起警告作用,但这种股票风险大,收益也大,如果加上*ST,就表示该股票有退市风险,要警惕的意思,具体就是在2021年4月左右,如果公司向证监会交的财务报表连续了年亏损,就有退市的风险。股票的交易规则也由报价日涨跌幅限制为涨幅5%、跌幅5%。
我们要回避这类“地雷股”,因而可以使用如下代码来清洗掉ST股票。
import tushare as ts
csv_data=ts.get_today_all()
csv_data[~csv_data.name.str.contains("ST")]
我们对csv_data的name列进行操作,筛选出包含ST字母的行,并对整个DataFrame取反,进而筛选出不含ST股票的行。经过观察,我们发现在运行结果中没有ST股票,实现了数据的初步清洗。
清洗掉没成交量的股票
首先要明确定义,什么是没有成交量的股票。没有成交量不是成交量为零,而是一支股票单位时间的成交量不活跃。成交量是反映股市上人气聚散的一面镜子。人气旺盛、买卖踊跃,成交量自然放大:相反人气低迷、买卖不活跃,成交量必定萎缩。成交量是观察庄家大户动态的有效途径。
下面开始清洗没成交量的股票,在原来的基础上增加代码如下:
import tushare as ts
csv_data=ts.get_today_all()
csv_data=csv_data[~csv_data.name.str.contains("ST")]
csv_data[csv_data["volume"]>15000000]#15万手
在以上代码中,我们对csv_data的volume列进行操作。15万手是过滤掉不活跃、没成交量的股票,主要以小盘股居多。
其运行结果为:
Index出现了调行现象,即为去掉成交量小手15万手的股票。
清洗掉成交额过小的股票
成交额是成交价格与成交数量的乘积,它是指当天已成交股票的金额总数。成交最的至少取决于市场的投资热情。我们每天看大盘,一个重要的指标就是大A股成交量是否超过一万亿元,超过即为成交活跃。
筛选成交额超过1亿元的股票,代码如下:
import tushare as ts
csv_data=ts.get_today_all()
csv_data=csv_data[~csv_data.name.str.contains("ST")]
csv_data=csv_data[csv_data["volume"]>15000000]#15万手
csv_data["amount"]=round(csv_data["amount"]/100000000,2)#一亿,保留2位
csv_data[(csv_data["amount"]>1)]
筛选股票的数量没有锐减,这是因为成交额-成交价格×成交量。有些股票价格低,成交量巨大,乘积刚刚超过1亿元;有些股票价格高,成交量相对小一些,乘积仍然超过1亿元。同成交额,2元股票相对于20元与200元股票,其成交量相差10倍到100倍之多。同成交量,有些股票成交额为100亿元,相对于成交额仅有1亿元的股票,也有百倍之多。
用户可以对1亿元这个参数进行调参,不过笔者不是特别支持。因为将成交额变大即是对大盘股产生偏重,而前面成交量的筛选也己经对大盘股的成交量进行了偏重筛选,这样双重筛选下来,就会全部变成大盘股,数据偏置严重,没有合理性。预处理的思想也是先将数据进行简单的筛选。笔者认为后期的策略相对于这里的调参更为重要,策略是日后交易的核心。
清洗掉换手率低的股票
换手率=某一段时期内的成交量/流通总股数×100%。一般情况下,大多数股票每日换手率在1%~5%之间。70%股票的换手率基本在3%以下,3%就成为一种分界。
当一支股票的换手率在3%~7%之间时,该股进入相对活跃状态。当换手率在7%~10%之间时,则为强势股的出现,股价处于高度活跃中。
筛选换手率超过3的股票,代码如下:
import tushare as ts
csv_data=ts.get_today_all()
csv_data=csv_data[~csv_data.name.str.contains("ST")]
csv_data=csv_data[csv_data["volume"]>15000000]#15万手
csv_data["amount"]=round(csv_data["amount"]/100000000,2)#一亿,保留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位
csv_data[csv_data["turnoverratio"]>3]
筛选股票的数量减半。换手率低于3%当然也有不错的股票,但是根据正态分布,我们不选取小概率事件。选择换手率较好的股票,意味着该文股票的交投越活跃,人们购买该支股票的意愿越高,该股票属于热门股。
换手率商一般意味股票流通性好,进出市场比较容易,不会出现想买买不到、想卖卖不出的现象,具有我较强的变现能力。然而值得注意的是,换手率较高的股票,往往也是短线资金追逐的对象,投机性较强,股价起伏较大,风险也相对较大。
将换手率降序排列并保存数据
换手率是最重要的一个指标,所以将筛选出来的股票换手率进行降序排列并保存,以备日后取证与研究。
将序排列用sort_values两数,保存用to_csv函数。这两个函数都很常用,也比较简单。代码如下:
import tushare as ts
def today_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]#15万手
csv_data["amount"]=round(csv_data["amount"]/100000000,2)#一亿,保留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位
csv_data=csv_data[csv_data["turnoverratio"]>3]
csv_data=csv_data.sort_values(by="turnoverratio", ascending=False)
return csv_data
经过一系列的数据清洗与筛选,选择出符合要求的股票数据并保存到JupterNotebook中。我们将上述代码进行函数化处理,并命名为get_data.py。
以后,只要运行如下代码,就会将得到的csv_data显示出来:
import get_data
get_data.today_data()
模块化后,将去掉大量重复代码,重加专注一个功能,也会增强代码的可读性。
感谢大家的支持~
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点