跳转至




Index

OpenBB实战!轻松获取海外市场数据

你有没有这样的经历?常常看到一些外文的论文或者博文,研究方法很好,结论也很吸引人,忍不住就想复现一下。

但是,这些文章用的数据往往都是海外市场的。我们怎么才能获得免费的海外市场数据呢?

之前有 yfinance,但是从 2021 年 11 月起,就对内陆地区不再提供服务了。我们今天就介绍这样一个工具,OpenBB。它提供了一个数据标准,通过它可以聚合许多免费和付费的数据源。

在海外市场上,Bloomberg 毫无疑问是数据供应商的老大,产品和服务包括财经新闻、市场数据、分析工具,在全球金融市场中具有极高的影响力,是许多金融机构、交易员、分析师和决策者不可或缺的信息来源。不过 Bloomberg 的数据也是真的贵。如果我们只是个人研究,或者偶尔使用一下海外数据,显然,还得寻找更有性价比的数据源。

于是,OpenBB 就这样杀入了市场。从这名字看,它就是一个 Open Source 的 Bloomberg。

OpenBB 有点纠结。一方面,它是开源的,另一方面,它又有自己的收费服务。当然,在金融领域做纯开源其实也没有什么意义,指着人家免费,自己白嫖赚钱,这事也说不过去。大家都是冲着赚钱来的,付费服务不寒碜人。

Info

感谢这些开源的产品,让所有人都有机会,From Zero To Hero! 金融一向被视为高端游戏,主要依赖性和血液来传播。开源撕开了一条口子,让普通人也能窥见幕后的戏法。
如果使用过 OpenBB,而它也确实达成了它的承诺,建议你前往 Github,为它点一个赞。
开源项目不需要我们用金钱来支持,但如果我们都不愿意给它一个免费的拥抱,最后大家就只能使用付费产品了。

安装 openbb

通过以下命令安装 openbb:

1
pip install openbb[all]

Tip

openbb 要求的 Python 版本是 3.11 以上。你最好单独为它创建一个虚拟环境。

安装后,我们有多种方式可以使用它。

使用命令行

安装后,我们可以在命令行下启动 openbb。

然后就可以按照提示,输入命令。比如,如果我们要获得行情数据,就可以一路输入命令 equity > price, 再输入 historical --symbol LUV --start_date '2024-01-01' --end_date '2024-08-01',就可以得到这支股票的行情数据。

openbb 会在此时弹出一个窗口,以表格的形式展示行情数据,并且允许你在此导出数据。

效果有点出人意料,哈哈。

比较有趣的是,他们把命令设计成为 unix 路径的模式。所以,在执行完刚才的命令之后,我们可以输入以根目录为起点的其它命令,比如:

1
/economy/gdp
我们就可以查询全球 GDP 数据。

使用 Python

我们通过 notebook 来演示一下它的使用。

1
2
3
from openbb import obb

obb

这个 obb 对象,就是我们使用 openbb 的入口。当我们直接在单元格中输入 obb 时,就会提示我们它的属性和方法:

在这里,openbb 保持了接口的一致性。我们看到的内容和在 cli 中看到的差不多。

现在,我们演示一些具体的功能。首先,通过名字来查找股票代码:

1
2
3
from openbb import obb

obb.equity.search("JPMorgan", provider="nasdaq").to_df().head(3)

输出结果为:

作为一个外国人,表示要搞清楚股票代码与数据提供商的关系,有点困难。不过,如果是每天都研究它,花点时间也是应该的。

我们从刚才的结果中,得知小摩(我常常记不清 JPMorgan 是大摩还是小摩。但实际上很好记。一个叫摩根士丹利,另一个叫摩根大通。大通是小摩)的股票代码是 AMJB(名字是 JPMorgan Chase 的那一个),于是我们想查一下它的历史行情数据。如果能顺利取得它的行情数据,我们的教程就可以结束了。

但是,当我们调用以下代码时:

1
obb.equity.price.historical("AMJB")

出错了!提示 No result found.

使用免费、但需要注册的数据源

真实原因是 OpenBB 中,只有一个开箱即用的免费数据源 -- CBOE,但免费的 CBOE 数据源里没有这个股票。我们要选择另外一个数据源,比如 FMP。但是,需要先注册 FMP 账号(免费),再将 FMP 账号的 API key 添加到 OpenBB hub 中。

FMP 是 Financial Modeling Prep (FMP) 数据提供商,它提供免费(每限 250 次调用)和收费服务,数据涵盖非常广泛,包括了美国股市、加密货币、外汇和详细的公司财务数据。免费数据可以回调 5 年的历史数据。

Tip

OpenBB 支持许多数据源。这些数据源往往都提供了一些免费使用次数。通过 OpenBB 的聚合,你就可以免费使用尽可能多的数据。

注册 FMP 只需要有一个邮箱即可,所以,如果 250 次不够用,看起来也很容易加量。注册完成后,就可以在 dashboard 中看到你的 API key:

然后注册 Openbb Hub 账号,将这个 API key 添加到 OpenBB hub 中。

现在,我们将数据源改为 FMP,再运行刚才的代码,就可以得到我们想要的结果了。

1
obb.equity.price.historical("AMJB", provider="fmp").to_df().tail()

我们将得到如下结果:

换一支股票,apple 的,我们也是先通过 search 命令,拿到它的代码'AAPL'(我常常记作 APPL),再代入上面的代码,也能拿到数据了。

需要做一点基本面研究,比如,想知道 apple 历年的现金流数据?

1
obb.equity.fundamental.cash("AAPL", provider='fmp').to_df().tail()

任何时候,交易日历、复权信息和成份股列表都是回测中不可或缺的(在 A 股,还必须有 ST 列表和涨跌停历史价格)。我们来看看如何获取股标列表和成份股列表:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 获取所有股票列表
all_companies = obb.equity.search("", provider="sec")

print(len(all_companies.results))
print(all_companies.to_df().head(10))

# 获取指数列表
indices = obb.index.available(provider="fmp").to_df()
print(indices)

# 获取指数成份股,DOWJONES, NASDAQ, SP500(无权限)
obb.index.constituents("dowjones", provider='fmp').to_df()

好了。尝试一个新的库很花时间。而且往往只有花过时间之后,你才能决定是否要继续使用它。如果最终不想使用它,那么前面的探索时间就白花了。

于是,我们就构建了一个计算环境,在其中安装了 OpenBB,并且注册了免费使用的 fmp 数据源,提供了示例 notebook,供大家练习 openbb。

这个环境是免费提供给大家使用的。如果你也想免安装立即试试 OpenBB,那么就进群看公告,领取登陆地址吧!

Datathon-我的Citadel量化岗之路!附历年比赛资料

Citadel是一家顶级的全球性对冲基金管理公司,由肯尼斯.格里芬(Kenneth Griffin)创建于1990年,是许多量化人的梦中情司。

Citadel为应届生提供多个岗位,但往往需要先进行一段实习。

Citadel的实习资格也是比较有难度,这篇文章就介绍一些通关技巧。

我们会对主要的三类岗位,即投资量化研究软件研发都进行一些介绍,但是重点会在量化研究岗位上。

我们将介绍获得量化研究职位的一条捷径,并提供一些重要的准备资料。

投资类岗位

投资类岗位可能是最难的,但待遇十分优渥。

2025年的本科或者硕士实习生将拿到5300美元的周薪,并且头一周都是住在四季酒店里,方便新人快速适应自己的同伴和进行社交。

在应聘条件上面,现在的专业和学校背景并不重要,你甚至可以不是经济学或者金融专业的,但需要对股票的估值感兴趣。

但他们的要求是“非凡(Extraordianry)” -- 这个非凡的标准实际上比哈佛的录取标准还要高一些。Citadel自称录用比是1%,哈佛是4%。如果要对非凡举个例子的话,Citadel会介绍说,他们招过NASA宇航员。

所以,关于这个岗位,我很难给出建议,但是Citadel在面试筛选上,是和Wonderlic合作的,如果你确实很想申这个岗位,建议先报一个Wonderlic的培训,大约$50左右。Wonderlic Select会有认知、心理、文化和逻辑方面的测试,参加此类培训,将帮助你刷掉一批没有准备的人。

11 weeks of extraordinary growth program

一旦入选为实习生,Citadel将提供一个11周的在岗实训,实训内容可以帮助你快速成长。通过实训后,留用的概率很大。

软件研发类

这个岗位比较容易投递,Citadel有一个基本的筛选,很快就会邀请你参加 HackerRank测试。由于HackerRank是自动化的,所以,几乎只要申请,都会得到邀请。

HackerRank有可能遇到LeetCode上困难级的题目,但也有人反映会意外地遇到Easy级别的题目。总的来说,平时多刷Leetcode是会有帮助的。并且准备越充分,胜出的机会就越大。

你可以在glassdoor或者一亩三分地(1point3acres)上看到Citadel泄漏出来的面试题,不过,多数信息需要付费。

量化研究和Datathon

参加Datathon并争取好的名次,是获得量化研究岗位实习的捷径。从历年比赛数据来看,竞争人数并不会很多(从有效提交编号分析),一年有两次机会。

这个比赛是由correlation one承办的。c1是由原对冲基金经理Rasheed Sabar发起的,专注于通过培训解决方案帮助企业和发展人才。

它的合作对象有DoD, Amazon, Citadel, Point 72等著名公司。可能正是因为创始人之前的职业人脉,所以它拿到了为Citadel, Point 72举办竞赛和招募的机会。在它的网站上有一些培训和招募项目,也可以看一看。

Correlation One

Datathon只针对在校生举办,你得使用学校邮箱来申请。通过官网在线报名后,你需要先进行一个90分钟的在线评估。这个评估有心理和价值观的、也有部分技术的。

评估结果会在比赛前三天通知。然后进入一个社交网络阶段(network session),在此阶段,你需要组队,或者加入别人的队伍。Datathon是协作性项目,一般要求4人一队参赛。

正式开始后,你会收到举办方发来的问题和数据集(我们已搜集历年测试问题、数据集及参赛团队提交的答案到网站,地址见文末),需要从中选择一个问题进行研究,并在7天内提交一个报告,阐明你们所进行的研究。

这个过程可能对内地的学生来讲生疏一些,但对海外留学生来讲,类似的协作和作为团队进行presentation是很平常的任务了。所以,内地的学生如果想参加的话,更需要这方面的练习,不然,会觉得7天时间不够用。

女生福利

女生除可以参加普通的Datathon之外,还有专属的Women's Datathon,最近的一次是明年的1月10日,现在开始准备正是好时机。

不过,这次Women's Datathon是线下的,仅限美国和加拿大在读学生参加。

Datathon通关技巧

Datathon看起来比赛的是数据分析能力,是硬技巧,但实际上,熟悉它的规则,做好团队协作也非常重要。而且从公司文化上讲,Citadel很注重协作。

  1. 组队时,一定要确保团队成员使用相同的编程语言,否则工作结果是没有办法聚合的。
  2. 尽管Citadel没有限制编程语言和工具软件,但最终提供的报告必须是PDF, PPT或者HTML。并且,如果你提交的PDF包含公式的话,还必须提供latex源码。考虑到比赛只有7天,所以你平时就必须很熟悉这些工具软件。或者,当你组队时,就需要考虑,团队中必须包含一个有类似技能的人。
  3. Datathon是在线的虚拟竞赛,所以,并没有现场的presentation环境。因此,一定要完全熟悉和遵循它的提交规范。
  4. 也正是因为上一条,Report一定要条理清晰,一定要从局外人的身份多读几次,看看项目之外的人读了这份报告,能否得到清晰的印象。
  5. 尽可能熟悉Jupyter Notebook和pandas(如果你使用Python的话)。这也是官方推荐,通过Notebook可以快速浏览竞赛所提供的数据集。
  6. 补充数据是有益的,这能反映你跳出框架自己解决问题的能力。所以平常要多熟悉一些数据集。如果一些数据要现爬的话,那需要非常熟悉爬虫。因为爬虫与后面的数据分析是串行的。在数据拿下来之前,其它工作都只能等待。
  7. Visualization非常重要。如果你习惯使用Python,平时可以多练习matplotlib和seaborn这两个库。

我们已经搜集了2017年以来所有的竞赛题目,包括数据、问题,以及一些团队提交的报告和代码。如果你需要准备Datathon,这会是一个非常好的参考。

在这里,我们对2024年夏的Datathon做一个简单介绍。

2024年 Summer Datathon

Problem Statement of 2024 Summer Datathon

2024年的Datathon于8月5日刚刚结束。这次的题目是关于垃圾食品的,要求从提供的数据集中,得出关于美国食品加工的一些结论。除了指定数据集之外,也允许根据需要自行添加新的数据集。不过,这些数据集也提交给评委,并且不得超过2G。

论题可以从以下三个之中选择,也可以自行拟定:

  1. 能够从肉类生产来预测餐馆的股价吗?
  2. 糖的价格会影响年青人对含糖饮料的消费吗?如果存在影响,这种影响会有地区差异吗?
  3. 肉制品生产低谷与失业人数相关吗?

有的团队已经将竞赛数据集、问题及他们的答案上传到github,下表是我们搜集的部分repo列表。其中包含了一些当年夺得过名次的solution,非常值得研究。如果你在练习中能达到此标准,那么就有较大概率在自己的比赛中取得名次。

year rank files 说明
2024 summer NA data, code, report 两个团队的报告,可运行
2024 spring NA data, code, report 目录清晰,报告质量高
2023 NA report, code
2022 3rd report, code 报告质量高,可视化效果
2021 summer 1st data, src, report 包含airbnb数据
2021 spring NA data,code,report
[2020] 3rd report
2018 1st data,code,report 两个团队的报告
[2017] NA report,code,data

这些竞赛的资料也都上传到了我们的课程环境。

Datathon 历年资料

如果你想立即开始练习,可以申请使用我们的课程环境,这样可以节省你下载数据、安装环境的时间。我们已帮你调通了2024年夏季比赛的代码,可以边运行边学习他人的代码。

[0811] QuanTide Weekly

本周要闻

  • 央行表示,将在公开市场操作中增加国债买卖。坚决防范汇率超调风险。
  • 统计局:七月 CPI 同比上涨 0.5%,PPI 同比下降 0.8%
  • 美最新初请失业金人数明显下降,市场对经济衰退的担忧稍解,美股震荡回升

下周看点

  • 周二晚美国PPI,周三晚美国核心CPI和周四零售销售数据
  • 周五(8 月 16 日)股指期货交割日
  • 周一马斯克连线特朗普

本周精选

  • Datathon-我的 Citadel 量化岗之路!附历年比赛资料
  • 视频通话也不能相信了! Deep-Live-Cam 一夜爆火,伪造直播只要一张照片!
  • 介绍一个量化库之 tsfresh

上期本周要闻中提到巴斯夫爆炸,维生素价格飙涨。本周维生素板块上涨 3.6%,最高上涨 6.7%。

  • 周末央行密集发声,完善住房租赁金融支持体系,支持存量商品房去库存。研究适度收窄利率走廊宽度。做好跨境资金流动的监测分析,防止形成单边一致性预期并自我强化,坚决防范汇率超调风险。利率走廊是指中央银行设定的短期资金市场利率波动范围。它通常由三个利率构成:
    政策利率:通常是央行的基准利率,如再贴现率或存款准备金利率。
    超额准备金利率(上限):银行存放在央行的超额准备金所获得的利息。
    隔夜拆借利率(下限):银行间市场的最低借贷成本。
  • 7 月 CPI 同比上涨 0.5%,前值 0.3%。其中猪肉上涨 20.4%,影响 CPI 上涨 0.24%。畜肉类价格上涨 4.9%,影响 CPI 上涨约 0.14%。受市场需求不足及部分国际大宗商品价格下行等因素影响,PPI 下降 0.8%,环比下降 0.2%。
    猪肉以一己之力拉升 CPI 涨幅近一半。猪肉短期上涨过快,涨势恐难持续,将对下月 CPI 环比构成压力。
  • 此前因 7 月失业率上升、巴菲特大幅减仓、日央行加息等多重导致全球股市巨幅震荡,美股经历2024年以来市场波动最大的一周。但在 8 日,美公布上周初请失业救济人数为 23.3 万,前值 25 万,预期 24 万。数据大幅好于前值和预期之后,市场担忧减弱,美股、日经等上周先跌后涨,基本收复失地。这一事件表明,近期市场对数据报告格外敏感。

  • 周五消息,嘉实基金董事长赵学军因个人问题配合有关部门调查。方正证券研究所所长刘章明被调整至副所长,不再担任研究所行政负责人。刘今年一月因违规荐股被出具警示函。

下周看点

  • 下周二、周三和周四,事关美联储降息的几大重要数据,如PPI, CPI和零售销售数据都将出炉。美联储鹰派人物表示,通胀率仍远高于委员会2%的目标,且存在上行风险。财报方面,家得宝、沃尔玛值得关注,身处商品供应链末端的大卖场们可能对于通胀在加速还是降速有更切身的体会。
  • 周五(8 月 16 日)股指期货交割日。今年以来,股指期货交割日上证指数表现比较平稳,甚至以上涨为主。

根据财联社、东方财富、证券时报等资讯汇编


DATATHON-我的 CITADEL 量化岗之路!附历年比赛资料

Kenneth Griffin Speak to Interns

Citadel 是一家顶级的全球性对冲基金管理公司,由肯尼斯. 格里芬 (Kenneth Griffin) 创建于 1990 年,是许多量化人的梦中情司。

Citadel 为应届生提供多个岗位,但往往需要先进行一段实习。

Citadel 的实习资格也是比较有难度,这篇文章就介绍一些通关技巧。


我们会对主要的三类岗位,即投资量化研究软件研发都进行一些介绍,但是重点会在量化研究岗位上。

我们将介绍获得量化研究职位的一条捷径,并提供一些重要的准备资料。


投资类岗位

投资类岗位可能是最难申请的,但待遇十分优渥。

2025 年的本科或者硕士实习生将拿到 5300 美元的周薪,并且头一周都是住在四季酒店里,方便新人快速适应自己的同伴和进行社交。

在应聘条件上面,现在的专业和学校背景并不重要,你甚至可以不是经济学或者金融专业的,但需要对股票的估值感兴趣。

但他们的要求是“非凡 (Extraordianry)” -- 这个非凡的标准实际上比哈佛的录取标准还要高一些。Citadel 自称录用比是 1%,哈佛是 4%。如果要对非凡举个例子的话,Citadel 会介绍说,他们招过 NASA 宇航员。

所以,关于这个岗位,我很难给出建议,但是 Citadel 在面试筛选上,是和 Wonderlic 合作的,如果你确实很想申这个岗位,建议先报一个 Wonderlic 的培训,大约$50 左右。Wonderlic Select 会有认知、心理、文化和逻辑方面的测试,参加此类培训,将帮你刷掉一批没有准备的人。

11 weeks of extraordinary growth program


一旦入选为实习生,Citadel 将提供一个 11 周的在岗实训,实训内容可以帮助你快速成长。通过实训后,留用的概率很大。

软件研发类

这个岗位比较容易投递,Citadel 在做一个很基本的筛选后,很快就会邀请你参加 HackerRank 测试。由于 HackerRank 是自动化的,所以,几乎只要申请,都会得到邀请。

HackerRank 有可能遇到 LeetCode 上困难级的题目,但也有人反映会意外地遇到 Easy 级别的题目。总的来说,平时多刷 Leetcode 是会有帮助的。并且准备越充分,胜出的机会就越大。

你可以在 glassdoor 或者一亩三分地(1point3acres)上看到 Citadel 泄漏出来的面试题,不过,多数信息需要付费。

量化研究和 Datathon

参加 Datathon 并争取好的名次,是获得量化研究岗位实习的捷径。从历年比赛数据来看,竞争人数并不会很多(从有效提交编号分析),一年有两次机会。

这个比赛是由 correlation one 承办的。c1 是由原对冲基金经理 Rasheed Sabar 发起的,专注于通过培训解决方案帮助企业和发展人才。

它的合作对象有 DoD, Amazon, Citadel, Point 72 等著名公司。可能正是因为创始人之前的职业人脉,所以它拿到了为 Citadel, Point 72 举办竞赛和招募的机会。在它的网站上有一些培训和招募项目,也可以看一看。


75% Correlation One

Datathon 只针对在校生举办,你得使用学校邮箱来申请。通过官网在线报名后,你需要先进行一个90 分钟的在线评估。这个评估有心理和价值观的、也有部分技术的。

评估结果会在比赛前三天通知。然后进入一个社交网络阶段(network session),在此阶段,你需要组队,或者加入别人的队伍。Datathon 是协作性项目,一般要求4 人一队参赛。

正式开始后,你会收到举办方发来的问题和数据集(我们已搜集历年测试问题、数据集及参赛团队提交的答案到网站,地址见文末),需要从中选择一个问题进行研究,并在 7 天内提交一个报告,阐明你们所进行的研究。

这个过程可能对内地的学生来讲生疏一些,但对海外留学生来讲,类似的协作和作为团队进行 presentation 是很平常的任务了。所以,内地的学生如果想参加的话,更需要这方面的练习,不然,会觉得 7 天时间太赶。


女生福利

女生除可以参加普通的 Datathon 之外,还有专属的 Women's Datathon,最近的一次是明年的 1 月 10 日,现在开始准备正是好时机。

不过,这次 Women's Datathon 是线下的,仅限美国和加拿大在读学生参加。

Datathon 通关技巧

Datathon 看起来比赛的是数据分析能力,是硬技巧,但实际上,熟悉它的规则,做好团队协作也非常重要。而且从公司文化上讲,Citadel 很注重协作。

  1. 组队时,一定要确保团队成员使用相同的编程语言,否则工作结果是没有办法聚合的。
  2. 尽管 Citadel 没有限制编程语言和工具软件,但最终提供的报告必须是 PDF, PPT 或者 HTML。并且,如果你提交的 PDF 包含公式的话,还必须提供 latex 源码。考虑到比赛只有 7 天,所以你平时就必须很熟悉这些工具软件。或者,当你组队时,就需要考虑,团队中必须包含一个有类似技能的人。
  3. Datathon 是在线的虚拟竞赛,所以,并没有现场的 presentation 环境。因此,一定要完全熟悉和遵循它的提交规范。
  4. 也正是因为上一条,Report 一定要条理清晰,一定要从局外人的身份多读几次,看看项目之外的人读了这份报告,能否得到清晰的印象。
  5. 尽可能熟悉 Jupyter Notebook 和 pandas(如果你使用 Python 的话)。这也是官方推荐,通过 Notebook 可以快速浏览竞赛所提供的数据集。

  1. 补充数据是有益的,这能反映你跳出框架自己解决问题的能力。所以平常要多熟悉一些数据集。如果一些数据要现爬的话,那需要非常熟悉爬虫。因为爬虫与后面的数据分析是串行的。在数据拿下来之前,其它工作都只能等待。
  2. Visualization 非常重要。如果你习惯使用 Python,平时可以多练习 matplotlib 和 seaborn 这两个库。

我们已经搜集了 2017 年以来所有的竞赛题目,包括数据、问题,以及一些团队提交的报告和代码。如果你需要准备 Datathon,这会是一个非常好的参考。

在这里,我们对 2024 年夏的 Datathon 做一个简单介绍。

2024 年 Summer Datathon

Problem Statement of 2024 Summer Datathon

2024 年的 Datathon 于 8 月 5 日刚刚结束。这次的题目是关于垃圾食品的,要求从提供的数据集中,得出关于美国食品加工的一些结论。除了指定数据集之外,也允许根据需要自行添加新的数据集。不过,这些数据集也提交给评委,并且不得超过 2G。

论题可以从以下三个之中选择,也可以自行拟定:


  1. 能够从肉类生产来预测餐馆的股价吗?
  2. 糖的价格会影响年青人对含糖饮料的消费吗?如果存在影响,这种影响会有地区差异吗?
  3. 肉制品生产低谷与失业人数相关吗?

有的团队已经将竞赛数据集、问题及他们的答案上传到 github,下表是我们搜集的部分 repo 列表。其中包含了一些当年夺得过名次的 solution,非常值得研究。如果你在练习中能达到此标准,那么就有较大概率在自己的比赛中取得名次。

year rank files 说明
2024 summer NA data, code, report 两个团队的报告,可运行
2024 spring NA data, code, report 目录清晰,报告质量高
2023 NA report, code
2022 3rd report, code 报告质量高,可视化效果
2021 summer 1st data, src, report 包含 airbnb 数据
2021 spring NA data,code,report
[2020] 3rd report
2018 1st data,code,report 两个团队的报告
[2017] NA report,code,data

这些竞赛的资料也都上传到了我们的 Jupyter Lab 服务器,只需要付很小的费用就可以使用。无须下载和安装,你就可以运行和调试其他人提交的答案。

75% Datathon 历年资料


如果你想立即开始练习,可以申请使用我们的课程环境,这样可以节省你下载数据、安装环境的时间。我们已帮你调通了 2024 年夏季比赛的代码,可以边运行边学习他人的代码。


视频通话也不能相信了! DEEP-LIVE-CAM 一夜爆火,伪造直播只要一张照片!

L50

让马斯克为你带货!

AI 换脸已不是什么大新闻,视频换脸也早就被实现,最早出现的就是 Deep Fake。但是,如果说直播和视频通话也能被实时换脸呢?

发布数月之久的 Deep Live Cam 最近一夜爆火,很多人注意到它伪造直播只要一张照片。

最近,博主 MatthewBerman 进行了一次测试。 他正戴着眼镜在镜头前直播,当给模型一张马斯克的照片之后,直播流立马换脸成了马斯克!就连眼镜也几乎很好地还原了!

他还测试了暗光条件和点光源的条件——常规情况下较难处理的场景,但是 Deep-Live-Cam 的表现都非常丝滑,暗光条件下的甚至更像马斯克了!

这个项目已在 Github 上开源,目前星标接近 8k。对硬件要求不高,只用 CPU 也可以运行。


快快提醒家里的老人,如果接到孩子的电话,特别是要钱的,一定要先问密码验证问题。如果老人记不住密码验证问题,也可以教老人使用先挂断,再主动拨回去的方法。

这个版本支持 Windows 和 MacOS。需要使用 Python 3.10, git,visual studio 2022 运行时(Windows)或者 onnxruntimes-silicon(MacOS Arm)和 ffmpeg。第一次运行会下载一些模型,大约 300M。


介绍一个量化库之 TSFRESH

TsFresh 是一个 Python 库,用于识别时间序列数据中的模式。tsfresh 这个词来自于 Time Series Feature extraction based on scalable hypothesis tests"。

50%

为什么要使用 tsfresh 呢?

实际上,tsfresh 并不专门为量化设计的。但由于 k 线数据具有时间序列特征,因此可以利用 tsfresh 进行一部分特征提取。在量化场景下使用 tsfresh,主要收益有:

  1. 在机器学习场景下,可能需要大量的 feature。如果这些 featrue 都通过手工来构造,不光时间成本很高,正确性也难以保证。从其文档来看,tsfresh 在算法和代码质量上应该是很优秀的。它的算法有专门的白皮书进行描述,代码也有单元测试来覆盖。所以,即使一个算法自己能实现,我也愿意依赖 tsfresh(当然要多读文档和源码)。毕竟,在 feature 阶段出了错,策略一定失败并且无处查起。
  2. 如果要提取时间序列的多个特征,手工提取就很难避免串行化执行,从而导致速度很慢。而 tsfresh 已经实现了并行化。

当然,我们也要认识到,尽管很多 awesome-quant list 列入了 tsfresh,但 tsfresh 并不是特别适合量化场景,因为金融时间序列充满了噪声。数据不是没有规律,而是这些规律隐藏在大量的随机信号中,而很多时间序列特征库,都是基于时间序列是有比较强的规律这一事实设计出来的。

所以,tsfresh 中许多 feature,实际上并没有 ta-lib 中的特征来得有效。

但如果你要运用机器学习方法,并且有大量标注数据的话(这实际上是比较有难度、很花钱的一件事),那么可以参考下面的示例,快速上手 tsfresh 加机器学习。

Medium 上有一篇文章,介绍了如何使用 tsfresh 提取特征,并使用 ARDRegression (sklearn 中的一种线性回归)来预测加密货币价格。文章附有 代码,正在探索加密货币的读者可以尝试一下。

如果你愿意看视频的话,Nils Braun在 PyCon 2017 上以tsfresh进行股票预测为例做了一次 presentation,也很有趣,注意看到最后的Q&A session。

50%

时间会证明一切!抢头财(报)就是抢头彩?!

题图:普渡大学 Engineering Fountain。普渡大学是印度安纳州的一所大学,距芝加哥 100 英里。QS 排名全球第 89 名。该校校训是 Every giant leap starts with one small step,即不积硅步,无以致千里。


Quote

青蒿一握,以水二升渍,绞取汁,尽服之。

这是古老的经验,但由于没有掌握真正的规律,这些方法时灵时不灵,并未成为抗疟的主流方法。1972 年,屠呦呦从黄蒿中分离提取青蒿素单体,找到了稳定有效的药物制备方法。1982 年,罗氏公司以薄荷醇为原料首次完成了青蒿素全合成,人类完全掌握了治疗疟疾的方法。

我喜欢这些 conventional wisdom,但要用赛先生的方法,把它们都重做一遍。

很多年前,我还没进入量化领域时,一名朋友告诉我他的赚钱之道,每年只做一次股票,就是买入最先披露年报的那家公司,赚个 20%左右就走。

他并非专业投资人,自己也还需要上班养家,所以,这个策略我只是记住了,从来没有使用过。

但是最近读到几篇论文,从实证的角度,证实了这个策略或者类似策略是有根据的。在这篇文章里,我们先介绍这些论文,然后,我还将对这个策略做一个小小的拓展,以适应国内市场。


关于财报公布时间的研究

1980年代起,William Kross 等人在财报公布时间上进行了持续研究。

1981 年,当时在普渡大学的 William Kross(他现在是纽约州立大学布法罗分校的荣休教授)发表了一篇论文,Earnings and Annoucement Time Lags,在研究 108 家公司(从 200 家初始样本中筛选),共 432 个观察值后,得出这样一个结论:

Quote

与广泛流传的共识一致,可以肯定地说,财报发布得越晚,就越有可能财报包含了不好的消息。如果实际发布的时间比预告发布时间晚一周或者更久,那么信号意义就越强烈。

此后,这方面的研究还在继续,并且越来越卷。

1999 年, Mark Bagnoi,同样也是来自普渡大学的荣休教授,发表了 A day Late, A Penny Short 这篇论文,进一步得出结论说,如果公司预告在某天发布财报,而实际上却错过了这个日期,那么平均每延迟一天,意外收益每股约降低一美分。


Bagnoi 使用了 First Call 公司的数据,数据还揭示了其他有趣的特征,比如,公司发布财报的日期越来越准确。在 1995 年,能准确发布财报的情况只有 59%,而在 1998 年,这个比例已经上升到了 80%。显然,这应该与 IT 科技的进步密切相关。

2018 年,Travis L. Johnson 在 Journal of Financial and Quantitative Analysis 发表了论文: "Time Will Tell: Information in the Timing of Scheduled Earnings News",把此项研究卷到了新高度。这篇论文共 63 页,内容十分丰富。2018 年发表以来,已经被引用 99 次,比较得学界认可。

Travis L. Johnson 来自德克萨斯的奥斯汀学院,这所学校成立于 1883 年,是德克萨斯大学系统中的旗舰机构,并享有“公立常春藤”(Public Ivy)的美誉,意味着它在学术水平和教育质量上可以与常春藤盟校相媲美。UT Austin 在多个学科领域内都享有很高的声誉,商学院和工程学院尤其知名,其中会计专业曾连续多年排名全美第一。

之前的文章主要研究的是,如果财报实际公布日期与预告日期不同,这一信息对预测未来收益有什么影响。

Johnson 这篇论文要研究的是,发布财报公布预告日期,是否本身就具有某种信号?如果确实存在这种信号的话,对投资的作用显然会更大,因为投资者可以提前反应。当然,这个研究难度就更大,所以,这篇论文的学术性比较强,比起结论来,它的研究方法更值得借鉴。

Johnson 的结论是,发布财报预告日期预示着企业的盈利消息,但市场往往会等到公告时才对其做出反应,也就是市场并不是强有效的,给我们提供了足够的时间去套利。

Info

Johnson 还不是这个系列的最终卷王。在 quant.stackexchange.com 上,有这样一个提问,如果我有过去 10 年所有盈利公告的时间,精确到毫秒,能否对下一次财报发布的具体时间做出合理预测?也许跟机器学习有关?

适应市场的策略

总结一下,这些论文说了两件事:

  1. 发布财报预告的日期,总体上是一种盈利消息的暗示。
  2. 实际发布日期越是推迟,就越可能是坏消息。

关于第 2 点,我们适当延伸一下。论文研究的是,如果公司事先给出了财报发布排期,结果没能准时发布,这就意味着搞砸了,有坏消息。

如果公司没有事先给出财报发布排期呢?

如果你不体面,制度就会让你体面。无论在美股还是 A 股,实际上都有一个预定的“发布日期”,就是不得晚于财年结束后多少天。

在 A 股,不同的板块、不同的盈利情况,预告日期不一样。有的可以不发预告,在 4 月 30 日前发布就可以了。

所以,我们把这个时间当成预告时间,那么,拖得越晚,就意味着公司治理问题越大,越是藏着坏消息;反之,发布越早,就越是好消息。

Tip

当然,财报预告也分预喜和预亏。

于是,无论是出于追逐业绩、还是追逐第一名的原因,最早发布年报预告的公司,也往往得到资金的追捧。

此外,这一策略还隐含了“择时”-- 因为最早的年报预告往往都是春节之前发布的,而据统计,A 股有 80%的概念出现春节行情。

这就是我那位朋友的策略赚钱的根本原因。

不过,我们还可以对这个策略略加修正,以提升策略的稳健性。这就是,按照申万一级行业分类,在每个行业内部,找到最先发布财报预告的公司买入,共持有 10 个行业左右。再多也没必要了,没有那么多行业赚钱。

如果有人喜欢这个策略,我就接着写如何自动获取公司财报预告。😁

老规矩,本期提及的论文,会发在群里。

量化股票投资起手式
指数增强之
指数成份股信息挖掘

周一,巴菲特二季度大幅减仓、持有现金量超历史的消息,重创了全球股市。


在感叹巴菲特的智慧之余,我们能否深入一步,向股神学点东西?

其实,巴菲特通过每一年的股东大会,已经向我们传递了相当多的投资经验和理念。

今天我们从巴菲特的一则赌约说起。这则赌约是 2006 年,巴菲特在股东大会上提出的:一只简简单单跟踪美股市场的基金,能够击败任何一位自信满满的对冲基金经理。

巴菲特是对的。

不过,我们今天不谈如何跟踪指数 -- 这是各种指增策略已经在做的事情 -- 我们来探讨如何挖掘指数成分股信息。

先看指数编制数据。我们从万得拿到了历年各大股指,上证 50,沪深 300,中证 500 和 1000 的编制目录,导出为 4 个 excel 表,如下所示:

这里展示的是上证 50 的编制数据。这是一个 3000 多行,50 列的数据。索引是交易日,单元格值则是每个交易日成分股的代码。

其它几个 excel 表也是一样的格式,只不过列数不同而已。

首先,我们分析成份股变动情况。具体做法是,选定一个指数,遍历每一行,并且与上一行进行比较,把差异记录下来进行进一步分析。这一部分代码比较简单,我们就不演示了。

然后我们发现一个重要的结论。

科创板正跑步进入宽基指数

75%

这张图显示了各个宽基指数纳入科创板个股的情况。

我们看到,中证 1000 从 2021 年 1 月起纳入科创板指数,到今年 7 月,已纳入 124 支,占比超过 10%;中证 500 也是一样,从 2021 年 1 月纳入,现在纳入 53 支,占比也超过了 10%。

中证 50 范围窄一些,对市值要求高,调入困难一点,不过到今年初,也纳入了 3 家。

联想到中国制造 2025 计划和发展新质生产力,这个结论既意外,也在情理之中。

奇怪的背离

有了第一个发现,我们自然就很好奇,科创板个股纳入指数后,表现如何?

在回答这个问题之前,作为量化科普,我们先抛出一个问题,如何评估个股纳入指数后的表现?

一般来说,可以从搜索指数、成交量来进行评估,但是这两种方法的缺陷是,与收益无关,因此不够直观。这里我们给出两种方法供探讨。

第一,取得个股纳入指数前一个月、后一个月、60 交易日、120 交易日的涨跌幅,与市场进行比较。

第二,将上述指标进行排名,查看排名的变化。以收益降序排名为例,如果排名下降,则说明个股纳入指数后,表现优于市场。

Question

按理说个股纳入指数之后的表现评估,是个很常见的事,而且也便于学术研究,应该有一些相关论文。可惜博主不够博,读论文太少,简单搜了一下,没有找到。欢迎留言指点。

按照这个思路,我们以中证 1000 为例,找出科创板个股纳入指数的日期,分别是 2020 年 12 月 14 日, 2021 年 6 月 15 日,...,2023 年 12 月 21 日等。

我们先看 2020 年 12 月 14 日,把这一天所有个股,从前一个月、到后 120 个交易日的行情数据取出,计算前一个月涨幅(prev),后一个月涨幅 ("20D")、后 60 个交易日涨幅 ("60D")、后 120 个交易日涨幅 ("120D"),分别对这些列进行排序,分别计为 rank_prev, rank_20, rank_60 和 rank_120。

我们使用的排序方法是 pandas 自带的函数:

1
2
for col in ["prev", "20", "60", "120"]:
    df[f"rank-{col}"] = df[col].rank(method='average', ascending=False)

method 的作用是,万一存在多个相同值时,让 pandas 自动选择一个排名。

这样我们就得到了在 12 月 14 日这一天,所有个股的前一个月收益和远期收益及其排名。接下来,我们用当天进入中证 1000 的科创板个股筛选出一个子表,分别计算各项均值。

在 pandas 中,从一个 DataFrame 中,选择列值在某个集合中的所有行,可以用以下语句:

1
df[df['symbol'].str.contains('|'.join(includes))]

这里假设 df 是包含所有个股的总表,includes 则是 12 月 14 日纳入中证 1000 的科创板个股。

语法的要点是,如果 pandas 的某个列是字符串类型,那么它就有 str 这个对象,通过过该对象我们可以调用很多字符串的方法,也包括这里的 contains 方法。

contains 方法支持按正则表达式匹配,因此,我们通过 join 方法,将 includes 中的所有元素用竖线(|)连接起来,作为正则表达式的匹配字符串,这样就选择出来所有新纳入中证 1000 的个股。

Tip

在正则表达式中,竖线 | 表示逻辑“或”(OR)运算。这意味着如果正则表达式中出现了 A|B,那么它会匹配 A 或者 B。

为了便于比较,我们对两个 dataframe 求均值,再进行合并,最后绘图。

1
2
3
4
5
6
7
8
9
kcb_df = df[df['symbol'].str.contains('|'.join(includes))]

df = pd.concat((df.mean(), kcb_df.mean()), axis=1)
df.columns = ["all", "kcb"]

df.T[["prev", "20", "60", "120"]].T.plot.bar()
df.T[["rank-prev", "rank-20", "rank-60", "rank-120"]].T.plot.bar()
plt.title(date)
plt.show()

这里 df 仍然是包含所有个股的总表。代码中多次使用了转置T,这是我们通过pandas内置函数,对两个系列进行比较,绘制柱状图的关键。

最终,我们得到 2020 年 12 月 14 日,中证 1000 中新纳入的科创板个股表现如下:

左图是收益对照图。从左图可以看出,在纳入指数前,这些个股的跌幅大于市场;在纳入指数之后,这些个股的表现都优于市场。

右图是排名对照图。从右图可以看出,在纳入指数后,这些个股的排名都相对于市场有所前移,也就是表现优于市场。

但是,不要被这个结论所欺骗。下图是去年底纳入中证 1000 的科创板个股表现:

这是典型的相关性不等于因果性的另一个例证。

Tip

只要有足够多的数据,我们就能把相关性和因果性区分开来。除非,这些数据都只是高维空间在低维上的投影。丢失的信息,就是丢失了。

一般来说,个股纳入指数,往往会得到被动配置,从而首先在短期收益上有所提升;其次,能进入指数的个股,往往是优质标的,所以也更能得到长线资金的青睐,这也是巴菲特敢于打赌的原因所在--无它,就是这些股票更优秀。

但是,科创板个股最主要的归类仍然是科创板,所以它们受科创板本身的走势影响更大。

