当前位置:   article > 正文

深入浅出Python量化交易实战--第4章-借助量化交易平台

深入浅出python量化交易实战

第4章-借助量化交易平台

现在,小瓦已经对算法交易的基本概念、简单的交易策略、最基 本的回测方法有了一定的了解,也尝试了使用机器学习技术来进行股 票涨跌的预测。虽然作为简单的实验,KNN算法的预测准确率还不是 很理想,但小瓦猜想,如果我们扩展样本的数据维度,模型的准确率 不就可以提高了吗?此外,我们只是随机挑选了一只股票来进行实 验,假如能够选出更多涨幅明显的股票来组成投资组合,收益率不也 可以大幅提高吗? 为了验证小瓦的猜想,我们就来寻找一些方法来展开实验。本章 的主要内容如下。

  1. 量化交易平台的基本使用方法。
  2. 利用量化交易平台获取股票的概况与财务数据。
  3. 利用财务指标进行简单选股。
  4. 利用量化交易平台获取股东数据。
  5. 利用量化交易平台查询资金流入/流出数据。

4.1 数据不够,平台来凑

既然要进行进一步的实验,我们就需要找到更多的数据(仅仅使用 tushare获取的数据不够),而让小瓦自己开发一个爬虫程 序去各大网站“爬”数据,学习成本又太高,还要花费大量的时间,那小 瓦还不如直接用别人已经整理好的数据呢。也就是说,小瓦可以借助现 有的量化交易平台来进行研究。

4.1.1 选择量化交易平台

现在有很多现成的量化交易平台,不但有大量已经整理好的数据, 并且可以让小瓦在平台上直接编写策略并进行回测。例如,Quantopian 的开源回测工具zipline可以说在业内是无人不知,无人不晓,但zipline 在本地的配置有点麻烦,而Quantopian平台上面的中国股市数据包还需 要单独付费。这样一来,小瓦就需要找一找国内的量化交易平台了。 国内的量化平台也有几个比较有名的,如聚宽(JoinQuant)、米筐 (RiceQuan)、BigQuant等。这几个平台对于小瓦目前的水平来说,都 是够用的。小瓦要做的无非是挑一个用着比较顺手、文档比较完善、有 成熟社区的平台即可。 结合上述几个方面的考虑,我们就让小瓦先从“聚宽”开始,等熟悉 之后,要转向其他平台,也是比较容易操作。

要使用“聚宽”平台,只需要浏览器打开网址 JoinQuant聚宽量化投研平台 即可。

注册一个新用户:过程十分简单,我们这里就不详细讲解了

4.1.2 量化交易平台的研究环境

注册完成之后,我们就和小瓦一起来熟悉平台的使用方法。“聚 宽”平台的功能还是比较多的,包括策略的编写、回测、研究等。我们 先从研究环境开始

4.1.3 在研究环境中运行代码

“聚宽”平台研究环境的用法与小瓦在本地安装的Jupyter Notebook一 样,而且一些常用的第三方库也已经安装好,还是非常方便的。下面我 们就和小瓦一起在研究环境中做一点练习,熟悉相关的函数的使用方 法。 例如,要获取某只股票在2023年1月1日至2023年3月13日之间的行情 数据,只要使用get_price函数即可,输入代码如下

  1. #导入需要的库
  2. import pandas as pd
  3. #获取股票002624.XSHE 202311日至2023313日之间的的日级交易数据
  4. df = get_price('002624.XSHE', start_date='2023-01-01', end_date='2023-03-13', frequency='daily')
  5. df

 

 

【结果分析】从输出中可以看到,我们在“聚宽”平台的研究环境 中运行代码的结果与在本地Jupyter Notebook中一模一样。使用get_price 函数,系统返回的结果同样是一个DataFrame格式的数据表,同样包括 open、close、high、low及volume这几个字段。 注意:与tushare不同,在“聚宽”的get_price函数中,传入的 股票代码是用.XSHG扩展名代表上海证券交易所股票,用.XSHE扩展 名代表深圳证券交易所股票。

4.2 借助财务数据筛选股票

