Python量化交易实战:获取股票数据并做分析处理

量化交易(也称自动化交易)是一种应用数学模型帮助投资者进行判断,并且根据计算机程序发送的指令进行交易的投资方式,它极大地减少了投资者情绪波动的影响。量化交易的主要优势如下:

快速检测客观、理性自动化

量化交易的核心是筛选策略,策略也是依靠数学或物理模型来创造,把数学语言变成计算机语言。量化交易的流程是从数据的获取到数据的分析、处理。

数据获取

数据分析工作的第一步就是获取数据,也就是数据采集。获取数据的方式有很多,一般来讲, 数据来源主要分为两大类:外部来源(外部购买、网络爬取、免费开源数据等)和内部来源 (自己企业销售数据、财务数据等)。

因为我们不生产数据,所以只能从外部获取数据。其获取途径是第三方开源库tushare。

使用 tushare 获取历史股票数据

tushare 是一个免费、开源的Python 财经数据接口包。其主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程,能够为金融分析人员提供快速、整洁和多样的便于分析的数据,以减轻他们在数据获取方面的工作量。

安装 tushare 库,在 Jupter Notebook 下输入以下命令:

%pip install tushare

登录后复制

Python量化交易实战:获取股票数据并做分析处理

重启kernel,然后输入以下命令。

import tushareprint("tushare版本号{}".format(tushare.__version__))

登录后复制

tushare版本号1.2.85

登录后复制

获取个股历史交易数据(包括均线数据),用户可以通过参数设置获取日K线、周K线、月K线,以及5分钟、15 分钟、30 分钟和 60分钟K线数据。本接口只能获取近3年的日线数据,适合搭配均线数据进行选股和分析。Python 代码如下:

importtushareaststs.get_hist_data('000001') #一次性获取全部日k线数据'''参数说明:code:股票代码,即6位数字代码,或者指数代码(sh=上证指数 sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板)start:开始日期,格式YYYY-MM-DDend:结束日期,格式YYYY-MM-DDktype:数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟,默认为Dretry_count:当网络异常后重试次数,默认为3pause:重试时停顿秒数,默认为0例如: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线数据ts.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线数据'''

登录后复制

Python量化交易实战:获取股票数据并做分析处理

返回值说明如下。

date: 日期;open:开盘价;high:最高价;close:收盘价;low:最低价;volume:成交量;price_ change:价格变动;pchange:涨跌幅;mas:5日均价;ma10:10 日均价;ma20:20日均价;v_mas:5日均量;v_ma10: 10日均量;v_ma20:20日均量;

turnover:换手率(注:指数无此项)。

使用 tushare 获取所有股票即时数据

个股历史交易数据属于延迟数据。面对即时变动的价格数据,我们可以使用更加便捷的当日实时行情,以便在Python 量化中快速把握行情,选择出当目符合条件的优秀股票。

下面使用第三方库 tushare 中的 get_today_all() 两数获取所有股票的即时数据(如果是节假日,即为上一交易日)。代码如下:

importtushareaststs.get_today_all()

登录后复制

Python量化交易实战:获取股票数据并做分析处理

数据的获取是数据研究的根本。一个快速、准确而稳定的 API会极大缩短个人获取数据的时间,从而将研究者的精力更多地投入数据处理与建模中。tushare 库也是笔者获取数据的主要方式之它为量化工作提供了稳定而强大的数据来源,从而使数据的采集简单地使用一行代码就可以实现。

数据预处理

无论是量化策略还是单纯的机器学习项目,数据预处理都是非常重要的一环。从量化学习的视角来看,数据预处理主要包括数据清洗、排序、缺失值或异常值处理、统计量分析、相关性分析和主成分分析(PCA)等。

因为先前本书采集的都是规整股票数据,因此本章要介绍的数据预处理就是预先剔除掉不符合条件的股票数据,然后对剩余股票进行优化筛选。本章主要使用的是 Pandas 库,读者应该着重理解筛选思路。

清洗掉 ST 股票

ST 股票通常表示对财务状况或其他状况出现异常的上市公司股票,对其交易要进行特别处理(Special Treatment)。由于“特别处理”,在简称前冠以 ST,因此这类股票称为 ST 股。

哪支股票的名称前加上 ST,就是给市场一个警示,该股票存在投资风险,起警告作用,但这种股票风险大,收益也大,如果加上*ST,就表示该股票有退市风险,要警惕的意思,具体就是在 2021年4 月左右,如果公司向证监会交的财务报表连续了年亏损,就有退市的风险。股票的交易规则也由报价日涨跌幅限制为涨幅 5%、跌幅 5%。

我们要回避这类“地雷股”(ST 股票),因而可以使用如下代码来清洗掉 ST 股票。

import tushareastscsv_data=ts.get_today_all()csv_data[~csv_data.name.str.contains('ST')]

登录后复制

我们对 csv_data 的 name 列进行操作,筛选出包含 ST 字母的行,并对整个 DataFrame 取反,进而筛选出不含 ST 股票的行。经过观察,我们发现在运行结果中没有 ST 股票,实现了数据的初步清洗。

清洗掉没成交量的股票

首先要明确定义,什么是没有成交量的股票。没有成交量不是成交量为零,而是一支股票单位时间的成交量不活跃。成交量是反映股市上人气聚散的一面镜子。人气旺盛、 买卖踊跃,成交量自然放大:相反人气低迷、买卖不活跃,成交量必定萎缩。成交量是观察庄家大户动态的有效途径。

