什么是选股?
选股(stock selection)是一种主动性投资策略,先按照某种规则或算法分析单只股票的前景,然后构建一个投资组合,长期持有。一般情况下要求组合的股票具有低相关性,这样才能对冲系统性风险,否则在大盘走弱的时候投资组合也会面临巨大的下跌风险。
运用什么模型?
关于如何选股,学术界提出过很多不同的模型,最经典的莫过于马科维茨投资组合理论。这里我们使用MM趋势模型(Mark Minervini’s Trend Template),这是国外一位传奇投资大师提出的技术面选股方法,核心思想是通过技术指标来度量股票动能,从中筛选最有潜力的股票,买入并持有。
MM趋势模型
- 股票价格高于150天均线和200天均线
- 150日均线高于200日均线
- 200日均线上升至少1个月
- 50日均线高于150日均线和200日均线
- 股票价格高于50日均线
- 股票价格比52周低点高30%
- 股票价格在52周高点的25%以内
- 相对强弱指数(RS)大于等于70,这里的相对强弱指的是股票与大盘对比,RS = 股票1年收益率 / 基准指数1年收益率
关于Mark Minervini
全美最富盛名的交易员之一,曾经获得30000%的收益率,在34岁前称为亿万富翁,详情见<金融怪杰>一书。
选股面临的技术性难题?
- 从哪里获取大量股票的历史数据?
- 当股票数量很多时,如何提高计算性能?
本文将用Python实现MM模型的量化选股,并解决上述提出的两个技术难题。
import
1. 从蜂鸟数据获取历史数据
蜂鸟数据是新兴的金融数据提供商,提供包括股票,外汇,商品期货和数字货币的实时报价和历史数据,并提供API接口,是所有金融从业者获取免费数据的便捷渠道。
## 撰写自定义函数,通过API获取数据
1.1 产品列表
先获取沪深A股上市企业的所有股票ID。
apikey
成功获取沪深A股3789只股票的产品信息,前缀'SH'代表上海证券交易所股票,'SZ'代表在深圳证券交易所的股票。建模时仅使用上证交易所的股票。
# 筛选前缀为'SH'的股票
1.2 个股历史数据
从蜂鸟数据获取上海证券交易所股票的日图历史价格。根据MM趋势模型,我们最少需要过去260天的历史数据,部分新上市或已退市的股票可能不符合要求,所以剔除K线数量少于260的股票。
%%
下载1500多只股票的历史数据(约400多个交易日)只需要不到1分钟的时间。接下来我们整合和清洗数据,然后存储在本地,方便后续分析。
ohlc_joined
查看是否存在缺失值。
ohlc_joined
保存到本地,以csv格式存储。后面可以直接从本地读取数据,避免API请求带来的时间浪费。
ohlc_joined
1.3 上证指数
获取上证指数的历史价格,计算过去1年的累计收益率,用于计算个股的相对强弱。
benchmark
# 计算1年累计收益率,1年以252个交易日计算
2. 选股
def
2.1 同步
首先我们用同步的方法进行筛选,将相同的筛选函数应用于1400只股票。
# 仅仅筛选有足够历史数据的股票
%%
同步计算大约需要3秒的时间,在研究阶段是可以接受的,但生产阶段不行。试想您把选股系统做成一个产品,用户选定条件后点击筛选,要等待至少3秒的时间才能得到结果,将导致非常糟糕的用户体验,接下来我们尝试用多进程来解决这个问题。
我们先看看满足条件的股票有哪些?
results
有389个股票符合条件,从量化交易的角度来看,似乎并没有成功挑选出有潜力的股票,当然这与参数的选择有关系。
模型是否有效并不是本文要探讨的主题(我们会在其它文章中进行探索),所以先不要过度关注这点。
2.2 多进程
接下来尝试用多进程来加速选股的过程,看是否能把筛选时间降到1秒以内。多进程计算的核心思想是分而治之,将相似的计算任务分发到不同的CPU,最后汇总结果。这里用multiprocessing实现多进程。
%%
利用四条进程,我们成功把计算时间缩短到1秒左右,并且获得完全相同的结果。
results
接下来测试一下进程数量和计算时间的关系,决定最优的进程数量。
max_processors
从上图可以看出,使用两个进程时计算时间削减了一半(跟预期相符)。随着进程数逼近最大进程数,计算时间的递减不断下降,这并不难理解,因为计算机同时在处理其它任务,所以即便设置processors=12,也不可能把全部进程全部利用起来。从目前的情况来看,用4条进程处理是合适的,能够把时间从3.5秒降低至约1秒左右。
3. 总结
本文介绍了如何使用Python进行量化选股,包括:
- 从蜂鸟数据获取沪深A股的历史数据。
- 自定义函数实现MM模型的选股逻辑。
- 多进程计算,大幅减少筛选的时间。
接下来的研究方向是回溯检验,根据MM模型构建投资组合,优化筛选参数,看是否能带来超额收益。
如果喜欢我们的文章,记得点赞和收藏哦,我们会持续为大家带来数据科学和量化交易领域的精品文章。
【关于我们】
蜂鸟数据:开源金融数据库,聚合主流金融市场10000+时间序列,为广大金融从业者提供高质量的免费数据。我们的优势:1. 同时提供股票,外汇,商品期货的实时报价和历史数据;2. 提供高度统一的API接口,您可以把数据整合到自己的程序中,查看我们的API文档。
这是属于大数据的时代,蜂鸟数据的使命:用数据创造财富。