深入浅出Python量化交易实战--第4章-借助量化交易平台
第4章-借助量化交易平台
目前的小瓦已经掌握了算法交易的核心理论知识以及基础操作技能,并且熟悉了基本的数据分析方法。他还在不断探索中运用机器学习技术来分析股票市场走势。尽管作为一个初步实验阶段,KNN算法的表现尚可,但小瓦认为通过扩展样本数据维度可能会提高模型准确率。此外,仅仅依靠一只股票的投资可能无法充分展现市场潜力,因此我们计划选取表现更为活跃的标的股构建投资组合,这样能够进一步提升投资收益的可能性。为了验证这一猜想,我们准备设计一系列实证研究来测试不同数据处理方式的效果。本章的主要内容包括以下几个方面。
- 量化交易平台的基础操作流程包括哪些内容?
- 该平台的主要功能之一是提供详尽的市场信息查询服务,在实际应用中可将其主要应用于哪些方面?
- 通过分析企业的核心经营指标等财务数据特征来进行初步筛选判断。
- 该平台能够提供企业股东信息查询服务的具体内容有哪些?
- 在资金流动分析方面,请详细说明如何通过该平台查询资金流入/流出的具体情况。
4.1 数据不够,平台来凑
为了进行更深入的研究,并解决现有问题的解决方案探索工作,请确保能够获得足够的数据样本(仅仅依赖tushare平台的数据可能无法满足需求)。因此,在考虑自行开发一个爬虫程序以从多个网站抓取数据时,请权衡其学习成本及时间投入的可行性。相比之下,并非最佳选择而是利用现有的量化交易平台提供的现成数据会更加高效和实用。也就是说,在现有条件下寻求现成的数据资源将是更为合理的策略。
4.1.1 选择量化交易平台
目前市面上存在众多现成的量化交易平台系统,并非全都完美契合需求。这些平台不仅提供了大量经过整理的数据资源,并且还支持用户直接编写策略并进行历史数据回测。开源回测引擎zipline因其卓越的性能和广泛的知名度而闻名行业;然而该平台仅提供免费账户的基本功能,并且仅支持部分基础数据。为了满足更多个性化需求,在本地配置相对较为复杂的情况下建议转投其他解决方案。国内市场上也有一些知名量化交易平台可供选择;其中聚宽(JoinQuant)以其完善的功能体系和良好的用户体验著称;米筐(RiceQuan)则以其强大的算法能力吸引更多关注;而BigQuant凭借其独特的社区机制脱颖而出。综合考虑技术实力、功能模块以及社区支持等因素后;聚宽(JoinQuant)无疑是最具性价比的选择;建议新用户从这里入手逐步熟悉各类工具和系统运作模式;待掌握基本操作后再逐步转向其他更适合的专业平台
通过访问该在线工具https://www.joinquant.com/——"聚宽"——即可完成操作
注册一个新用户:过程十分简单,我们这里就不详细讲解了
4.1.2 量化交易平台的研究环境
注
4.1.3 在研究环境中运行代码
"聚宽"平台上的研究环境操作方式与小瓦本地部署的Jupyter Notebook基本一致,并且其中一些常用的第三方库已经预先配置好状态,则使得使用起来极为便捷。随后我们不妨一起在研究环境中开展一些实践操作,以便熟悉相关函数的具体应用方法。例如,若需获取某只股票在2023年1月1日至2023年3月13日期间的历史行情数据,我们只需调用get_price函数即可完成任务,具体实现步骤如下所示
#导入需要的库
import pandas as pd
#获取股票002624.XSHE 2023年1月1日至2023年3月13日之间的的日级交易数据
df = get_price('002624.XSHE', start_date='2023-01-01', end_date='2023-03-13', frequency='daily')
df

结果分析
结果分析
4.2 借助财务数据筛选股票
目前小瓦对平台研究的方法已形成基本认知。值得注意的是,在线交易系统的核心价值之一就在于提供大量基础数据——仅就获取某只股票的基本信息而言(如开盘价、收盘价等基础数据),其提供的信息量与tushare平台相当;但"聚宽"量化交易平台的优势在于其远超于此的功能模块——其中不仅限于基础数据查询服务(宏观经济指标、因子分析数据、新闻事件数据分析),更重要的是其丰富而全面的数据资源体系能够满足多维度分析需求。
让我们深入探讨如何有效利用这些丰富的资源。
4.2.1 获取股票的概况
假设某人在某个 day向我们推荐了一只股票代码,请问他会如何向我们介绍这个代码所对应的股票信息呢?自然会首先了解这只股票的基本情况——包括上市时间、是否已退市等基本信息;此外还需要明确该股票属于何种类别——如果是基金,则需进一步确认是哪类基金;如果是普通股票,则需关注其具体型号等关键指标。通过平台获取这些信息相对简便,在实际操作中我们可以轻松调用get_security_info函数即可实现这一目标——例如,在实际操作中我们可以选择查看002624号股票的信息。
df = get_security_info('002624.XSHE')
print('股票名称:', df.display_name)
print('股票简称:', df.name)
print('股票上市时间:', df.start_date)
print('产品类型:', df.type)