不过,科创板开板已经快 5 年,今年 10 月就要庆祝讲话 5 周年。毫无疑问,随着宽基指数加快纳入科创板个股,证券市场对新质生产力的支持,正逐渐体现出来。所以,无论科创板过去的表现如何,至少,对科创板的研究已经刻不容缓了。

声明:本文只是通过数据分析,发现了一种政策趋向,结论不一定正确,也不构成任何投资建议。

[0804] QuanTide Weekly

上期重要日历提示本周为超级央行周,叠加美股科技股年报,风浪比较大。果然,这周外围股市受到严重冲击。英特尔更是一天下跌超 26%。

本周要闻回顾

  • 美国 7 月非农数据爆冷,萨姆规则被触发,美联储未就降息做出决定
  • 日本央行加息,引爆全球股市重挫,原油、美元大跌,人民币大涨近千点!
  • 金融圈打虎!董国群、陈小澎等被查
  • 英伟达 Blackwell 芯片缺陷导致量产推迟

下周看点

  • 周一财新发布 PMI,周五统计局发布 CPI/PPI。
  • 减肥双雄诺和诺德与礼来均将于下周公布季报
  • 工程机械巨头卡特彼勒和娱乐巨头迪士尼分别将于下周二和周三公布财报

本周精选

  • 二阶导因子跑出 Alpha 61.5%!(公众号付费文章)
  • TradeGPT! 快来用 ChatGPT 生成交易策略!
  • Awesome! 资产新闻情感分析新工具
  • 你们都是在哪儿下载论文的?附两个网站,速度!

要闻回顾

  • 美国 7 月非农数据爆冷,萨姆规则被触发,美联储未就降息做出决定
    美劳工部数据称,7 月美国新增就业 11.4 万,薪资增速回落至 3.6%,刷新近三年低点。同时,失业率则由 4.1%上升到 4.3%,已触发预示衰退的萨姆规则。
    在上周的美联储议息会议上,美联储决定将基准利率维持在 5.25%~5.50%的区间内。由于美联储在 8 月和 10 月没有常规议息会议,因此,9 月份的议息会议将十分关键。
    鲍威尔称,如果美国经济按照预期走势发展,美联储最早可能在 9 月份降息。关于萨姆规则,鲍威尔称知道萨姆规则,称其为统计规律。 不过也有分析认为,7 月非农数据受季节性飓风影响。
  • 日本央行加息,叠加美股科技股年报和非农数据不及预期,引爆全球股市重挫。日经周五重挫 5.81%,纳指下跌 2.43%。英特尔暴跌逾 26%,并且预计第三季度收入低于预期,将裁员 1.5 万人。其它大幅下跌科技股还有亚马逊(-8.78%)、阿斯麦(-8.41%)。原油周五下跌 3.41%,美元对六种主要货币指数下跌 1.15%,人民币上涨 873 点。
  • 金融圈打虎!原上交所副总董国群、证监会深圳监管局原党委书记、局长陈小澎等被查。海通证券公告,公司副总经理姜诚君申请辞职。
  • 英伟达 Blackwell 芯片缺陷导致量产推迟,涉及数百亿美元芯片订单。同时,英伟达还面临美国司法部反垄断调查。
  • 因全球化工龙头巴斯夫在德国的工厂突发爆炸,维生素 A 报价 2 天飙升 53%,维生素 E 报价上涨 20%。8月1日晚,巴斯夫(中国)公司对证券时报记者称,何时复产,目前无法评估和判断。

根据财联社、东方财富、证券时报等资讯汇编


二阶导因子跑出 ALPHA 61.5%!

这一期,我们将介绍一个二阶导因子。我们将演示二阶导因子的探索优化过程,进一步介绍因子分析的原理,包括:

  1. 如何让 Alphalens 使用我们指定的分层
  2. 二阶导动量因子的数学原理
  3. By quantiles or By bins, 分层究竟意味着什么

最后,我们在 A 股 40%的抽样中,得到最近半年二阶导因子的最佳参数是 5 天。在此参数下,年化 Alpha 分别是 38.4%(多空)和 61.5%(单边做多), beta 为-0.12,即收益独立于市场。

上一期我们检视了斜率因子。本质上,斜率因子是一阶导动量因子。比如,以如下方式生成的数组,它的斜率和一阶导是相等的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from scipy.stats import linregress

slope = 0.2
x = np.arange(10)
y = slope * x + 1

d1 = np.diff(y).mean()

# 如果我们通过线性回归来求斜率
alpha, beta, *_ = linregress(x, y)

print(f"slope is {slope:.1f}")
print(f"first derivative is {d1:.1f}")
print(f"slope by linear regression is {alpha:.1f}")

三项输出都是 0.2。如果我们对价格序列求二阶导作为因子,它会对未来趋势有预测作用吗?我们先看结果,再来讨论背后的原理。

二阶导动量因子检验

下面这段代码可以生成一个二阶导动量因子。


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def d2_factor(close: NDArray, win: int = 10) -> NDArray:
    n = len(close)

    d1 = close[1:]/close[:-1] - 1
    d2 = d1[1:] - d1[:-1]

    factor = move_mean(d2, win)
    # 进行左填充,使之与输入等长
    factor = np.pad(factor, (n-len(factor), 0), ...)

    return factor

注意我们用close[1:]/close[:-1]-1代替了通常意义上的一阶导,以起到某种标准化的作用。如果我们不这样做,那么高价股的因子将永远大于低价股的因子,从而永远有更高的因子暴露。

因子本身的参数是win,表示我们是在多长的时间段内计算的二阶导。

然后我们通过 Alphalens 来进行因子检验。第一次调用 Alphalens,我们按 quantiles 分层,分层数为 10。

从分层图来看,继续进行收益分析是没有意义的,我们必须先进行优化。

第一次调优

考虑到做多收益在第 8 层达到最大值,所以,我们考虑 drop 掉第 9 层和第 10 层后进行分析,看看结果如何。

通过 Alphalens 进行分析中,一般有三个步骤:


  1. 构造因子。
  2. 数据预处理,一般是通过调用 get_clean_factor_and_forward_returns 来实现的。
  3. 调用 create_full_tearsheet 来执行因子检验并输出报表。它的输入是第 2 步中的输出。

Alphalens 是在第二步实现的分层。然后它将第二步的输出,用作第 3 步的输入。

所以,我们可以在拿到第 2 步的输出之后,drop 掉第 9 层和第 10 层,然后调用 create_full_tearsheet 来进行收益分析。这样,在 Alphalens 看来,top 分层就是第 8 层,所有的分析都是在这个基础上进行。

根据 Alphalens 的官方文档,这样做是允许的。

第 2 步输出的是一个 DataFrame,它的格式如下:

所以,要 drop 掉第 9 层和第 10 层,可以这样做:

1
factor_data = factor_data[factor_data.factor_quantile <= 8]

Tip

这是本文介绍的第一个技巧。在前面的课程中,为了让 Alphalens 按照我们的意愿,按指定的对空分层进行收益分析,我们使用的是改造因子本身的方法,比这个方法在阶段上更提前一些。两个方法都可以使用,但这里的方法更简单。


这一次我们得到了令人满意的分层收益均值图,单调且递增,完全适合进一步进行因子分析。

这个图其实基本上就是完全还原了上一个图,只不过缺少第 9 层和第 10 层而已。但是,现在第 8 层就成了 top 分层,这是 Alphalens 在计算多空收益时,将要做多的一层。

Tip

由于我们在实盘交易中也一样可以 drop 掉第 9 层和第 10 层,因此这种操作是合理的。类似的手法,我们在 Alpha101 中也可以看到。

现在我们得到的 Alpha 是 23.2%(1D 年化),Beta 是-0.07,7 个月的累计收益是 11%左右。

纯多的情况

我们在之前的几期里讲过,由于制度因素,并不是所有人都能条件做空。所以我们看看纯做多的情况下,因子表现如何。

这一次,年化 Alpha 只有 17.6%,beta 为-0.6。但 7 个月的累积收益是 15%左右,还略高了一些。


条件 Alpha Beta 累计收益
多空、10 23.2% -0.07 11%
单多、10 17.6% -0.60 15%

我们对比一下前后两次的累积收益图,可以发现,多空组合绝对收益低了一些,但平抑风险的能力更强了:

多空组合

单边做多

为什么多空的 Alpha 大于纯多,多空组合的累积收益还低于单边做多?这可能是在对二阶导因子做空的过程中,有一些负面效应。一些强势股,在急杀之后(二阶导为负),往往还会有一个小反弹,如果刚好在小反弹前做空,就会带来损失。


寻找最有效的窗口

到目前为止,我们使用的都是 10 天的窗口来计算的二阶导。如果使用其它窗口呢?我们分别测试了 2、4、6、8 天的数据。现在,我们把所有的数据汇总起来:

条件 Alpha Beta 累计收益
多空、2 30.6% -0.06 15%
多空、4 35.3% -0.1 17%
多空、5 38.4% -0.12 19%
多空、6 37.3% -0.12 18%
多空、8 32.4% -0.06 14.8%
多空、10 23.2% -0.07 11%
单多、10 17.6% -0.60 15%
单多、5 61.5% -0.58 37%

看起来在 A 股市场上,二阶导动量因子使用周期为 5 时表现最好。此时如果能构建多空组合,年化 Alpha 是 38.4%,今年以来累计收益是 19%;如果只能构建单多组合,年化 Alpha 是 61.5%,今年以来累计收益是 37%。

回顾一点高中数学

前一期讨论的斜率因子(即一阶导因子)反映的是价格上涨的速度。

那么二阶导因子代表什么呢?

二阶导因子反映的是价格变化的加速度


当一阶导为正,而二阶导为负时,价格将仍然上涨,但趋势减缓,有可能出现变盘。反之亦然。下面的公式显示了一个存在二阶导的函数:

\[ y = a x^2 + b x + c \]

当 a 和 b 分别在 [-1, 0, 0, 1] 和 [10, 10, -10, -10] 之间取值时,我们就得到下面的图形:

50%

这个图说明,二阶导对证券价格运行的趋势具有修正效应。本来处于上涨趋势的品种,如果二阶导持续为负,它迟早会到达峰顶、然后转为下跌;反之,本来处于下跌趋势的品种,如果二阶导持续为正,它迟早会触及谷底,然后转为上涨。