现在,小瓦对平台研究的使用方法已经有了初步的了解。当然,平 台对于我们来说,最大的价值之一就是可以提供更多的数据——如果仅 仅是查询某只股票的开盘价、收盘价、成交量、成交额这些,那平台也 没有比tushare提供的数据多。不过“聚宽”量化交易平台能够提供的 看起来远远不止这些。该平台有一个数据字典,可以看到,“聚宽”平台提供的数据,除了股票的行情、财 务、基本面信息之外,还有宏观经济数据、各种因子数据、新闻事件数 据等,看起来还是非常全面的。接下来,我们就和小瓦一起看看如何来 使用这些数据。

4.2.1 获取股票的概况

设想一下,假如某天某人给我们推荐了一只证券的代码,我们首先 想到的自然是要了解一下这只证券的概况。例如,它是什么时候上市 的,是否已经退市;它是股票还是基金,如果是基金,是哪一种类型的 基金;等等。 利用平台获得这些数据十分容易,使用get_security_info函数就可以 做到。例如,我们想要了解002624这只股票的概况,只需要以下这几行 代码就可以了。

  1. df = get_security_info('002624.XSHE')
  2. print('股票名称:', df.display_name)
  3. print('股票简称:', df.name)
  4. print('股票上市时间:', df.start_date)
  5. print('产品类型:', df.type)

 

除了可以获取单个证券的基本信息之外,我们还可以使用 get_all_securities函数批量获得证券信息。实例代码如下:

  1. df = get_all_securities()
  2. print(df.head())
  3. df.tail()

 

4.2.2 获取股票的财务数据

在了解了股票的基本概况之后,可能很多读者朋友就会有和小瓦一 样的问题——我们该如何知道这只股票是否是优质股呢?这是一个非常 好的问题。如果我们要做价值型投资者,那么我们最重要的还是要看某 只股票的长期发展趋势;而能够保持良好表现的股票,其对应的企业必 然是财务状况良好、盈利能力不错、净资产和现金流状况都比较突出的 企业。获取这些数据也十分简单,使用平台的get_fundamentals函数就可 以了。

与get_security_info不同的是,使用get_fundamantals函数并不是直接 把股票的代码传递到参数中,而是要传入一个query object。query的原 理也比较容易理解:在数据库中有一个表格,其中包含若干字段,使用 query可以查询表格中的某个字段,并且可以设置筛选条件。例如,下 面我们对代码为002624的股票进行查询,输入代码如下:

  1. # 获取单只股票在某一日期的市值数据
  2. q = query(
  3. valuation
  4. ).filter(
  5. valuation.code == '002624.XSHE'
  6. )
  7. df = get_fundamentals(q, date='2023-03-13')
  8. df

 

 

【结果分析】从输出中可以看到,系统返回了代码为002624的股 票财务数据。除了股票代码、上市日期等基础信息之外,股票财务数据 还包括一系列的财务指标,如pe_ratio、turnover_ratio、pb_ratio、 ps_ratio、pcf_ratio、pe_ration_lyr等。