除了能够获取单个证券的基本信息外, 另一种方法是调用get_all_securities函数来批量获取所有证券的信息. 实例代码如下:
df = get_all_securities()
print(df.head())
df.tail()

4.2.2 获取股票的财务数据
在掌握了股票的基本情况后,
可能会有许多读者会像小瓦一样疑问:
如何判断这只股票是否为优质股?
这确实是一个值得探讨的问题。
若要做价值型投资者,
我们最关注的是某只股票的长期发展趋势;
具备良好财务状况、高盈利能力以及稳健现金流的企业更容易获得成功。
获取这些数据相对容易,
使用平台提供的get_fundamentals函数即可完成任务。
与函数get_security_info不同之处在于,并非直接将股票代码传递给参数位置上
# 获取单只股票在某一日期的市值数据
q = query(
valuation
).filter(
valuation.code == '002624.XSHE'
)
df = get_fundamentals(q, date='2023-03-13')
df

结果分析
考虑到小瓦尚未接受财务知识的基本培训,我们特意为此做了一个简明扼要的介绍。如读者对这些财务指标已有较为深入的了解,则可略过本部分内容。
- pe_ratio:即为动态市盈率。它代表了该股票价格与其每股收益之间的比率。举例说明,在某个交易日中某只股票每股市益仅为1元,则其当日股价达到10元时其动态市盈率为10倍通常而言投资者倾向于选择那些市盈率较低 stocks作为潜在的投资目标
turnover_ratio:换手率是指一只股票在特定时间段内的交易频率。具体而言,
该股票共发行了1亿股数量,在某一天其成交量为1000万股,则当天该
股票的换手率为10%。换手率越高表明该股票的流动性越强。
pb_ratio代表市净率,在衡量这只股票相对于其股东权益的价值时被广泛应用。具体来说,在计算中会用到该指标来衡量一只公司的价值大小。例如,在计算时假设某公司的净资产总额为pb_value万元,则通过这一数值可以得出其每股市价的具体数值。通常情况下,在投资分析中我们关注的是较低的市净比率值。
- ps_ratio:该比率被称为ps_ratio(市销率),即这只股票的价格与其每股销售收入之比。
例如,在某公司中可以看到其年收入总计2亿元人民币,并发行了1亿股普通股。
其中每股市盈率为2元人民币/股;
而当某日该股票交易价格定为8元人民币/股时,
则其ps_ratio=4。
通常情况下而言,
市销率越低越好。
pcf_ratio:现值比(Price-to-Cash Flow Ratio),用于衡量企业市场价格与其持续 operations 产生的现金流量之间的关系。例如,在某一时期内某企业经营活动产生的净现金流为5亿元人民币(RMB),该公司发行了1亿股普通股(Ordinary Shares),因此每股普通股的现金流量为5元人民币;假设某日该股票的市场价格为10元人民币,则其现值比即为2倍(2.0)。一般而言,在pcf_ratio大于零的情况下(pfrratio > 0),数值越小表示该股票潜在价值越高。另一相关指标是dynamic PEG ratio(动态市盈率),其计算结果通常显示为10.在这种情况下,默认情况下市盈率越低则表明该股票具有更好的投资吸引力。
- pe_ratio_lyr:静市率(PE Ratio),代表某只股票的价格与其最近公布每股收益之比率。其与动市率的主要区别在于:动市率为当前股价与其未来预期每股收益之比率;而静市率为当前股价与其已经实现的每股市盈率之比率。
资本化率(CAPITALIZATION)、市场值(MARKET_CAP)、流通股本(CIRCULATING_CAP)、流通市值(CIRCULATING_MARKET_CAP)分别代表股票的总规模、流通规模以及对应的市值指标。这些指标较为基础,在此无需过多赘述。
4.2.3 通过财务指标进行选股
或许会引发读者的新思考:既然财务指标有助于认识一家企业,那么是否可以通过设定一套符合条件的财务指标来筛选出优质股票呢?答案是肯定的。例如,在投资决策中我们通常会关注市盈率在0至20之间以及市现率在0至20之间(有时现金流比例也具有参考价值),并且要求股票在市场上交易活跃度超过4%才能作为候选对象。在此基础上我们可以利用平台提供的get_fundamentals函数来进行筛选,并通过相应的查询功能获取满足条件的具体股票列表。以下是一个操作示例:
q = query(
valuation.code,
#动态市盈率
valuation.pe_ratio,
#市现率
valuation.pcf_ratio,
#换手率
valuation.turnover_ratio
).filter(
valuation.pe_ratio > 0,
valuation.pe_ratio < 20,
valuation.pcf_ratio > 0,
valuation.pcf_ratio < 20,
valuation.turnover_ratio > 4
).order_by(
#按换手率降序排序
valuation.turnover_ratio.desc()
)
df = get_fundamentals(q, date='2022-10-25')
df