正因为这样,与一阶导不同,二阶导有能力提前预测价格趋势的变化。它是一种反转动能

在测试中,表现最好的参数是 5 天。考虑到二阶导需要额外多两个窗口才能计算,因此我们实际上是基于过去 7 天的数据来发出交易信号。

7 天,这是上帝之数。

眼见为实

看到 38%的 Alpha,老实说有点吃惊。


这是真的吗?还是说什么地方 Pseudo-Logoi,这位谎言之神悄悄地溜了进来?

尽管可以相信 Alphalens 是品质的保证,但比起一堆统计数字,你可能更愿意相信自己的卡姿兰大眼睛。

所以,我决定把第 8 层的个股走势画出来。绘制方法是,先取出某一天(记为 T0)quantile = 8 的所有标的,然后再取出最近 8 天(截止 T0 为止)的收盘价。在绘图之前,先对收盘价起点归一化到 1。

绘图中,我们共使用了 199 个样本,代表性和稳健性都足够了。

图中的红色线是趋势线,其斜率是 0.001,表明总体上是上涨的;颜色的深浅,代表了样本的分布密度,可以看出,零线上方分布更多一些。


我很喜欢从一些股谚中寻找灵感。因为公司底色、市场机制和交易制度的不同,照搬海外股市的做法是行不通的。我们这边博弈的底色更重一点。

按理说,跟二阶导动量因子有关的股谚是黄金坑和圆弧顶或者 V 反。那么,能直观地画出来在这些标的中,有多少漂亮的黄金坑吗?

很难只用一张图、同一个参数就绘制出来:每个黄金坑的周期、深度和构造阶段等指标都是不一样的。环肥燕瘦,我们很难一笔画尽美人风姿。

By bins, or By quantiles?

在这次测试中,我们一直使用的都是 by quantiles 进行的分层,没有探索 by bins 分层。

by quantiles 是一种排名分层。这是 quantiles 的定义决定的。使用 by bins 方法,我们更关注的是因子值本身的金融含义。

比如,对 RSI 来说,它的值在 0 到 100 之间,大家会认为超过 80 的值是“超买”,低于 20 的值是“超卖”。因此,直接使用因子值是有意义的。

本文没有使用 by quantiles 方法,一方面因子值本身的信号意义可能没那么强:

我们寻找买入或者卖出信号,是根据后面是涨还是跌来验证的。但是,二阶导只能告诉我们趋势的改变方向,并不能立即决定涨跌。

因此,我们可能更应该使用它的排名来做因子,因为资金往往会寻找反转动能最强的标的。


Info

题外话:by quantiles 分层用的是排名,有点 Rank IC 的感觉,但计算收益时,又是根据因子值来进行权重分配的,则与 Ranked IC 的方法区别。

通过这些参数以及它们之间的混搭,Alphalens 赋予了我们强大的探索能力。

另一方面,我并不清楚它的最小值、最大值和分布情况,所以在实操上难以给出 bins 数组。这也是没有使用 by bins 的原因。

当然,这并非绝对。也许,有时间的话,也应该探索下 by bins 分层。

如果需要获取全部代码及进行测试,可以通过 公众号付费文章 获得运行环境、代码和数据。


TradeGPT! 快来用 CHATGPT 生成交易策略

通过 ChatGPT,我们可以基于宏观经济层面生成一些有用的交易策略。

要有效使用 ChatGPT,我们可以尝试 RISE 提问模型,即 Role, Instructions, Steps and End goal 模型。下面是一个例子:

1
2
3
4
5
6
7
Role: Assume the role of a world-class trader with expertise in trading energy futures. Specifically, you excel in trading the crack spread against refiner stocks.

Instructions: Write 5 trading ideas related to trading a crack spread position in futures against a refiner stock.

Steps: 1. Start with the composition of the crack spread. Proceed with a description of how to trade it against a refiner stock. Proceed with explaining the economic rationale why the crack spread and refiner stocks should be related. Finish with the description of a trade that the difference between the crack spread and refiner stock.

End Goal: The goal is a concise description of a trade I can execute.

最终 ChatGPT 就会给我们想要的答案:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Composition of the Crack Spread The crack spread is a trading strategy in the energy sector that captures the price
differential between crude oil and its refined products, most commonly gasoline and heating oil. To construct a simple 3:2:1 crack spread, you would buy 3 futures contracts of crude oil
and simultaneously sell 2 contracts of gasoline and 1 contract of heating oil.
Trading Crack Spread Against a Refiner Stock When trading the crack spread against a refiner stock, you are essentially comparing the
profitability of refining operations to the market's valuation of a specific refining company. Refiner stocks should theoretically benefit from a widening crack spread, as their margins
improve when the price difference between crude and its products increases.
Economic Rationale The economic rationale behind the correlation between the crack spread and refiner stocks is straightforward. Refiners purchase crude oil and sell its refined products. When the spread between the two widens, the refiner's profit margin inherently expands. Consequently, refiner stocks should move in tandem with crack spreads, although other factors such as operational efficiency, regulatory changes, and broader market sentiment can cause
divergence.
Trade Ideas
1. Long Crack Spread, Short Refiner Stock - Mean Reversion If the crack spread widens substantially but a refiner's stock hasn't reacted proportionally, you may execute a mean-reversion strategy. Long the crack spread and short the refiner stock, expecting the stock to catch up to the increased profitability suggested by the crack
spread.
1. Short Crack Spread, Long Refiner Stock - Divergence Trade If the crack spread narrows but a refiner's stock price remains resilient, it could suggest that the market is overly optimistic about the refiner's profit margins. Short the crack spread and go long on the refiner stock, anticipating that the stock will correct downward as margins
compress.
1. Long Crack Spread, Long Refiner Stock - Trend Confirmation In an environment where both the crack spread and the refiner stock are trending upward, take a long position in both to capitalize on the sustained strength in refining margins and
investor sentiment towards the sector.
1. Relative Strength Trade - Pairing Strong with Weak Identify two refiner stocks: one showing strong performance and another showing weak performance. If the crack spread is expanding, go long on the strong stock and short the
weak stock, expecting the strong stock to outperform further.
1. Arbitrage Opportunities - Geographical Spreads Some refiners have a more significant presence in specific geographic regions where the crack spread may be widening more quickly. Long the local crack spread and short a global crack spread index while simultaneously long the refiner stock most affected by the local
crack spread.
Trade Execution: Long Crack Spread, Short Refiner Stock
1. Buy 3 futures contracts of WTI crude oil.
2. Sell 2 futures contracts of RBOB gasoline.
3. Sell 1 futures contract of Heating Oil. 4. Short shares of a specific refiner stock that has not yet reacted to the widening crack
spread. This strategy aims to capture the eventual rise in the refiner stock to align more closely with the improved economics implied by a wider crack spread. Keep a close eye on market developments that might affect either the crack spread or the refiner stock and adjust your
positions accordingly.

chatGPT的输出就不翻译了。


chatGPT 生成的交易策略大意是,通过捕捉原油与其精炼产品(最常见的是汽油和取暖油)之间的价格差异,构建一个简单的 3:2:1 裂解价差,你需要买入 3 份原油期货合约,并同时卖出 2 份汽油期货合约和 1 份取暖油期货合约。

不过,要让 chatGPT 生成可执行的代码,还有很多工作要做。

本段内容来自 PyQuantNews


AWESOME! 资产新闻情感分析新工具

本段内容来自 AssetNewsSentimentAnalyzer 的使用说明

Asset News Sentiment Analyzer 最新发布到 0.1.4 版本,并加入到了 awesome-quant 推荐中。

一个简单的交易策略涉及来自该包的每日情绪分析信号,可以提供目标资产的基本市场吸引力(我们对过去 100 个市场日的商品进行了样本回测)。

这是原油的:


这是黄金的:

该Python库提供了两种复杂的工具,可通过 Google 搜索结果和在线新闻文章对金融资产和证券进行情感分析。您只需要一个 OpenAI API 密钥即可开始使用并利用此软件包提供的所有功能,即获取新闻文章、分析其内容并为投资和交易决策生成有见地的报告。

使用方法比较简单:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from asset_sentiment_analyzer import SentimentAnalyzer

# INITIALIZE THE ANALYZER
analyzer = SentimentAnalyzer(asset='Crude Oil', openai_key='your-openai-key')

# GET SENTIMENT ANALYSIS AS STRING FOR TODAY OR ANY DATE IN THE PAST (RETURNS "BULLISH", "BEARISH", OR "NEUTRAL")
sentiment = analyzer.get_sentiment(date='06-02-2024')
print(f"The sentiment for the asset is: {sentiment}")

# FETCH NEWS LINKS FOR ANY DATE WITH NEWS_DATE ARGUMENT IN MM-DD-YYYY FORMAT.
news_links = analyzer.fetch_news_links(news_date='06-02-2024')

# DISPLAY NEWS CONTENT
for url in news_links:
    print(analyzer.show_news_content(url))

# GENERATE A REPORT
report = analyzer.produce_daily_report(date='06-02-2024', max_words=300)
print(report)

你们都是在哪儿下载论文的?

上一期我们介绍了金融人最常看的顶刊。有同学问,要怎么订阅这些杂志。

其实答案只有一个,就是美金。它们的订阅地址在官网都有。

L50 我知道我们都应该尊重知识产权。在我们的周刊里,到处是关于第三方知识产权的声明。不过,作为个人研究者,订阅所有的杂志、软件和书籍也是不太现实的。我通常的做法是,先看先用,如果确实有用且需要,我会去书店、电影院、官网加倍返还。

R50这里就介绍两个免费看论文的网站。第一个是 sci-hub。它已经保存了 25million 篇论文,索引压缩包就达 478M。搜索方式是按标题和按引用。

第二个网站是 freefullpdf,它的搜索使用了 google,搜索体验会更好一些。

论如何白嫖论文

上一期我们介绍了金融人最常看的顶刊。有同学问,要怎么订阅这些杂志。

其实答案只有一个,就是美金。因为它们的订阅地址在官网都有。

养活这个世界的,是阳光、雨水和知识。我知道我们都应该尊重知识产权。不过,作为个人研究者,订阅所有的杂志、软件和书籍也是不太现实的。

我通常的做法是,先看先用,如果确实有用且需要,我会去书店、电影院、官网加倍返还。我的书也是这样,我也赞同你先免费看,只有你真正喜欢了,才去购买纸版。