鉴于小瓦没有学习过财务方面的相关知识,我们在这里对各项财务 指标做一个简单的解释。如果读者朋友们对这些指标已经有了充分的了 解,则可以跳过这部分内容。

  • pe_ratio:动态市盈率,指的是这只股票的市价除以每股收益。 例如,某只股票的每股收益是1元,而某日的股价是10元,则这只股票的动态市盈率就是10。一般来说,市盈率越低的股票越值 得投资。
  • turnover_ratio:换手率,指的是这只股票在某个时间内交易的频 率。例如,某只股票一共发行了1亿股,而某天这只股票的成交 量是1000万股,则这一天,该股票的换手率是10%。换手率越 高,说明该股票的成交越活跃。
  • pb_ratio:市净率,指的是这只股票的价格与每股净资产的比 值。例如,某公司净资产1亿元,发行股票1亿股,也就是说每股 净资产为1元;而这只股票某日价格为5元,则该股票的市净率为 5。一般来说,市净率越低越好。
  • ps_ratio:市销率,指的是这只股票的价格与每股销售收入的比 值。例如,某公司的销售收入是2亿元,发行1亿股,每股销售收 入为2元;而某日这只股票的市价是8元,则市销率为4。一般来 说,市销率越低越好。
  • pcf_ratio:市现率,指的是这只股票的价格与每股现金流的比 值。例如,某公司从事经营活动产生的净现金流是5亿元,该公 司发行了1亿股,每股现金流为5元;某日这只股票的价格是10 元,则市现率是2。一般来说,市现率大于0的时候,数值越小越 好。 只股票的动态市盈率就是10。一般来说,市盈率越低的股票越值 得投资。
  • pe_ratio_lyr:静态市盈率,指的是这只股票的价格与最近公开的 每股收益的比值。它与动态市盈率的区别在于,动态市盈率是股 价除以预期的每股收益,而静态市盈率是股价除以已经实现的每 股收益。
  • capitalization、market_cap、circulating_cap、 circulating_market_cap分别指的是股票的总股本、流通股本、总 市值和流通市值。这几个概念都比较基础,我们这里就不一一解 释了。

4.2.3 通过财务指标进行选股

相信看到这里,读者朋友们会产生一个新的想法——既然财务指标 有助于解一家企业,那么我们是不是可以通过设定这些财务指标的条 件,把市场上比较优质的股票找出来呢?答案是肯定的。例如,我们要 找出市盈率小于20且大于0、市现率小于20且大于0(有时候现金流比利 润还重要)且在市场上成交比较活跃(换手率大于4%)的股票,就可 以使用query object进行筛选,并使用平台的get_fundamentals函数来找到 满足条件的股票。示例代码如下:

  1. q = query(
  2. valuation.code,
  3. #动态市盈率
  4. valuation.pe_ratio,
  5. #市现率
  6. valuation.pcf_ratio,
  7. #换手率
  8. valuation.turnover_ratio
  9. ).filter(
  10. valuation.pe_ratio > 0,
  11. valuation.pe_ratio < 20,
  12. valuation.pcf_ratio > 0,
  13. valuation.pcf_ratio < 20,
  14. valuation.turnover_ratio > 4
  15. ).order_by(
  16. #按换手率降序排序
  17. valuation.turnover_ratio.desc()
  18. )
  19. df = get_fundamentals(q, date='2022-10-25')
  20. df

 

 

4.3 谁是幕后“大佬”

我们既然找到了市盈率和市现率都比较低,而且成交也比较活跃的 股票,是不是直接全仓杀入就可以了呢?一向谨慎的小瓦这时有了一个 新的问题——是不是所有上市公司的财务报表都能够反映其真实财务状 况呢?要知道,某些企业也有被曝出财务造假丑闻的呀!更何况,有的 公司会“合理地”调整财务报表,使其更加“好看”。那这样一来,这些指 标不就靠不住了吗?

此外,虽然换手率确实是体现交易活跃程度的指标,但是成交活跃 也不代表股价一定会涨呀!万一是大股东在减持套利,或者是主力在出 货,那么股价不是反而会跌嘛!

小瓦的担心确实很有道理。在真金白银买入之前,我们还是有必要 了解一下更多信息的,如大股东是谁、大股东近期增减持的状况,以及 主力的资金流向等。

4.3.1 找到最大的股东

在4.2节中,我们选出了8只财务指标看起来不错的股票。尤其是 002432.XSHE这一支,索性我 们就以这一只股票为例来查询一下它的十大股东都有谁。 在平台上,十大股东的数据是存储在名为 STK_SHAREHOLDER_TOP10这张表中,使用query object就可以进行查 询。示例代码如下:

  1. from jqdata import finance
  2. q = query(finance.STK_SHAREHOLDER_TOP10.code,
  3. finance.STK_SHAREHOLDER_TOP10.shareholder_rank,
  4. finance.STK_SHAREHOLDER_TOP10.shareholder_name,
  5. finance.STK_SHAREHOLDER_TOP10.shareholder_class,
  6. finance.STK_SHAREHOLDER_TOP10.share_ratio
  7. ).filter(
  8. finance.STK_SHAREHOLDER_TOP10.code=='002432.XSHE',
  9. finance.STK_SHAREHOLDER_TOP10.pub_date >'2022-10-01'
  10. )
  11. shareholders = finance.run_query(q)
  12. shareholders

 