下面开始清洗没成交量的股票,在原来的基础上增加代码如下:

import tushareastscsv_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 万手是过滤掉不活跃、没成交量的股票,主要以小盘股居多。

其运行结果为:

Python量化交易实战:获取股票数据并做分析处理

Index 出现了调行现象,即为去掉成交量小手 15 万手的股票。

清洗掉成交额过小的股票

成交额是成交价格与成交数量的乘积,它是指当天已成交股票的金额总数。成交最的至少取决于市场的投资热情。我们每天看大盘,一个重要的指标就是大 A 股成交量是否超过一万亿元,超过即为成交活跃。

筛选成交额超过 1 亿元的股票,代码如下:

import tushareastscsv_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%~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]#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 tsdef 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

登录后复制

经过一系列的数据清洗与筛选,选择出符合要求的股票数据并保存到 Jupter Notebook 中。我们将上述代码进行函数化处理,并命名为 get_data.py。

以后,只要运行如下代码,就会将得到的 csv_data 显示出来:

import get_dataget_data.today_data()

登录后复制

Python量化交易实战:获取股票数据并做分析处理

模块化后,将去掉大量重复代码,重加专注一个功能,也会增强代码的可读性。

本文摘编自《Python量化交易实战》,经出版方授权发布。(ISBN:9787522602820)

以上就是Python量化交易实战:获取股票数据并做分析处理的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2240392.html

(0)
上一篇 2025年2月26日 20:17:38
下一篇 2025年2月26日 20:18:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 通过 PHP 实现自动爬虫爬取,以及分析抓取的数据

    近年来,随着互联网的发展,数据爬取成为许多企业和个人所关注和需要的问题。数据爬取是通过编程技术从互联网上自动抓取数据进行分析,以达到自身的目的。其中,php 是一种非常常用且具有优势的编程语言,下面我们将讨论如何通过 php 实现自动爬虫爬…

    编程技术 2025年3月30日
    100
  • Java的 爬虫应用教程,实战数据抓取与分析

    java的爬虫应用教程,实战数据抓取与分析 随着互联网时代的到来,数据成为了企业和个人获取成功的一条必经之路,所以数据的重要性也越来越高。而爬虫技术作为数据获取的利器,在各行各业都得到了广泛的应用。本文将介绍如何使用Java语言编写爬虫,实…

    编程技术 2025年3月30日
    100
  • python正则表达教程2024

    正则表达式是一种在文本中匹配模式的代码,使用元字符和量词定义匹配模式。Python 中使用 re 模块处理正则表达式:1. 导入 re 模块;2. 定义正则表达式模式;3. 调用 re.search() 查找匹配项。正则表达式语法包括元字符…

    2025年3月30日
    100
  • java中字符串怎么转数组

    在 Java 中,将字符串转换为数组的方法有:使用 split() 方法根据模式分隔字符串;使用 toCharArray() 方法获取单个字符的字符数组;使用 replaceAll() 和 StringJoiner 替换空格并连接非空格字符…

    2025年3月30日
    100
  • java怎么由字符串构造数组

    在 Java 中,可以通过以下六种方法将字符串构造为数组:使用 String.split() 方法拆分字符串使用正则表达式拆分字符串使用字符数组和 Arrays.copyOfRange() 方法使用流将字符串拆分为字符流使用 Apache …

    2025年3月30日
    100
  • java怎么将字符串给数组

    Java中将字符串转换为数组的方法有5种:使用toCharArray()方法、正则表达式、split()方法、Arrays.copyOf()方法和Stream API。具体选择取决于具体需求,不同方法有各自的优点和缺点。 如何在 Java …

    2025年3月30日
    100
  • notepad++版本介绍

    Notepad++ 是一款开源文本编辑器,自 2003 年起不断更新。目前最新版本是 10.0.0,具有语法高亮、多视图编辑、宏录制、正则表达式搜索、Markdown 预览、语法检查和代码重构等广泛功能。 Notepad++ 版本介绍 No…

    2025年3月30日
    100
  • notepad++的作用是什么

    Notepad++ 是一款免费的文本编辑器,主要用于编程、网页开发和数据分析等文本处理任务。其作用包括:语法高亮,识别不同语言代码结构和错误;代码自动完成,提高编码效率和准确性;支持自定义宏和插件,满足特定需求;多文档界面,实现多任务处理;…

    2025年3月30日
    100
  • 使用正则表达式匹配合法的 IPv4 地址的操作方法

    使用正则表达式匹配合法 IPv4 地址的方法:使用正则表达式 ^(([0-9]|1-9|1[0-9]{2}|20-4|25[0-5]).){3}([0-9]|1-9|1[0-9]{2}|20-4|25[0-5])$,匹配四段数字,每段 0-…

    2025年3月30日
    100
  • vscode是干嘛的 vscode的作用

    VS Code:不仅是代码编辑器,更是编程伙伴VS Code 是一款功能强大的集成开发环境(IDE),提供丰富的扩展和工具,显著提升编码效率:高度可扩展性:拥有庞大的扩展市场,覆盖几乎所有编程语言、框架和工具。核心功能:强大的内置调试器,支…

    2025年3月30日
    100

发表回复

登录后才能评论