原创文章第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倍目标一定让你非常兴奋,你觉得七年积累500万的可投资本金也就那样,不足以让你自由的话,那么5000万呢?
其次,10倍目标,按你当前的路径,做事的节奏几乎是无法完成的。
这时候,应该开创性地去想、去提升、去行动。
02
昨天翻开纳瓦尔宝典,说“人生的履历是由于痛苦和磨难构建的”。
有一点道理。
也许你有数不清的乘飞机的经历,但最“难以忘记”的一定是可能因为风雪误机,或者转机时,后续航班已经飞走的经历。
当你老了,回首往事的事情。你如何评价这一生?你后悔吗?
肯定,很多人都会说,当年大胆一点就好了。
人就活一次,没什么不了的。大胆一点,去体验,去折腾。
最大的恐惧,其实是恐惧本身。
不念过往,不惧未来,活在当下——不是说你要忘记过去,过去当然要反思,要总结,但不要后悔;未来也不是说不要规划,不未雨绸缪,而是不要提前担忧还没有发生的事情。——这样才能很好地活在当下,我们真正拥有的只有今天。
历史文章: