量化私募公司的多因子构建方案(附python代码)

原创文章第600篇,专注“AI量化投资、世界运行的规律、个人成长与财富自由"。

昨天代码已经发布了,大家可以前往下载和更新:

代码发布:quantlabv5.3,可转债所有数据及双低、动量因子策略,单因子分析框架

基本数据的自动更新要提上日程。

这是多因子挖掘的基础工作——这个工作比较耗时,希望帮助大家完成,大家应该把时间花在有用的因子和策略构建上。

基础数据是指用于因子计算的价量数据、基本面数据,或者其他可获得的另类数据都可以。——当然它们本身也是因子。

而衍生数据是基于上述数据,通过因子表达式复合计算而来。比如双低=收盘价+转股溢价率*100,双低因子就是转债价格和转股溢价率的复合,当然转股溢价率本身又是一个复合因子。

我们首先需要构建基本数据,然后提供因子表达式即可。

价量因子数据准备最简单,只需要OHLCV就可以了,而且多数接口都可以一次性提供这样的日频数据。

因子存储有两种模式:宽表模式和单值模式

这是宽表模式,这是最传统的,写入快,就是对应一个dataframe,可以直接写入表中。

图片

下面是单值模式,自己做列存。

图片

  • 十分钟级一万个因子数据场景下,宽表模式的因子写入速度高于单值模型。

  • 因子数据查询方面,单值模式优于宽表模式。

  • 因子数据运维方面(包含新增因子、更新和删除因子),单值模式的效率远远优于宽表模式。

综合考虑,在高频多因子的场景下,合理设计存储方案的单值模式是最好的解决方案。

基础数据获取:

class Basic:
    def __init__(self, tb_name, service: DataService):
        self.tb_name = tb_name
        self.service = service

    def build(self):
        df = self.service.get_basic_df()
        df['_id'] = df['symbol']
        mongo_utils.write_df(self.tb_name, df, drop_tb_if_exist=True)

这是一个通用的basic构建类,从接口处获得列表后,直接存入mongo,若表已存在,先drop掉。

我们仅保留近十年发行的转债即可:

class BondDataService(DataService):
    def get_basic_df(self):
        df = api_ts.get_bonds_df()
        df = df[df['list_date'] >= '2015-01-01']
        return df

图片

一共880支。

下面的代码构建时间序列,比如量价数据,基本面指标如PE/PB

class Quotes:
    def __init__(self, tb_basic, tb_quotes, service: DataService, symbol_col='symbol'):
        self.tb_basic = tb_basic
        self.tb_quotes = tb_quotes
        self.service = service
        self.symbol_col = symbol_col

    def query_basic(self, query={}):
        return mongo_utils.get_db()[self.tb_basic].find(query)

    def query_start_date(self, symbol):
        start_date = ''
        items = mongo_utils.get_db()[self.tb_quotes].find({'symbol': symbol}).sort('date', pymongo.DESCENDING).limit(
            1)
        items = list(items)
        if len(items) == 0:
            print('不存在{}记录'.format(symbol))
            start_date = '20050101'
        else:
            start_date = items[0]['date']
            print('{}从{}更新'.format(symbol, start_date))
        return start_date

    def build_symbol_quotes(self, symbol):
        start_date = self.query_start_date(symbol)
        return self.service.get_quotes_df(symbol, start_date)

    def build(self):
        items = self.query_basic()
        for item in tqdm(items):
            df = self.build_symbol_quotes(item[self.symbol_col])
            df['_id'] = df['symbol'] + '_' + df['date']
            mongo_utils.write_df(self.tb_quotes, df)

图片

2015年以来,上市的可转债历史日线数据——一共50多万条,量级并不大。

图片

关于星球的工作——帮忙一些同学以交易为生

600天,几乎是日更,而且需要尽量写出内容,写出干货,交付代码。

并不容易,这里有大量的业余时间,周末时间,陪孩子的时间。

但收获了星球会员的支持,收获了公众号粉丝的支持,这里非常感恩。

如果大家的支持,确实很难坚持下去。

从想做一件事,有时候也会遇到瓶颈,遇到不知道该往哪里走的时候。

但想到承诺与责任,幸运的是一直坚持到今天。

现在更有信心可以一直陪大家走下去。——官网(ailabx.com)和论坛(bbs.ailabx.com)也基本成型了,大家常见的问题、一些入门的教程,代码怎么用。后续包括一些量化学习的路径,电子书、研报都会发布上去。

群公告上也加上了代码新手入门的详细教程(几乎是手把手),希望对大家有所帮助。

吾日三省吾身

01

以交易为生,定一个小目标|10倍法则:思考与行动

——把你的目标设定为预期的十倍,然后付出十倍的思考和行动。

10倍目标一定让你非常兴奋,你觉得七年积累500万的可投资本金也就那样,不足以让你自由的话,那么5000万呢?

其次,10倍目标,按你当前的路径,做事的节奏几乎是无法完成的。

这时候,应该开创性地去想、去提升、去行动。

02

昨天翻开纳瓦尔宝典,说“人生的履历是由于痛苦和磨难构建的”。

有一点道理。

也许你有数不清的乘飞机的经历,但最“难以忘记”的一定是可能因为风雪误机,或者转机时,后续航班已经飞走的经历。

当你老了,回首往事的事情。你如何评价这一生?你后悔吗?

肯定,很多人都会说,当年大胆一点就好了。

人就活一次,没什么不了的。大胆一点,去体验,去折腾。

最大的恐惧,其实是恐惧本身。

不念过往,不惧未来,活在当下——不是说你要忘记过去,过去当然要反思,要总结,但不要后悔;未来也不是说不要规划,不未雨绸缪,而是不要提前担忧还没有发生的事情。——这样才能很好地活在当下,我们真正拥有的只有今天。

历史文章:

代码发布:quantlabv5.3,可转债所有数据及双低、动量因子策略,单因子分析框架

AI量化实验室——2024量化投资的星辰大海

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI量化投资实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值