4.3 谁是幕后“大佬”
我们筛选出一套适合投资的股票组合:这些股票具有较低的市盈率和市现率,并且成交较为活跃。是否应该一次性投资全部资金购买这些股票? 一向谨慎的投资人士小瓦开始产生了新的疑虑:是否所有上市公司的财务报表都能真实反映其实际运营状况? 他深知某些企业甚至被曝出了严重的财务造假行为:有些公司会'合理地'调整数据使其看起来更加完美。这样一来我们得出的结论是:这些指标确实不可信
改写说明
小瓦的担忧确实值得考虑。在进行真金白银投资之前,我们有必要掌握相关信息,并包括但不限于:大股东的身份、近期的操作动向、主力的资金流向等。
4.3.1 找到最大的股东
本节讨论了若干只财务指标表现出色的股票。
值得注意的是,在分析过程中特别选择了XSHE股票作为研究对象。
在平台上(或系统上),该数据存储于表STK_SHAREHOLDER_TOP10中。
示例代码如下:
from jqdata import finance
q = query(finance.STK_SHAREHOLDER_TOP10.code,
finance.STK_SHAREHOLDER_TOP10.shareholder_rank,
finance.STK_SHAREHOLDER_TOP10.shareholder_name,
finance.STK_SHAREHOLDER_TOP10.shareholder_class,
finance.STK_SHAREHOLDER_TOP10.share_ratio
).filter(
finance.STK_SHAREHOLDER_TOP10.code=='002432.XSHE',
finance.STK_SHAREHOLDER_TOP10.pub_date >'2022-10-01'
)
shareholders = finance.run_query(q)
shareholders

4.3.2 大股东们增持了还是减持了
我们现在成功提取到了该股票的大股东信息。接下来的研究重点将集中在这些公司的行为动向上。具体而言,在分析过程中我们需要重点关注这些公司的决策方向和潜在影响因素。根据以往经验,在分析过程中我们发现:如果他们对公司未来发展充满信心,则通常会增持公司股份;相反的情况则是:如果他们认为短期内股价已经达到峰值,则可能会选择抛售部分股份;即这些公司的大股东可能会选择抛售部分股份;进而可能导致股价上涨的可能性增大;反之亦然:如果他们减持,则可能导致总股本减少的可能性增大;然而需要注意的是:这种趋势并不是绝对的——有时候他们的判断可能出现偏差;无论如何,在分析过程中了解这些公司的行为仍是非常重要的参考依据;为了达到这一目的,请参考以下查询方法:使用query object来查询STK_SHAREHOLDERS_SHARE_CHANGE这张表,并查看相应的数据字段
q = query(finance.STK_SHAREHOLDERS_SHARE_CHANGE.code,
finance.STK_SHAREHOLDERS_SHARE_CHANGE.pub_date,
finance.STK_SHAREHOLDERS_SHARE_CHANGE.shareholder_name,
finance.STK_SHAREHOLDERS_SHARE_CHANGE.type,
finance.STK_SHAREHOLDERS_SHARE_CHANGE.change_number,
finance.STK_SHAREHOLDERS_SHARE_CHANGE.change_ratio,
finance.STK_SHAREHOLDERS_SHARE_CHANGE.after_change_ratio,
).filter(
finance.STK_SHAREHOLDERS_SHARE_CHANGE.code=='002624.XSHE',
finance.STK_SHAREHOLDERS_SHARE_CHANGE.pub_date >'2020-01-01'
)
shrchg = finance.run_query(q)
shrchg

4.3.3 资金净流入还是净流出
目前掌握的大股东增减持股情况信息显示,在过去一段时间内已有多次变动记录。然而我也注意到一个细节:该官方公布的增减持数据其实在两年半前就已经最后一次更新了(即在二零二一年二月二十二日)。因此这一时效性是否略显不足?为了获取时效性更强的数据信息,则转向关注资金流向数据。要做到这一点只需调用平台提供的get_money_flow函数即可,并指定查询所需的股票代码、日期以及所需查看的具体字段。例如,在此平台上可编写如下代码:
from jqdata import *
df = get_money_flow('002624.XSHE',
fields=[
'date',
# 股票代码
'sec_code',
# 涨跌幅(%)
'change_pct',
# 主力净额(万)
'net_amount_main',
# 主力净占比(%)
'net_pct_main'],
start_date='2023-01-01',
end_date='2023-03-13')
print(df.head(6))
print(df.tail(12))

在此章节中
4.4 小结
在本章中, 我们的主要目的是协助小瓦解决一个关键问题: 获取更多的学习资料. 本章旨在降低其学习成本, 因此我们采用了现有量化交易平台的数据, 并引导小瓦熟悉平台的基本功能. 在这一过程中, 小瓦掌握了如何收集股票概况及财务指标数据的方法, 并熟悉了利用基本财务指标进行简单选股的技术. 此外, 她还学会如何查询股东信息及其增减持动向, 以及掌握某一时间段内资金流动情况的查询方法. 通过研究这些数据, 我们引出了因子分析的基本思路. 在后续章节中, 我们将与小瓦一起深入探讨因子分析的具体方法, 并欢迎各位读者朋友共同参与量化交易的研究探索.
