声明:这个 AFML 系列终于开始硬核将机器学习和量化投资结合在一起了,而且 Python 系列也派上用场了。
本系列不会写超级长文,一是内容较难不好消化,而是我现在也接了些量化投资、机器学习、Python 类的广告,太长时间发一篇容易掉粉
。
本系列在后期会和【量化投资与机器学习】合作,因为一个人写确实困难。这篇的基本面数据部分内容也是受 【量化投资与机器学习】老铁的笔记启发的。
本系列用的所有数据来自万矿和 Quantopian,一些高频交易的数据在用到时会注明。
这一系列能写完我会觉得很有成就感,需要你们激励着我!
LET'S GO!!!
1
介绍
数据越原始其含有的价值越高。被处理过的数据虽然用起来很方便,但当你使用时别人很可能已经使用过了。这句话也适用于金融数据 (financial data)。金融数据主要可分为四类,见下表总结。
接下来我们详细讨论它们的特征以及应用。
2
基本面数据
基本面数据 (Fundamental Data) 通常是会计数据 (accounting data),包括资产 (assets)、负债 (liabilities)、销量 (sales) 和盈利 (earnings) 等等,来源于按季度发布的财务报告。
下图展示了苹果第二季度的财务报表中的部分基本面数据(销量、销售成本、运营费用等等)。
在使用基本面数据时需注意数据发布日期 (release date) 和季度报告截止日期 (quarter-end reporting period) 不一样!前者一般晚于后者 6 周,有时个股的发布日期各不相同。
以茅台 (600519.SH) 举例来看一段万矿 (WindQuant) 的代码:
_, date = w.wsd( "600519.SH",
"stm_issuingdate",
"2018-01-01", "2019-03-31",
"Period=Q;Days=Alldays;Fill=Previous",
usedf=True )
WTable(data = date).plot()
这里 stm_issuingdate 代表「定期报告披露日期」。关于代码里的 wsd 的相关知识,请参考〖Pandas 上〗一贴。
对茅台 2018 年第一季度 (Q2) 来说,发布日期 (2018-08-02) 才是最重要的日期,因为只有发布之后大家才知道基本面数据值 (比如每股收益 EPS),用报告截止日期 (2018-06-30) 就会引进前视偏差 (look-ahead bias),因此在 2018-06-30 那天数据没有发布给大众,大众根本不知道 Q2 的 EPS 是多少。
万矿是取每个季度最后一天作为报告期,2018 年的报告期设置分别为
下图展示了茅台 2018 年到 2019 年 Q1 的数据发布日期和报告截止日期。
用万矿来查看茅台 2018-06-30 的 EPS 值。
_, df = w.wsd( "600519.SH",
"eps_basic_is",
"2018-01-01", "2019-03-31",
"Days=Alldays;rptType=1",
usedf=True )
WTable(data = df).plot()
这里 eps_basic_is 代表「基本每股收益」。
我们可以看到 2018-06-30 对应 eps_basic_is 的值为 12.55。由上面日期对比图可知,这个 12.55 的 EPS 应该在 2019-08-02 才发布。因此推断出 2018-06-30 这天的12.55 是从 2019-08-02 那天回填 (backfill) 得到的。
知识点
公司披露年报或季报经常会在第一次披露之后发布多个修订版本,对原本缺失的一些数据进行回填。
继续深挖验证我们的推断。用万矿来查看 2018-08-02 (Q2 数据的发布日) 的 EPS 值。这时 wsd 函数中用参数 fa_eps_basic 而不是用 eps_basic_is,fa_eps_basic 代表「基本每股收益_PIT」。用万矿里的 API 选出 fa_eps_basic 即可,操作非常简单如下屏所示。
上图操作完成之后,查看茅台 2018-06-30 的 EPS_PIT 值 (用的 fa_eps_basic) 的代码自动生成出来。
_, df = w.wsd( "600519.SH",
"fa_eps_basic",
"2018-01-01", "2019-03-31",
"Days=Alldays;rptType=1",
usedf=True )
WTable(data = df).plot()
PIT 全称是 point-in-time,没有找到很好的中文翻译,就理解成「数据发布的时点」吧。
从下图发现 2018-08-02 的 EPS 值为 12.55,可以确定 2018-06-30 的 EPS 值是回填得来的。
此外,我们还发现 12.55 对应的起始日 2018-08-02 和终止日 2018-10-28,它们不正是 Q2 的发布日期和 Q3 的发布日期前一天吗?下图就是2018 Q2 到 Q3 的 PIT 数据。
由于 12.55 是 Q2 截止日 2018-06-30 时 EPS 的值,但是在 Q2 发布日 2018-08-02 才公布于众,直到 2018-10-28。后一天 2018-10-29 是Q3截止日 2018-09-30 时 EPS 的发布日,那么 EPS 也会被更新。
下图给出了一年的 PIT 数据。
使用 PIT 数据可以避免「前视偏差」,自己收集 PIT 的数据太过繁琐,而购买提供 PIT 的数据商又太过昂贵。万矿做得真心不错,免费提供 PIT 数据。
国内有万矿,国外有 Quantopian,下面截屏蓝色高亮那部分说的就是 Quantopian 也考虑了 PIT 而消除了「前视偏差」。
在 Quantopian 用代码看看 Facebook 的基本面数据发布日期 (file_date) 和报告截止日期 (period_ending_date)。关于代码里的 Pipeline 相关知识,请参考〖张量 101〗一贴。
DataFrame 的前五行是 2018 年 1 月 2 日到 8 日的数据要看 2017-09-30 (Q3) 的数据,而其发布日是 2017-11-02。
DataFrame 的后五行意思是 2018 年 12 月 24 日到 31 日的数据要看 2018-09-30 (Q3) 的数据,而其发布日是 2018-10-31。
总结:基本面数据频率低,监管严,易获得,价值可被挖掘的差不多,通常是把基本面数据和其它类数据一起使用。
3
市场数据
市场数据 (Market Data) 包含交易所有类型产品时收集到的数据,包括现货价格 (spot price)、期货价格 (futures price)、利率 (interest rate)、汇率 (exchange rate)、波动率 (volatility)、成交量 (volume) 等等。
在交易中,市场数据以限价定单簿 (limitorder book, LOB) 的形式呈现。每个市场参与者都可从中看到订单信息 (order information)。
以阿里巴巴股票 (BABA) 为例的 LOB 如下图所示。
在 LOB 中,卖家看 Bid,买家看 Ask。LOB 里面有四个重要参数,合称为最佳买卖报价 (Best Bid and Offer, BBO),分别是
在每个时点LOB可以显示三种不同层次的信息。
L1 信息
如果只看 BABA 的最佳买卖价 (Best Bid and Offer, BBO),那么它是一维数据 (price),通常称为 Level 1 (L1) 信息。
卖家可以从市场中以 160 美元卖出 500 股,买家可以从市场中以 161 美元买进 600 股。
L2 信息
如果还看 BABA 的非最佳买卖价 (Not Best Bid and Offer, NBBO),那么它是二维数据 (price+depth),通常称为 Level 2 (L2) 信息。
卖家可以从市场中以 160 美元卖出 500 股,吃完最佳买价 (hitting the bid) 之后,卖家可以继续从市场中以 159 美元卖出 550 股…
买家可以从市场中以 161 美元买进 600 股,吃完最佳卖价(lifting the offer) 之后,买家可以继续从市场中以 162 美元买进 800 股…
L3 信息
如果在一个价位上,还想区分不同人下单的量 (比如 600 股有 200 是我下的,400 是小明下的,我比小明先下单),那么它是三维数据(price+depth+size),通常称为 Level 3 (L3) 信息。
通常数据商提供的是像金融信息交换协议 (Financial Information eXchange, FIX) 类似的原始数据,可以搭建出每个时点的交易账簿 (order book),更精确点的描述是限价定单簿 (limit order book, LOB)。
CME Globex 是世界上第一个期货电子交易系统,下图是 Globex 里 FIX 的数据结构说明。
从上面表格可看出:
等等。。。
用第 1 到 9 行的信息可以从 FIX 表格重建 L3 的 LOB。
伪代码如下:
而第 7 行和 10 到 15 行用来做交易匹配 (trade matching) 的。
总结:基本面数据相比,市场数据更规范,而且频率更高,数据量更大,处理起来也更困难,但是价值更大。
4
分析数据
类比金融产品的原生资产和衍生品的关系,分析数据 (Analytics Data) 是原始数据的衍生品,即由原始数据加工得来的。原始数据可以是基本面数据和市场数据,甚至还可以是下节讨论的另类数据。
我们可用
下图总结各类原始数据和对应的分析数据。
使用「分析数据」有利有弊
5
另类数据
另类数据 (Alternative Data) 包括传统数据之外的新的数据,主要成分如下图。
个人数据
个人数据 (Individual Data) 是由个人网上行为产生的,它还可细分为
案例:
商业数据
商业数据 (Business Process Data) 是由商业流程产生的,它还可细分为
案例
传感数据
传感数据 (Sensor Data) 是由手机、无人机、卫星上的传感器产生的,它还可细分为
案例:
使用「另类数据」有利有弊
6
总结
金融市场数据可分四类,基本面数据、交易数据、分析数据和另类数据。
前三类属于结构性数据 (structured data),即可以用二维数据表 (excel, DataFrame 等) 储存的;而最后的另类数据属于非结构性数据(unstructured data),在使用前通常要转换成结构性数据。
有价值的东西做起来从来不容易,如果太容易,大概率没什么价值。有人开玩笑说,如果一套数据集让数据科学家处理起来时很头疼,这套数据集很可能价值很高。
下帖讲如何对数据采样 (bar sampling)。Stay Tuned!