尽管bt框架内置了不少算子,但扩展自己的算子,才是我们掌握了这个框架的标志。这意味着我们真正可以驾驭这个框架,实现咱们想实现的功能。
实现算子并不复杂,但要设计出一个良好的可复用的算子,还是需要花点心思。
框架内置的SelectMomentum算子,按N天的收益率(动量)对标的进行从大到小排序,取前N个。这个算子在轮动策略中非常有效。
在这个不够灵活,我们希望可以传入任何信号(Siganl),都可以进行排序。
我们看下源代码里SelectMomentum的实现:
它继承了AlgoStack,然后初始化的时候,传入StatTotalReturn和SelectN两个算子,搞定。
这就是代码复用的力量。
class SelectHolding(bt.Algo):
def __init__(self):
pass
def __call__(self, target):
holding = []
if target.now in target.positions.index:
sig = target.positions.loc[target.now] > 0
se_pos = sig[sig == True].index # noqa: E712
universe = target.universe.loc[target.now, list(se_pos)].dropna()
holding = list(universe[universe > 0].index)
if 'selected' not in target.temp.keys():
return True # 如果前而有selected,则加上当前持仓。 selected = target.temp['selected'] selected = list(set(selected + holding)) target.temp['selected'] = selected return True
其中StatTotalReturn这个算子计算当前所有标的收益率,缓存在target.temp[‘stat’]中;SelectN读取这个stat中的值,对标的进行排序,取最大的前N个。
class SelectMomentum(AlgoStack): def __init__( self, n, lookback=pd.DateOffset(months=3), lag=pd.DateOffset(days=0), sort_descending=True, all_or_none=False, ): super(SelectMomentum, self).__init__( StatTotalReturn(lookback=lookback, lag=lag), SelectN(n=n, sort_descending=sort_descending, all_or_none=all_or_none), )
一个极简的,根据信号从大到小排序的算子实现如下:
Signal可以是信号的dataframe,也可以是变量字符串;K就是取前N个。
class SelectTopK(bt.AlgoStack):
def __init__(self, signal, K):
super(SelectTopK, self).__init__(bt.algos.SetStat(signal), bt.algos.SelectN(K))
代码同步在星球下,请大家自取:
吾日三省吾身
昨天的文章,几个反思点: 生产有长期价值的产品。
这个不确定的时代,你无法规划长远,但不意味着你无所作为。而是说计划赶不上变化,临渊羡鱼,不如退而结网,当下看到——有生产长期价值产品的机会,干就是了。——也许这就是局部最优,但没关系,没有人真的可以看到所谓的全局最优。——机器学习的搜索算法也是如此。
若你仍想思考更长期的未来。
不是你想过什么样的生活,这个太容易,太廉价,谁不想权倾天下,富可敌国?周游列国,结交名仕。
把“我想要”,换成“我能给”。
芒格说,“得到一件想要的东西最好的办法,就是想办法配得上它”。
你要想,什么样的能力和付出,配过这样的生活。
这个社会,本质就是价值交换,你想得到什么,取决你能拿什么东西来换。
80%的精力做当下最优,能产出阶段产品的事情。
20%的精力随兴趣漫游,尝试各种新事情,积极拥抱各种可能性。
历史文章:
量化投资系列第2篇,以bt框架为基础,简单明了的讲明白,如何快速开发一个策略。
策略开发通常是源自我们的一些想法和思路,使用回测框架去验证它。
而当一个策略逻辑比较复杂时,新手常常分不清,到底是策略代码有问题,还是策略本身不可行。
因此,如果一个框架可以尽量减少这些策略开发中的“模板化”的代码,把常用的模板都实现好,让我们实现策略就像“搭乐高”一样轻松愉悦。
这就是我选择bt框架的核心原因:“积木式”,低代码的策略开发模式。
下面是常见python生态一些开源框架的对比:
框架名称 |
功能 |
特点 |
优势 |
劣势 |
Backtrader |
提供量化回测和实盘交易的Python框架,支持股票、期货、期权、加密货币等资产。 |
模块化设计,丰富的指标库,支持多周期回测,数据源灵活。号称“最强的单机版回测框架”,国内有不少机构用户。 |
功能完善,支持多品种、多策略、多周期回测;社区活跃,文档详实。 |
代码复杂,使用元类和抽象基类,对新手不太友好;国内实盘交易支持不足。 |
PyAlgoTrade |
支持策略回测和实时交易,提供统计和分析功能。 |
事件驱动模型,易于使用,支持多种数据源。目前项目已经不维护了。 |
易于上手,策略编写简单;支持实盘交易和参数优化。 |
社区和文档支持不如Backtrader;高级功能较少。 |
VectorBT |
允许用户自定义输入和输出,支持多种市场和交易规则。 | 高灵活性和扩展性,适用于金融数据预处理和策略开发。主要特点是向量化回测,速度化。 | 支持复杂的策略和数据分析;可以与其他Python库协同工作。 | 相对较新,社区和文档可能不如其他框架成熟。 |
Qlib | 是一个开源的量化投资平台,提供数据、回测、实盘交易等功能。 | 集成多种量化策略,支持机器学习。 | 强大的数据处理能力;集成多种量化和机器学习策略。 | 适用于AI驱动的量化,对规则策略的开发支持相对较少。 |
Backtesting.py | 提供简洁的API进行策略回测。 | 简洁易用,快速上手。 | API简洁,容易理解和使用。支持参数优化。 | 只支持单标的回测。 |
吾日三省吾身
这两天有事没有写文,但思考没有停止。
我们不能总是陷于鸡血,规划,不了了之,再次规划的空循环。
长期规划是伪命题,《重来》里说“计划等于瞎扯”,除了写一些没用,再了不会命出来看的文档之外,没有任何作用。
话有点激进,但在这个越发不确定的时代,着实如此。
首先,所谓的长期规划,受限于我们的认知。
还记得你小时候的命题作文吗?长大后你想成为什么样的人?——多数同学都是医生,科学家,航天员之类的。
长大后,都是普通打工人。
为什么,这是认知受限,我们小时候,在课本里,媒体看老是看到这几个身份被歌颂,但这些岗位具体做什么,需要什么条件,你是否有能力,以及是否真的喜欢,未可知。
随着我们长大,生活阅历丰富,积累了一些东西之后,当然认知还是持续在迭代。比如20年前,产品经理是是个新兴岗位,在大学里,我们就是埋头编程,以为程序员可以决定一个产品的方向,到了大厂才发现,程序员就是“码农”为主。
年轻时还当咨询师,想当基金经理。。。
除了个人认知持续进化之外,外部环境也在持续变化。比如蔡磊,他的人生规划里,显然没有医学和渐冻症,但正值壮年的他,就遇到了,人生发现了180度大转度。。。
所以认知局限叠加外部变化,注定了当前如此不确定的,目标就是动态演绎出来的,而非规划。
那你也许要问,那人生就毫无计划,随波逐流了吗?
当然不是。
长期目标可以确定了,比如你想成为什么样的人,过什么样的生活。这种模糊的目标是确定的。但路径是很难提前规划好的。
你想财富自由,那指定原则就是——你要持续生产有长期价值的产品。
这句话有几个关键词: 生产,长期价值和产品。
你再努力,读很多书,你不生产,就无法变现。你要从消费者,变为生产者,这才是可能财富自由的底层逻辑。
长期价值,就是这个东西需要有生命力,比如有人写文,追热点,搞垃圾流量,这就没有长期价值。
最后一个就是产品化。你的作品需要有完成度,能解决一个特定的问题,最好的,人们可以为之付费。
这个指导原则对于一个希望自己努力,实现财富自由的人是通用的,它不是规划,而是指导思路。
那具体我们应该怎么做呢?
当下,你能生产的,最想做的事,拟定一个100天可以完成的小目标即可。
比如100天,可以写一本书(一天2000字,1000天20万字),可以发布一软件产品等等。
不需要详细的计划,把目标转为系统——每天做的事,比如每天2000字,差不多就是一本书。每天一个功能点,那100天基本可以交付一个小产品。
最后,这些事情应该只占你每天精力的80%,还需要有20%的时间,去尝试,去探索新的东西,能人生更多的可能性。
综上,就是“但行好事,莫问前程”。
星球在持续更新:AI量化:从入门到精通(GPT时代的AI量化投资。含 系统代码与数据集)
历史文章:
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103403
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!