Python 机器学习算法交易实用指南(一)(3)https://developer.aliyun.com/article/1523718
建立基本数据时间序列
财务报表和附注数据集中的数据范围包括从主要财务报表(资产负债表、利润表、现金流量表、权益变动表和全面收益表)和这些报表的附注中提取的数字数据。该数据最早可追溯至 2009 年。
提取财务报表和附注数据集
以下代码下载并提取了给定季度范围内财务报表和附注(FSN)数据集中包含的所有历史提交(有关更多详细信息,请参阅edgar_xbrl.ipynb
):
SEC_URL = 'https://www.sec.gov/files/dera/data/financial-statement-and-notes-data-sets/' first_year, this_year, this_quarter = 2014, 2018, 3 past_years = range(2014, this_year) filing_periods = [(y, q) for y in past_years for q in range(1, 5)] filing_periods.extend([(this_year, q) for q in range(1, this_quarter + 1)]) for i, (yr, qtr) in enumerate(filing_periods, 1): filing = f'{yr}q{qtr}_notes.zip' path = data_path / f'{yr}_{qtr}' / 'source' response = requests.get(SEC_URL + filing).content with ZipFile(BytesIO(response)) as zip_file: for file in zip_file.namelist(): local_file = path / file with local_file.open('wb') as output: for line in zip_file.open(file).readlines(): output.write(line)
数据相当庞大,为了实现比原始文本文件更快的访问,最好将文本文件转换为二进制、列式 parquet 格式(请参见本章中关于与 pandas DataFrames
兼容的各种数据存储选项的性能比较的使用 pandas 进行高效数据存储一节):
for f in data_path.glob('**/*.tsv'): file_name = f.stem + '.parquet' path = Path(f.parents[1]) / 'parquet' df = pd.read_csv(f, sep='\t', encoding='latin1', low_memory=False) df.to_parquet(path / file_name)
对于每个季度,FSN 数据组织成包含有关提交、数字、税项标签、演示等信息的八个文件集。每个数据集由行和字段组成,并以制表符分隔的文本文件形式提供:
文件 | 数据集 | 描述 |
SUB |
提交 | 根据公司、表格、日期等识别每个 XBRL 提交 |
TAG |
标签 | 定义和解释每个税项标签 |
DIM |
尺寸 | 对数字和纯文本数据进行详细描述 |
NUM |
数字 | 每个备案中每个不同数据点的一行 |
TXT |
纯文本 | 包含所有非数字 XBRL 字段 |
REN |
渲染 | 在 SEC 网站上呈现的信息 |
PRE |
展示 | 主要报表中标签和数字展示的详细信息 |
CAL |
计算 | 显示标签之间的算术关系 |
检索所有季度苹果备案
提交数据集包含检索备案所需的唯一标识符:中央索引键(CIK)和接入号(adsh
)。以下显示了有关苹果 2018Q1 10-Q 备案的一些信息:
apple = sub[sub.name == 'APPLE INC'].T.dropna().squeeze() key_cols = ['name', 'adsh', 'cik', 'name', 'sic', 'countryba', 'stprba', 'cityba', 'zipba', 'bas1', 'form', 'period', 'fy', 'fp', 'filed'] apple.loc[key_cols] name APPLE INC adsh 0000320193-18-000070 cik 320193 name APPLE INC sic 3571 countryba US stprba CA cityba CUPERTINO zipba 95014 bas1 ONE APPLE PARK WAY form 10-Q period 20180331 fy 2018 fp Q2 filed 20180502
使用中央索引键,我们可以识别出适用于Apple
的所有历史季度备案,并将此信息结合起来获得 26 份10-Q
表格和 9 份年度10-K
表格:
aapl_subs = pd.DataFrame() for sub in data_path.glob('**/sub.parquet'): sub = pd.read_parquet(sub) aapl_sub = sub[(sub.cik.astype(int) == apple.cik) & (sub.form.isin(['10-Q', '10-K']))] aapl_subs = pd.concat([aapl_subs, aapl_sub]) aapl_subs.form.value_counts() 10-Q 15 10-K 4
有了每个备案的接入号,我们现在可以依靠税项分类来从NUM
和TXT
文件中选择适当的 XBRL 标签(在TAG
文件中列出)以获取感兴趣的数字或文本/脚注数据点。
首先,让我们从 19 份苹果备案中提取所有可用的数字数据:
aapl_nums = pd.DataFrame() for num in data_path.glob('**/num.parquet'): num = pd.read_parquet(num) aapl_num = num[num.adsh.isin(aapl_subs.adsh)] aapl_nums = pd.concat([aapl_nums, aapl_num]) aapl_nums.ddate = pd.to_datetime(aapl_nums.ddate, format='%Y%m%d') aapl_nums.shape (28281, 16)
建立一个价格/收益时间序列
总共,九年的备案历史为我们提供了超过 28,000 个数字值。我们可以选择一个有用的字段,例如每股稀释收益(EPS),将其与市场数据结合起来计算流行的市盈率(P/E)估值比率。
但是,我们需要考虑到,苹果于 2014 年 6 月 4 日进行了 7:1 的股票分割,并且调整了分割前的每股收益,以使收益可比,如下图所示:
field = 'EarningsPerShareDiluted' stock_split = 7 split_date = pd.to_datetime('20140604') # Filter by tag; keep only values measuring 1 quarter eps = aapl_nums[(aapl_nums.tag == 'EarningsPerShareDiluted') & (aapl_nums.qtrs == 1)].drop('tag', axis=1) # Keep only most recent data point from each filing eps = eps.groupby('adsh').apply(lambda x: x.nlargest(n=1, columns=['ddate'])) # Adjust earnings prior to stock split downward eps.loc[eps.ddate < split_date,'value'] = eps.loc[eps.ddate < split_date, 'value'].div(7) eps = eps[['ddate', 'value']].set_index('ddate').squeeze() eps = eps.rolling(4, min_periods=4).sum().dropna() # create trailing 12-months eps from quarterly data
我们可以使用 Quandl 来获取自 2009 年以来的苹果股价数据:
import pandas_datareader.data as web symbol = 'AAPL.US' aapl_stock = web.DataReader(symbol, 'quandl', start=eps.index.min()) aapl_stock = aapl_stock.resample('D').last() # ensure dates align with eps data
现在我们有了数据来计算整个期间的滚动 12 个月 P/E 比率:
pe = aapl_stock.AdjClose.to_frame('price').join(eps.to_frame('eps')) pe = pe.fillna(method='ffill').dropna() pe['P/E Ratio'] = pe.price.div(pe.eps) axes = pe.plot(subplots=True, figsize=(16,8), legend=False, lw=2);
对于前述代码,我们得到了以下的绘图:
其他基本数据来源
还有许多其他的基础数据来源。许多可通过早期介绍的pandas_datareader
模块访问。还有其他数据可以直接从某些组织获得,例如 IMF、世界银行或世界各地的主要国家统计机构(请参阅 GitHub 上的参考文献)。
pandas_datareader – 宏观和行业数据
pandas_datareader
库根据上一节市场数据末尾介绍的约定简化了访问。它覆盖了许多全球基础宏观和行业数据源的 API,包括以下内容:
- 肯尼斯·弗伦奇的数据库:捕捉规模、价值和动量因素、分解行业的投资组合的市场数据
- 圣路易斯联邦储备银行(FRED):美国经济和金融市场的联邦储备数据
- 世界银行:长期、低频经济和社会发展以及人口统计数据库
- 经济合作与发展组织(OECD):类似于 OECD 国家
- Enigma:各种数据集,包括替代来源
- Eurostat:欧盟经济、社会和人口统计数据
用 pandas 进行高效的数据存储
在本书中我们将使用许多不同的数据集,值得比较主要格式的效率和性能。特别是,我们比较以下内容:
- CSV: 逗号分隔,标准的纯文本文件格式。
- HDF5:分层数据格式,最初在国家超级计算中心开发,是一种用于数值数据的快速可扩展的存储格式,可以使用
PyTables
库在 pandas 中使用。 - Parquet: 二进制的,列式存储格式,是 Apache Hadoop 生态系统的一部分,提供了高效的数据压缩和编码,并由 Cloudera 和 Twitter 开发。通过由 pandas 的原始作者 Wes McKinney 领导的
pyarrow
库可用于 pandas。
storage_benchmark.ipynb
笔记本使用一个可配置为包含数值数据、文本数据或两者的测试DataFrame
来比较上述库的性能。对于HDF5
库,我们测试fixed
和table
格式。table
格式允许查询并且可以追加。
以下图表说明了具有随机浮点数的 100,000 行和 1000 个随机 10 个字符字符串列或仅有 2,000 个浮点列的 100,000 行的读写性能:
- 对于纯数值数据,HDF5 格式性能最佳,并且表格式与 CSV 共享 1.6 GB 的最小内存占用。固定格式使用了两倍的空间,parquet 格式使用了 2 GB。
- 对于数字和文本数据的混合,
parquet
显着更快,而 HDF5 则利用其相对于 CSV 的读取优势(在两种情况下写入性能都很低):
该笔记本演示了如何使用%%timeit
单元格魔法配置、测试和收集时间,并同时演示了使用相关的 pandas 命令来使用这些存储格式所需的用法。
总结
本章介绍了构成大多数交易策略骨干的市场和基本数据来源。您了解了访问这些数据的多种方式,以及如何预处理原始信息,以便您可以开始使用我们即将介绍的机器学习技术提取交易信号。
在我们进入交易策略的设计和评估以及使用 ML 模型之前,我们需要涵盖近年来出现的替代数据集,这些数据集对算法交易的 ML 流行程度有着重要推动作用。
第三章:金融领域的替代数据
在互联网和移动网络的爆炸性增长推动下,数字数据在新数据源的处理、存储和分析技术进步的同时呈指数级增长。数字数据的可用性和管理能力的指数级增长,反过来又成为驱动创新的机器学习(ML)在包括投资行业在内的各行业的戏剧性性能提升背后的关键力量。
数据革命的规模是非凡的:仅过去两年就创造了今天世界上所有数据的 90%,到 2020 年,全球 77 亿人口预计每天每秒产生 1.7 MB 的新信息。另一方面,回到 2012 年,仅有 0.5% 的数据被分析和使用,而到 2020 年,有 33% 被认为具有价值。随着全球对分析的投资预计将于 2020 年超过 2100 亿美元,价值创造潜力将倍增,数据的可用性和使用之间的差距可能会迅速缩小。
本章解释了个人、业务流程和传感器如何产生替代数据。它还提供了一个框架,用于为投资目的导航和评估不断增长的替代数据供应。它演示了工作流程,从获取到预处理和使用 Python 存储通过网络抓取获得的数据,为 ML 应用铺平了道路。最后,它通过提供来源、供应商和应用程序的示例来结束。
本章将涵盖以下主题:
- 替代数据革命如何释放新的信息来源
- 个人、业务流程和传感器如何生成替代数据
- 如何评估用于算法交易的不断增长的替代数据供应
- 如何在 Python 中处理替代数据,例如通过抓取互联网
- 替代数据的重要类别和提供商
替代数据革命
由数字化、网络化和存储成本的暴跌驱动的数据洪流已经导致可用于预测分析的信息性质发生了深刻的定性变化,通常由五个 V 总结:
- 容量:由在线和离线活动、交易、记录和其他来源产生、收集和存储的数据量是数量级更大的副产品,随着分析和存储能力的增长,这些来源和数量也在不断增加。
- 速度:数据生成、传输和处理以接近实时的速度变得可用。
- 多样性:数据的组织格式不再局限于结构化、表格形式,如 CSV 文件或关系数据库表。相反,新的来源产生半结构化格式,如 JSON 或 HTML,以及非结构化内容,包括原始文本、图像和音频或视频数据,为使数据适用于机器学习算法增加了新的挑战。
- 真实性:来源和格式的多样性使得验证数据信息内容的可靠性变得更加困难。
- 价值:确定新数据集的价值可能会比以往更加耗时和耗资源,并且更加不确定。
对于算法交易而言,如果新数据来源提供了无法从传统来源获取的信息,或者提供了更早的获取机会,则它们将提供信息优势。随着全球趋势,投资行业正迅速扩展到超越市场和基本数据的替代来源,以通过信息优势实现阿尔法。数据、技术能力和相关人才的年度支出预计将从当前的 30 亿美元以每年 12.8%的速度增加到 2020 年。
如今,投资者可以实时获取宏观或公司特定的数据,而这些数据在历史上只能以更低的频率获得。新数据来源的用例包括以下内容:
- 代表性商品和服务的在线价格数据可用于衡量通货膨胀
- 商店访问或购买次数可以允许对公司或行业特定销售或经济活动进行实时估计
- 卫星图像可以揭示农业产量,或者矿山或石油钻井平台上的活动,而这些信息在其他地方得到之前是不可用的
随着大数据集的标准化和采用的推进,传统数据中包含的信息可能会失去大部分预测价值。
此外,处理和整合多样化数据并应用机器学习的能力允许获得复杂的见解。过去,定量方法依赖于简单的启发式方法来使用历史数据对公司进行排名,例如按照价格/账面价值比进行排名,而机器学习算法则综合新指标,并学习和适应这些规则,考虑到市场数据的演变。这些见解创造了捕捉经典投资主题的新机会,如价值、动量、质量或情绪:
- 动量:机器学习可以识别资产暴露于市场价格波动、行业情绪或经济因素
- 价值:算法可以分析大量经济和行业特定的结构化和非结构化数据,超越财务报表,以预测公司的内在价值
- 质量:集成数据的复杂分析使得能够评估顾客或员工评论、电子商务或应用流量,以确定市场份额或其他基本收益质量驱动因素的增益
然而,在实践中,有用的数据通常不是免费提供的,而是需要进行彻底的评估、昂贵的获取、谨慎的管理和复杂的分析才能提取可交易的信号。
替代数据的来源
替代数据由许多来源生成,但可以在高层次上分类为主要由以下来源产生的:
- 在社交媒体上发布帖子、评论产品或使用搜索引擎的个人
- 记录商业交易的企业,特别是信用卡支付,或作为中间商捕获供应链活动
- 传感器,它们除了其他功能外,通过诸如卫星或安全摄像头的图像或通过诸如手机基站的移动模式捕获经济活动
替代数据的性质继续迅速发展,因为新的数据来源变得可用,而以前标记为替代的来源成为主流的一部分。例如,波罗的海干散货运价指数(BDI),现在通过 Bloomberg 终端可用,汇集了数百家航运公司的数据以近似干散货运输船的供需情况。
替代数据包括原始数据以及已汇总或以某种形式加工以增加价值的数据。例如,一些提供商旨在提取可交易的信号,如情绪分数。我们将在第四章,Alpha 因子研究中讨论各种类型的提供商。
替代数据来源在关键方面有所不同,这些方面决定了它们对算法交易策略的价值或信号内容。我们将在下一节关于评估替代数据集中讨论这些方面。
个人
个人通过在线活动以及离线活动而自动生成电子数据,因为后者被电子捕获并经常与在线身份关联。由个人生成的数据通常是文本、图像或视频格式的非结构化数据,通过多个平台传播,包括:
- 社交媒体帖子,例如在 Twitter、Facebook 或 LinkedIn 等综合性网站上的意见或反应,或在 Glassdoor 或 Yelp 等商业评论网站上
- 在网站上反映对产品的兴趣或感知的电子商务活动,例如 Amazon 或 Wayfair
- 利用诸如 Google 或 Bing 之类的平台的搜索引擎活动
- 移动应用程序的使用情况、下载量和评论
- 个人数据,如消息流量
社交媒体情感分析变得非常流行,因为它可以应用于个别股票、行业篮子或市场指数。最常见的来源是 Twitter,其次是各种新闻供应商和博客网站。由于通常是通过日益商品化的网络抓取获得,供应是竞争性的,价格更低。可靠的社交媒体数据集通常包括博客、推文或视频,在大规模消费者最近采用这些工具的情况下,历史不足五年。相比之下,搜索历史可追溯至 2004 年。
业务流程
企业和公共实体生产和收集许多有价值的替代数据来源。由业务流程产生的数据通常比个人生成的数据更有结构。它非常有效地作为活动的领先指标,这种活动通常以更低的频率可用。
由业务流程产生的数据包括:
- 由处理器和金融机构提供的支付卡交易数据
- 公司排放的数据由普通数字化活动或记录生成,例如银行记录、收银机扫描数据或供应链订单
- 贸易流动和市场微观结构数据(如 L-2 和 L-3 订单簿数据,在第二章中有图示,市场与基本数据)
- 由信用评级机构或金融机构监测的公司支付,以评估流动性和信用状况
信用卡交易和公司排放数据,如销售点数据,是最可靠和最具预测性的数据集之一。信用卡数据的历史可追溯到约十年前,并且在不同的滞后期几乎可以实时获得,而公司盈利报告的滞后期为 2.5 周。公司排放数据的时间范围和报告滞后期因来源而异。市场微观结构数据的历史超过 15 年,而与之相比,销售方流量数据通常只有不到五年的一致历史。
传感器
嵌入在广泛范围设备中的网络传感器生成的数据是增长最快的数据来源之一,其增长受到智能手机普及和卫星技术成本降低的推动。
这一类替代数据通常非常无结构,通常比个人或业务流程生成的数据体积大得多,并且具有更高的处理挑战。该类别中的关键替代数据来源包括:
- 卫星成像用于监测经济活动,例如建筑、航运或商品供应
- 用于跟踪零售店铺交通的地理位置数据,例如使用志愿者智能手机数据,或者在运输路线上,例如在船只或卡车上
- 在感兴趣的位置设置摄像头
- 天气和污染传感器
**物联网(IoT)**将通过将网络微处理器嵌入个人和商业电子设备,如家用电器、公共空间和工业生产过程,进一步加速这类替代数据的大规模收集。
基于传感器的替代数据包括卫星图像、移动应用程序使用情况或蜂窝位置跟踪,通常具有三到四年的历史。
卫星
发射地理空间成像卫星所需的资源和时间表已经大幅降低;成本从数千万美元和数年的准备时间降至约 10 万美元,将小型卫星作为低地球轨道的辅助有效载荷发射。因此,公司可以使用整个卫星机队获得对特定位置的更高频率覆盖(目前约每天一次)。
应用案例包括监测经济和商业活动,可以通过航拍覆盖范围捕捉到,例如农业和矿产生产和货运、房地产或船舶的建造、工业事故如火灾,或位置感兴趣处的汽车和人流量。相关的传感器数据由用红外线光监视农作物的农业无人机贡献。
在卫星图像数据能够可靠用于 ML 模型之前,可能需要解决一些挑战。这些挑战包括考虑天气条件,特别是云层覆盖和季节效应,节假日期间,以及可能影响预测信号质量的特定位置的不规则覆盖。
地理位置数据
地理位置数据是传感器产生的另一类迅速增长的替代数据。一个熟悉的来源是智能手机,个人通过应用程序或 GPS、CDMA 或 WiFi 等无线信号自愿共享他们的地理位置,以测量周围地点(如商店、餐厅或活动场所)的人流量。
此外,越来越多的机场、购物中心和零售店安装了传感器,跟踪顾客的数量和移动。尽管最初部署这些传感器的动机通常是为了衡量营销活动的影响,但由此产生的数据也可以用于估算人流量或销售情况。用于捕捉地理位置的传感器包括 3D 立体视频和热成像,这降低了隐私顾虑,但对移动对象效果很好。还有安装在天花板上的传感器,以及压力敏感的垫子。一些供应商结合使用多个传感器,包括视觉、音频和手机定位,全面了解购物者的旅程,这不仅包括访问次数和时长,还延伸到转化和重复访问的测量。
评估替代数据集
替代数据的最终目标是在寻找产生 alpha 的交易信号的竞争中提供信息优势,即正的、不相关的投资回报。在实践中,从替代数据集中提取的信号可以作为独立基础使用,也可以作为定量策略的一部分与其他信号组合使用。如果基于单一数据集的策略产生的夏普比率足够高,独立使用是可行的,但在实践中很少见(有关信号测量和评估的详细信息,请参阅 第四章 Alpha 因子研究)。
量化公司正在建立可以单独是弱信号但组合后可能产生吸引人回报的 alpha 因子库。正如 第一章 用于交易的机器学习 中所强调的,投资因素应基于基本的经济理念,否则,它们更可能是对历史数据过拟合的结果,而不是对新数据持续产生 alpha 的结果。
由于竞争导致的信号衰减是一个严重问题,随着替代数据生态系统的发展,很少有数据集将保留有意义的夏普比率信号。延长替代数据集信号内容的半衰期的有效策略包括独家协议或专注于提高处理挑战以提高进入门槛的数据集。
评估标准
可以基于其信号内容的质量、数据的定性方面以及各种技术方面来评估替代数据集。
信号内容的质量
信号内容可以根据目标资产类别、投资风格、与传统风险溢价的关系以及最重要的,其 alpha 内容来评估。
资产类别
大多数替代数据集包含与股票和商品直接相关的信息。自 2006 年 Zillow 成功地开创了价格估算以后,针对房地产投资的有趣数据集也在增加。
随着用于监测企业支付的替代来源的发展,包括针对中小企业的,企业信用的替代数据正在增长。围绕固定收益和利率预测的替代数据是一个较新的现象,但随着更多的产品销售和价格信息被大规模地获取,它还在增加。
投资风格
大多数数据集关注特定行业和股票,因此自然吸引长短股权投资者。随着替代数据收集的规模和范围不断扩大,替代数据可能也会变得与宏观主题的投资者相关,例如消费信贷、新兴市场的活动和商品趋势。
一些替代数据可用作市场风险传统度量的代理,而其他信号则更相关于使用量化策略的高频交易者,这些策略在短期内进行。
风险溢价
一些替代数据集,如信用卡支付或社交媒体情绪,已被证明产生的信号与传统股票市场的风险溢价(如价值、动量和波动性质量)之间的相关性较低(低于 5%)。因此,将来自这类替代数据的信号与基于传统风险因素的算法交易策略结合起来,可以成为更多元化的风险溢价投资组合的重要组成部分。
Alpha 内容和质量
正当投资于替代数据集所需的信号强度自然取决于其成本,而替代数据的价格差异很大。评分社交情绪的数据可以以几千美元或更少的价格获得,而涵盖全面和及时的信用卡支付的数据则可能每年成本数百万美元。
我们将详细探讨如何使用历史数据,即所谓的回测,评估由替代数据驱动的交易策略,以估计数据集中包含的 Alpha 量。在个别情况下,一个数据集可能包含足够的 Alpha 信号来驱动一个独立的策略,但更典型的是结合各种替代和其他数据源的使用。在这些情况下,一个数据集允许提取出产生小正夏普比率的弱信号,这些信号在自身上不会获得资本分配,但当与类似的其他信号集成时可以提供投资组合级别的策略。然而,并不保证这一点,因为也有许多替代数据集不包含任何 Alpha 内容。
除了评估数据集的 Alpha 内容之外,还重要评估信号的增量或正交程度,即唯一于一个数据集还是已被其他数据捕获,在后一种情况下比较这种类型信号的成本。
最后,评估依赖于给定数据的策略的潜在容量是至关重要的,即可以分配的资本量而不会损害其成功,因为容量限制会使数据成本的回收变得更加困难。
Python 机器学习算法交易实用指南(一)(5)https://developer.aliyun.com/article/1523720