这里就介绍两个免费下载论文的网站。


75%

sci-hub,它已经保存了 25million 篇论文,光是索引,压缩包就达 478M。

不过,它的搜索方式稍微有一点不好用,只能按标题和按引用,似乎不支持模糊匹配。如果你有了 DOI 标识,只是无法下载的话,会比较好用。

能找到你想要的论文吗?史上引用次数最多的论文是发表于 1951 年的一篇研究蛋白质的,标题是《Protein measurement with the folin phenol reagent》,要不您试试?

freefullpdf,如果你没有完整的论文信息,只有只言片语在手,那么试试 freefullpdf 吧。它的搜索使用了 google,提供了不错的搜索体验。

75%

动能反转:二阶导动量因子年化Alpha达到61%!

这一期,我们将介绍一个二阶导因子。我们将演示二阶导因子的探索优化过程,进一步介绍因子分析的原理,包括:

  1. 如何让 Alphalens 使用我们指定的分层
  2. 二阶导动量因子的数学原理
  3. By quantiles or By bins, 分层究竟意味着什么

最后,我们在 A 股 40%的抽样中,得到最近半年二阶导因子的最佳参数是 5 天。在此参数下,年化 Alpha 分别是 38.4%(多空)和61.5%(单边做多), beta 为-0.12,即收益独立于市场。

这是在不同周期、多空组合条件下产生的收益情况:

条件 Alpha Beta 累计收益
多空、2 30.6% -0.06 15%
多空、4 35.3% -0.1 17%
多空、5 38.4% -0.12 19%
多空、6 37.3% -0.12 18%
多空、8 32.4% -0.06 14.8%
多空、10 23.2% -0.07 11%
单多、10 17.6% -0.60 15%
单多、5 61.5% -0.58 37%

我们任意抽取一天选出的样本,绘制7天的走势平及样本均值的趋势线,验证因子分析结果可靠:

全部代码及数据购买本文后,私信留言,您将会收到一个在线网址和登录密码。这里有本文全部代码、A股2005年以来的行情数据(含分钟线)和回测引擎,支持在线运行和验证。


上一期我们检视了斜率因子。本质上,斜率因子是一阶导动量因子。比如,以如下方式生成的数组,它的斜率和一阶导是相等的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from scipy.stats import linregress

slope = 0.2
x = np.arange(10)
y = slope * x + 1

d1 = np.diff(y).mean()

# 如果我们通过线性回归来求斜率
alpha, beta, *_ = linregress(x, y)

print(f"slope is {slope:.1f}")
print(f"first derivative is {d1:.1f}")
print(f"slope by linear regression is {alpha:.1f}")

三项输出都是 0.2。如果我们对价格序列求二阶导作为因子,它会对未来趋势有预测作用吗?我们先看结果,再来讨论背后的原理。

二阶导动量因子检验

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def d2_factor(close: NDArray, win: int = 10) -> NDArray:
    n = len(close)

    d1 = close[1:]/close[:-1] - 1
    d2 = d1[1:] - d1[:-1]

    factor = move_mean(d2, win)
    # 进行左填充,使之与输入等长
    factor = np.pad(factor, (n-len(factor), 0), ...)

    return factor

上面这段代码可以生成一个二阶导动量因子。注意我们用close[1:]/close[:-1]-1代替了通常意义上的一阶导,以起到某种标准化的作用。如果我们不这样做,那么高价股的因子将永远大于低价股的因子,从而永远有更高的因子暴露。

因子本身的参数是win,表示我们是在多长的时间段内计算的二阶导。

然后我们通过 Alphalens 来进行因子检验。第一次调用 Alphalens,我们按 quantiles 分层,分层数为 10。

从分层图来看,继续进行收益分析是没有意义的,我们必须先进行优化。

第一次调优

考虑到做多收益在第 9 层达到最大值,所以,我们考虑 drop 掉第 10 层后进行分析,看看结果如何。

通过 Alphalens 进行分析中,一般有三个步骤:

  1. 构造因子。
  2. 数据预处理,一般是通过调用 get_clean_factor_and_forward_returns 来实现的。
  3. 调用 create_full_tearsheet 来执行因子检验并输出报表。它的输入是第 2 步中的输出。

Alphalens 是在第二步实现的分层。然后它将第二步的输出,用作第 3 步的输入。

所以,我们可以在拿到第 2 步的输出之后,drop 掉第 10 层,然后调用 create_full_tearsheet 来进行收益分析。这样,在 Alphalens 看来,top 分层就是第 9 层,所有的分析都是在这个基础上进行。

根据 Alphalens 的官方文档,这样做是允许的。

第 2 步输出的是一个 DataFrame,它的格式如下:

所以,要 drop 掉第 10 层,可以这样做:

1
factor_data = factor_data[factor_data.factor_quantile <= 8]

Tip

这是本文介绍的第一个技巧。在前面的课程中,为了让 Alphalens 按照我们的意愿,按指定的对空分层进行收益分析,我们使用的是改造因子本身的方法,比这个方法在阶段上更提前一些。两个方法都可以使用,但这里的方法更简单。

这一次我们得到了令人满意的分层收益均值图,单调且递增,完全适合进一步进行因子分析。


这个图其实基本上就是完全还原了上一个图,只不过缺少第 10 层而已。但是,现在第 9 层就成了 top 分层,这是 Alphalens 在计算多空收益时,将要做多的一层。

Tip

由于我们在实盘交易中也一样可以 drop 掉第 10 层,因此这种操作是合理的。类似的手法,我们在 Alpha101 中也可以看到。

现在我们得到的 Alpha 是 23.2%(1D 年化),Beta 是-0.07,7 个月的累计收益是 11%左右。

纯多的情况

我们在之前的几期里讲过,由于制度因素,并不是所有人都能条件做空。所以我们看看纯做多的情况下,因子表现如何。

这一次,年化 Alpha 只有 17.6%,beta 为-0.6。但 7 个月的累积收益是 15%左右,还略高了一些。


条件 Alpha Beta 累计收益
多空、10 23.2% -0.07 11%
单多、10 17.6% -0.60 15%

我们对比一下前后两次的累积收益图,可以发现,多空组合绝对收益低了一些,但平抑风险的能力更强了:

多空组合

单边做多


为什么多空的 Alpha 大于纯多,多空组合的累积收益还低于单边做多?这可能是在对二阶导因子做空的过程中,有一些负面效应。一些强势股,在急杀之后(二阶导为负),往往还会有一个小反弹,如果刚好在小反弹前做空,就会带来损失。

寻找最有效的窗口

到目前为止,我们使用的都是 10 天的窗口来计算的二阶导。如果使用其它窗口呢?我们分别测试了 2、4、6、8 天的数据。现在,我们把所有的数据汇总起来:

条件 Alpha Beta 累计收益
多空、2 30.6% -0.06 15%
多空、4 35.3% -0.1 17%
多空、5 38.4% -0.12 19%
多空、6 37.3% -0.12 18%
多空、8 32.4% -0.06 14.8%
多空、10 23.2% -0.07 11%
单多、10 17.6% -0.60 15%
单多、5 61.5% -0.58 37%

看起来在 A 股市场上,二阶导动量因子使用周期为 5 时表现最好。此时如果能构建多空组合,年化 Alpha 是 38.4%,今年以来累计收益是 19%;如果只能构建单多组合,年化 Alpha 是 61.5%,今年以来累计收益是 37%。

回顾一点高中数学

前一期讨论的斜率因子(即一阶导因子)反映的是价格上涨的速度。

那么二阶导因子代表什么呢?


二阶导因子反映的是价格变化的加速度。当一阶导为正,而二阶导为负时,价格将仍然上涨,但趋势减缓,有可能出现变盘。反之亦然。下面的公式显示了一个存在二阶导的函数:

\[ y = a x^2 + b x + c \]

当 a 和 b 分别在 [-1, 0, 0, 1] 和 [10, 10, -10, -10] 之间取值时,我们就得到下面的图形:

50%

这个图说明,二阶导对证券价格运行的趋势具有修正效应。本来处于上涨趋势的品种,如果二阶导持续为负,它迟早会到达峰顶、然后转为下跌;反之,本来处于下跌趋势的品种,如果二阶导持续为正,它迟早会触及谷底,然后转为上涨。

正因为这样,与一阶导不同,二阶导有能力提前预测价格趋势的变化。它是一种反转动能

在测试中,表现最好的参数是 5 天。考虑到二阶导需要额外多两个窗口才能计算,因此我们实际上是基于过去 7 天的数据来发出交易信号。

7 天,这是上帝之数。


眼见为实

看到 38%的 Alpha,老实说有点吃惊。

这是真的吗?还是说什么地方 Pseudo-Logoi,这位谎言之神悄悄地溜了进来?

尽管可以相信 Alphalens 是品质的保证,但比起一堆统计数字,你可能更愿意相信自己的卡姿兰大眼睛。

所以,我决定把第 9 层的个股走势画出来。绘制方法是,先取出某一天(记为 T0)quantile = 9 的所有标的,然后再取出最近 9 天(截止 T0 为止)的收盘价。在绘图之前,先对收盘价起点归一化到 1。

绘图中,我们共使用了199个样本,代表性和稳健性都足够了。


图中的红色线是趋势线,其斜率是 0.001,表明总体上是上涨的;颜色的深浅,代表了样本的分布密度,可以看出,零线上方分布更多一些。

我很喜欢从一些股谚中寻找灵感。因为公司底色、市场机制和交易制度的不同,照搬海外股市的做法是行不通的。我们这边博弈的底色更重一点。

按理说,跟二阶导动量因子有关的股谚是黄金坑和圆弧顶或者 V 反。那么,能直观地画出来在这些标的中,有多少漂亮的黄金坑吗?

很难只用一张图、同一个参数就绘制出来:每个黄金坑的周期、深度和构造阶段等指标都是不一样的。环肥燕瘦,我们很难一笔画尽美人风姿。

By bins, or By quantiles?

在这次测试中,我们一直使用的都是 by quantiles 进行的分层,没有探索 by bins 分层。

by quantiles 是一种排名分层。这是 quantiles 的定义决定的。使用 by bins 方法,我们更关注的是因子值本身的金融含义。