4.3.2 大股东们增持了还是减持了

现在我们“揪”出了该股票的大股东们,接下来就要研究一下他们的 行为了。如果大股东对公司未来发展有信心,一般会增持公司的股票, 以便在未来获得更高的收益;相反,如果大股东认为短期股价已经见 顶,则可能会减持一些股票,将已经获利的部分进行套现。也就是说, 如果大股东增持了股票,则股价有可能上涨,反之股份有可能下降。当 然,这也不是绝对的——有时候大股东的判断也可能出现失误。 不管怎样,我们还是需要了解一下大股东们的动作,以供参考。为 了达到这个目的,可以使用query object来查询 STK_SHAREHOLDERS_SHARE_CHANGE这张表。示例代码如下:

  1. q = query(finance.STK_SHAREHOLDERS_SHARE_CHANGE.code,
  2. finance.STK_SHAREHOLDERS_SHARE_CHANGE.pub_date,
  3. finance.STK_SHAREHOLDERS_SHARE_CHANGE.shareholder_name,
  4. finance.STK_SHAREHOLDERS_SHARE_CHANGE.type,
  5. finance.STK_SHAREHOLDERS_SHARE_CHANGE.change_number,
  6. finance.STK_SHAREHOLDERS_SHARE_CHANGE.change_ratio,
  7. finance.STK_SHAREHOLDERS_SHARE_CHANGE.after_change_ratio,
  8. ).filter(
  9. finance.STK_SHAREHOLDERS_SHARE_CHANGE.code=='002624.XSHE',
  10. finance.STK_SHAREHOLDERS_SHARE_CHANGE.pub_date >'2020-01-01'
  11. )
  12. shrchg = finance.run_query(q)
  13. shrchg

 

4.3.3 资金净流入还是净流出

现在我们知道了大股东的增减持情况,但小瓦也发现,其实大股东 增减持数据的公布,最后一次也是在2020年的2月22日,那这个数据的 时效性是不是就有点低了呢?不要紧,我们还可以获得实效性更高的数 据——资金流向数据,以便看到主力的实时动向。 要做到这一点,我们只需要调用平台的get_money_flow函数即可, 并指定查询的股票代码、日期和要查看的字段。示例代码如下:

  1. from jqdata import *
  2. df = get_money_flow('002624.XSHE',
  3. fields=[
  4. 'date',
  5. # 股票代码
  6. 'sec_code',
  7. # 涨跌幅(%)
  8. 'change_pct',
  9. # 主力净额(万)
  10. 'net_amount_main',
  11. # 主力净占比(%)
  12. 'net_pct_main'],
  13. start_date='2023-01-01',
  14. end_date='2023-03-13')
  15. print(df.head(6))
  16. print(df.tail(12))

 

 

注意:在本章中,我们演示了如何使用一些函数来查询平台上的 相关数据。在查询某些表时,笔者只选择了其中一些字段。读者朋友 如果希望查询不同字段,则可以参考平台的数据字典,了解查询的具 体方法。

4.4 小结

在本章,我们主要帮助小瓦解决一个问题——获得更多的数据。为 了降低她的学习成本,本章使用了现有的量化交易平台的数据,并且帮 助小瓦简单熟悉了一下平台相关函数的使用方法。在这个过程中,小瓦 学会了如何获取股票的概况和财务指标数据,也初步了解了如何利用基 本的财务指标进行简单的选股,而且能够查询股东信息和股东的增减持 情况,以及某个时期内股票的资金流入/流出情况。借着对上述数据的 研究,本章也引出了因子分析的基本思路。在后面的章节,我们会和小 瓦一起研究因子分析的方法,也欢迎各位读者朋友来一起继续量化交易 的探索。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/129647
推荐阅读
相关标签
  

闽ICP备14008679号