比如,对 RSI 来说,它的值在 0 到 100 之间,大家会认为超过 80 的值是“超买”,低于 20 的值是“超卖”。因此,直接使用因子值是有意义的。

本文没有使用 by quantiles 方法,一方面因子值本身的信号意义可能没那么强:

我们寻找买入或者卖出信号,是根据后面是涨还是跌来验证的。但是,二阶导只能告诉我们趋势的改变方向,并不能立即决定涨跌。

因此,我们可能更应该使用它的排名来做因子,因为资金往往会寻找反转动能最强的标的。


Info

题外话:by quantiles 分层用的是排名,有点 Rank IC 的感觉,但计算收益时,又是根据因子值来进行权重分配的,则与 Ranked IC 的方法区别。

通过这些参数以及它们之间的混搭,Alphalens 赋予了我们强大的探索能力。

另一方面,我并不清楚它的最小值、最大值和分布情况,所以在实操上难以给出bins数组。这也是没有使用 by bins 的原因。

当然,这并非绝对。也许,有时间的话,也应该探索下 by bins 分层。

7月:斜率动量因子表现回顾

斜率因子是动量因子中的一种,它由Andreas F. Clenow 首先发表在Stocks on the Move: Beating the Market with Hedge Fund Momentum Strategy一书中。

这个因子比起卡哈特的动量因子更符合人的直觉,特别是喜欢看K线的投资者,因此也得到了很多人的喜爱。其实现在Quantopian和QuantConnect网站上都有文章讨论。

题图:Andreas Clenow的著作: Stock on the Move 封面


Tip

我们简单回顾一下Mark Carhart提出的动量因子,它是计算单个股票过去一年的回报率,排除最近一个月数据(以防股价操纵),再按回报率排序,取前10%的股票作为买入信号,末尾10%的股票作为卖出信号。

在Andreas Clenow的策略中,他使用了过去90天的年化指数的回归斜率作为动量因子。由于信号只响应过去90天的数据,因此,信号就比卡哈特的动量因子更灵敏一些。

不过,我们今天测试的因子,是用过去10天的回归斜率作为动量因子。主要目标是尝试下新的可能性,也是考虑到在A股,动量因子的半衰期一般比较短的缘故。

我们的计算方法如以下代码所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def moving_slope(close: NDArray, win:int, *args):
    # 创建滑动窗口的视图
    shape = (win, close.size - win + 1)
    strides = (close.itemsize, close.itemsize)
    cw = np.lib.stride_tricks.as_strided(close, 
                                         shape=shape, 
                                         strides=strides)

    # 对每个窗口应用linregress,获取斜率
    x = np.arrange(win)
    slopes = np.apply_along_axis(lambda y: linregress(x, y)[0],
                                  axis=0, arr=cw)

    return slopes

测试参数如下:随机抽取2000支,从今年的1月4日,测试到7月31日,计算斜率时,使用过去10天的收盘价;计算收益时,使用开盘价,从次日起。


因子分层如下:

分层收益均值图如下:

显然,10期的斜率因子成了反向指标,也就是短期上涨越快,买入后亏损越多。


既然如此,我们就取斜率因子的负数作为新的因子,再运行一次:

理所当然,这个图只是前面的图的镜像。我们来看看收益:

7个月的累积收益接近15%了,最大回撤5%左右,在今年来看,表现还可以。

Tip

上一篇RSI的因子测试中,我们也对因子构成做了一些微调。有同学认为,微调之后,数据变好,这是过拟合了。今天写这个因子时,想起来在Alpha101中,他们抛弃掉了动量最大前n%的因子,这也是一种修正。警惕过拟合是对的,但不是数据一变好就是过拟合。


再深入到分层累积收益:

可以看出,因子的稳定性比较好,期间没有发生明显的风格转换的情况。

当然这个因子要投入实战的话,可能不适合个人和中小机构。因为从分层图来看,它的收益主要是由做空产生的。

如果我们没有机会做空,因子的表现又将如何?下图是纯多情况下的收益:

这个表现并不出人意料。在2月有一个强反弹,在此期间,因子的表现不错。但随后市场越走越弱,动量因子的半衰期越来越短,单多收益就一路走低。


L50

前天,七八月之交,A股出现一轮牛市,跨越两个月,长达86400秒。随后再次进入休眠状态。这个现象,也许不能用今天的介绍的动量因子来预测,但动量因子表现如此之弱,却能在一定程度上,说明为什么连续上涨未能出现。

另一个结论,正是因为做空的收益比较确定,所以易跌难涨。方主席下岗了,看看后面做空机制上能否有所变化。毕竟,能做空的机构也只是少数。制度应该对所有参与者都公平。

左图是Andreas Clenow的著作,Stocks on the Move: Beating the Market with Hedge Fund Momentum Strategy。Andreas Clenow是一位瑞典裔瑞士籍作家、资产管理人及企业家,现居于苏黎世,在一家家族办公室担任首席投资官。在其辉煌的职业生涯中,他曾是一名科技创业者、金融顾问、对冲基金经理、金融工程师、量化交易员、财务顾问、董事会成员,以及企业中层管理官僚。

在这本书中,Clenow详细解释了动量策略的原理,即买入过去表现优秀的股票,卖出或做空表现不佳的股票,利用市场趋势的持续性来获利。书中对比了技术分析和基本面分析在动量策略中的应用,以及如何结合两者的优势来提高交易效果。

当我在星巴克连上家里的服务器,IPV6,你是值得的

我们的课程环境是构建在一个256GB内存,192核CPU的集群上,学员可以通过浏览器,输入地址访问。要在阿某云上租这样一个服务器,价格并不便宜。所以,这些服务器一直放在公司里,创业期间,公司也就是租的民用宽带,没有公网IP,所以,在阿某云上租了个机器,做的端口转发。

有了这个端口转发,也就把VPN装上了,这样一来,也可以在回家或者外出时,连回公司办公。但最近VPN不知为啥,坏了。

刚好今年国家政策在推IPV6。于是决定试一把。IPV6最大的优点,就是地址管够,所以,每一台设备都可以获得一个公有的IPV6地址。

花了4小时左右,把IPV4和IPV6都弄通了,并且增加了免费的DDNS,这样,就可以在星巴克办公了。

意外的惊喜,我之前开的阿某云服务器带宽是5M。用了IPV6后,直连的效果真棒,现在我们的教学网站是秒开了。

Info

如果你的路由器支持IPv6桥接模式(一般在网络、或者Wan设置里),那么可能直接打开它、打开光猫中的IPv6就ok了。直接跳转到第3节检查是否获得了IPV6地址。

光猫改桥接

IPV6地址也有公网和私域之分。公网地址以2开头,私域地址以F开头。如果你的设备用的是F开头的IPV6,仍然是不可通的。

新装的宽带,民用的基本上都默认开通了IPV6。我们要做的是,其实是如何打通光猫与内部路由器之间的IPV6屏蔽。

这主要是,

  1. 你的路由器太旧,不支持IPV6
  2. 路由器设置没有支持IPV6

首先,我们将光猫的连接方式由PPPoE改成桥接模式。这一步完成后,光猫就不再担任路由器的功能,因此拨号的工作也交给你自己的路由器。

Info

这一步需要超级管理员密码,跟负责片区的宽带师傅要,只要你能证明自己懂网络,他们一定会给。

在网络配置中,找到宽带设置,找到最符合当前网络设置的那一项。比如,在我这里,这一项如下图所示:

我们要修改的正是红框内的连接,而不是其它连接。当前它的连接方式是PPPoE,一般来说,其它模式,比如桥接,也会在这个单选框下。另外,IP协议版本这里要注意,一定要选择IPv4/IPv6。

在同一个对话框中,还显示了PPPoE的账号。我们必须把这个账号及其密码记录下来。因为我们改为桥接模式之后,建立连接的任务将由你的路由器来完成,路由器需要知道这个账号。

密码是以mask的方式显示的。如果你不知道密码,可以在chrome中打开开发者模式,找到密码框,将它的type="password"去掉,这样密码就还原显示了。

下图就是我们修改后的配置:

注意核心点就是IP协议版本、模式,其它保持不变即可。

配置路由器

Notice

注意路由器与光猫的物理连接。要用线缆将路由器的wan口连接到光猫的lan口,而不是lan对lan。如果是后者,那么路由器将无法进行拨号。

路由器的配置中,我们要调整wan与lan的设置。有的路由器本身有IPv6桥接模式,在将光猫改为桥接之后,我们是要禁掉这里的格桥接模式的。

在WAN设置中,我们将连接方式改为PPPoE,并填写光猫的IP地址、用户名和密码。如果它同时提供了IPv4和IPv6两个选项,我们在IPv6中,选择启用,并且设置为复用IPv4拨号线路即可。其它的都保持默认。

再转到LAN设置,我们需要对IPv6进行一些设置。

我们还要开启DHCPv6服务,并设置IPv6地址池,重点是设置DNS:

测试是否获得公网IPv6地址

ipw.cn网站提供了测试服务。喜欢命令行的可以使用以下命令:

1
curl 6.ipw.cn

如果你的机器有了IPv6地址,它就会返回你的IPv6地址。再检查如果它是以2开头的,则说明是公网IP。如果是以F开头的,那你的设置仍然是在私域。

通过下面的命令检测IPv4是否仍然工作:

1
curl 4.ipw.cn
这会返回你的IPv4地址。

如果不习惯使用命令行,也可以登录ipw.cn的网站。它将返回你当前的IP地址。如果使用了IPv6,它将提示IPv6优先,否则,就是配置不成功。

配置DDNS

尽管IPv6地址是公网地址,而且很充裕,但也不排除ISP有时候会更换你的IPv6地址。因此,我们需要DDNS服务,及时更新变化后的IP。平常只使用域名来访问。

最好用的DDNS服务是Cloudflare。要做到这一点,首先,你要在Cloudflare上已有托管的域名。然后,在dashboard中,申请一个API token。

DDNS使用go-ddns的容器就好。每一个需要在外网能独立访问的设备都需要安装。

1
sudo docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go

然后打开 http://ip:9876 更新配置即可。由于于API token,所以不需要在Cloudflare上事先创建子域名。直接在这里的界面输入子域名,go-ddns会自动帮你创建。

设置完成后,看一下日志就好了。

注意事项

不要通过域名暴露你的http服务。有可能被ISP封。据说使用https服务和高于40000的端口会降低风险。