fastapi+mongo+qlib:体系化构建AI量化投研平台
百天计划之第34篇,关于“AI量化投资研究平台”建设。
从今天开始要开始一条主线——就是开始搭建整个投研平台。
如果说8月开始是知识点的梳理,一些基础技术的准备(以qlib和机器学习为核心),9月开始重点是“以解决真正的投资决策问题”为目标。
切入点是可转债。
当下A股市场持续下行,在市场总体下行的时候,讲真的策略不是最重要的。
对于新手而言,可转债和优秀指数基金,永远是最好的标的,会让你感受到,投资其实未必有那么大的风险(提示:投资有风险)。
01 架构
如下是一个极简的AI投研架构,极简意味着非核心部件都采用最简单的组件。
定时任务没有使用dagster或者airflow,因为这意味着需要引入一套全新的技术栈,需要人力云独立运维,我们使用fastapi内置的异步task。
持久化的中间件选mongo为主,并兼容qlib数据库,便于查询与并行计算。
后端使用fastapi——由于要深度使用mongo,则弃用django,而在flask与fastapi之间,考虑到我们使用api的场景偏多,考虑对api更加友好的fastapi框架,性能也会更好。
02 价值点
重点之核心在于“为谁解决什么问题”。
“半个成品远胜于一个半成品”。
目标远大很好,但饭要一口口吃,月亮虽好,六便士也很重要。
投研平台价值点就是辅助用户投资决策效率,提升胜率。
面对可转债400多支,如何快速纵览数据历史,有什么规律,方便我们去分析。内置量化好的指标,对全市场进行透视,挖掘,聚类,排序。在此基础上定制一些策略,回测并归因等等。
总之,面对实用编程。
03 后端基础框架fastapi
fastapi是一个现代,异步python框架,官网如下:
https://fastapi.tiangolo.com/zh/
安装非常轻量:
pip install fastapi
pip install "uvicorn[standard]" ——安装运行的服务器。
hello FastApi:
from typing import Union from fastapi import FastAPIapp = FastAPI()@app.get("/") def read_root():return {"Hello": "基于Fastapi的AI量化投研平台!"}
是不是非常简单,大家可能会想起Flask,是的。
Fastapi还内置精美的swagger UI,
让我们调试接口非常方便,这也是我优选Fastapi框架的原因之一。
04 基于FastApi的定时任务
传统的定时任务一般是apscheduler,它功能强大,但说实话,并不好用。
我们的定时任务其实比较简单,就是定时去做一些事情,不需要特别精确,一般就是收盘后要去更新数据,然后做一些指标的预计算,或者数据同步之类的操作。
fastapi本身是异步框架,内置了定时任务的功能。
import asyncio from loguru import logger from functools import wraps from asyncio import ensure_future from starlette.concurrency import run_in_threadpool from typing import Any, Callable, Coroutine, Optional, UnionNoArgsNoReturnFuncT = Callable[[], None] NoArgsNoReturnAsyncFuncT = Callable[[], Coroutine[Any, Any, None]] NoArgsNoReturnDecorator = Callable[[Union[NoArgsNoReturnFuncT, NoArgsNoReturnAsyncFuncT]],NoArgsNoReturnAsyncFuncT ]def repeat_task(*,seconds: float,wait_first: bool = False,raise_exceptions: bool = False,max_repetitions: Optional[int] = None, ) -> NoArgsNoReturnDecorator:'''返回一个修饰器, 该修饰器修改函数, 使其在首次调用后定期重复执行.其装饰的函数不能接受任何参数并且不返回任何内容.参数:seconds: float等待重复执行的秒数 wait_first: bool (默认 False)如果为 True, 该函数将在第一次调用前先等待一个周期.raise_exceptions: bool (默认 False)如果为 True, 该函数抛出的错误将被再次抛出到事件循环的异常处理程序.max_repetitions: Optional[int] (默认 None)该函数重复执行的最大次数, 如果为 None, 则该函数将永远重复.'''def decorator(func: Union[NoArgsNoReturnAsyncFuncT, NoArgsNoReturnFuncT]) -> NoArgsNoReturnAsyncFuncT:'''将修饰函数转换为自身重复且定期调用的版本.'''is_coroutine = asyncio.iscoroutinefunction(func)had_run = False@wraps(func)async def wrapped() -> None:nonlocal had_runif had_run:returnhad_run = Truerepetitions = 0async def loop() -> None:nonlocal repetitionsif wait_first:await asyncio.sleep(seconds)while max_repetitions is None or repetitions < max_repetitions:try:if is_coroutine:# 以协程方式执行await func() # type: ignoreelse:# 以线程方式执行await run_in_threadpool(func)repetitions += 1except Exception as exc:logger.error(f'执行重复任务异常: {exc}')if raise_exceptions:raise excawait asyncio.sleep(seconds)ensure_future(loop())return wrappedreturn decorator
我们基于异步功能来实现一个装饰器repeat_task。
一次封装,再使用就无比简洁了:
@app.on_event('startup') @repeat_task(seconds=6, wait_first=True) def repeat_task_aggregate_request_records() -> None:logger.info('触发重复任务: 聚合请求记录')
05 可转债数据
我们需要规划一下数据库表名字:
债券:bond_, 股票:stock_, 基金:fund_,不带复数s。
基础信息:_basic, 日线:_daily,财务指标 _fin
一般而言,任何一个交易品种,我们都需要先入库两种数据:
一是基础信息列表,二是交易日频数据。
基本信息只需要构建一次,若有变动不定期手动刷新即可:
def build_cb_basic():df = get_cb_basic()df['_id'] = df['ts_code']write_df('bond_basic', df, drop_tb_if_exist=True)
可以看出,一共A股历史上发行了799支可转债,目前可交易的400多支。
交易数据,这是需要每天收盘后去增量更新的,我们的逻辑是如果没有数据,从19900101开始读,如果有数据,则从当前日期增量更新即可。
mongo的优点可以自动忽略_id相同的行,所以特别方便。
def update_all_bond_daily():# 获取所有列表,有日期,从最近的日期开始读。items = list(get_db()['bond_basic'].find({}, {'ts_code': 1, '_id': 0}))if items and len(items) == 0:logger.error("读可转债列表为空")returnfor i, item in enumerate(items):code = item['ts_code']logger.debug("{}-{}-{}".format(i, code, i / len(items)))date = get_daily_last_date(code)df = get_bond_daily(code, date)df['_id'] = df['ts_code'] + '_' + df['trade_date']print(df.tail())write_df('bond_daily', df)break
小结一下:
我们开始体系化构建整体平台。
后端框架是fastapi,从fastapi内置的定时任务开始,构建可转债的基本数据和日频数据。
qlib因子分析之alphalens源码解读
基于alphalens对qlib的alpha158做单因子分析
人生B计划,不确定时代的应对之道
飞狐,科技公司CTO,用AI技术做量化投资;以投资视角观历史,解时事;专注个人成长与财富自由。
fastapi+mongo+qlib:体系化构建AI量化投研平台相关推荐
- 焱融全闪存储轻松构建百亿私募量化投研平台
量化业务背景 量化金融指依托金融大数据.金融科技和智能金融的技术进展,通过数量化方式及计算机程序发出交易指令,以获取稳定收益为目的的金融投资方式,在海外的发展已有几十年的历史,其投资业绩稳定,市场规模 ...
- 乾象投资:基于JuiceFS 构建云上量化投研平台
背景 乾象投资 Metabit Trading 成立于2018年,是一家以人工智能为核心的科技型量化投资公司.核心成员毕业于 Stanford.CMU.清北等高校.目前,管理规模已突破 30 亿元人民 ...
- 微矿Qlib:业内首个AI量化投资开源平台
近期,微软亚洲研究院正式发布了 AI 量化投资开源平台"微矿 Qlib".这是微软亚洲研究院成立"创新汇"三年以来,在与金融行业的成员企业合作研究的基础之上,打 ...
- AI量化投资开源平台——Qlib(微矿)的学习使用笔记(随缘更新)
零.Qlib的简介 可以查看以下链接了解Qlib的功能以及结构框架. 微矿Qlib:业内首个AI量化投资开源平台 官方GitHub仓库 一.Qlib环境安装 安装过程非常艰难,主要参考了以下资料,在此 ...
- 【量化交易】如何搭建本地化量化投研软件系统
以下内容来自知乎链接: https://zhuanlan.zhihu.com/p/571485296 作者:海滨 已获得作者同意转载. 这篇文章希望能让大家了解到标准的量化交易软件有那些及各自特点, ...
- 如何提升量化投研效率?来自辰钰投资的案例分享
上海辰钰财富投资管理有限公司是一家专注于国内证券市场低风险投资机会的量化对冲基金,主要投资方向为 A 股.期货和债券等市场.公司秉持"以数据理解市场,以模型解析对手,以复利回馈投资" ...
- ”杠铃“策略:关于市场的一点思考,从转债到股票量化投研
持续行动1期 46/100,"AI技术应用于量化投资研究". 第1期行动将近过半,进入一个"爬坡期". "低垂之果"基本上摘干净了,比如数据 ...
- 微软 AI 量化投资平台 Qlib 体验
华泰人工智能系列之四十 核心观点 本文介绍微软 AI 量化投资平台 Qlib 基础和进阶功能,对比传统量化策略 开发流程和 Qlib 提供的解决方案,提炼 Qlib 特色及优势,并探讨笔者使用 体会. ...
- 三分钟玩转微软AI量化投资开源库QLib
数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学,点击下方链接报名: 量化投资速成营(入门课程) Python股票量化投资 Python期货量化投资 Python数 ...
最新文章
- MVC项目开发中那些用到的知识点(登录权限认证)
- java graphics透明_如何使用Graphics对象g绘制透明形状?
- 基于区域的OSPF简单口令认证(cisco packet tracer5.3)
- php核销次数,人人商城记次时商品核销时展示剩余积分 - YangJunwei
- sql注入语句示例大全_SQL Order By语句:示例语法
- jbutton添加点击事件_electron-vue自定义边框后点击事件失效问题
- Arrays.asList()使用时的注意事项,这个结论同可适用于Stream.of()___Arrays.stream和Stream.of
- 2019北京理工大学计算机专硕经验分享
- 格式化数字字符串输出的一个小技巧
- 利用Python脚本编写一个学生平均成绩
- 记一次new Map()
- android avrcp处理流程,(VR虚拟现实)Android 蓝牙AVRCP功能的实现.doc
- python贪吃蛇设计报告_Python实现AI版贪吃蛇
- 基于Neo4j构建的外贸企业关系图谱做企业相似度查询
- Arduino基础项目五:制作彩色LED灯
- 慎用P值:它让研究结果不可靠
- BugkuCTF –备份是个好习惯
- 32位和64位系统支持的最大内存
- GridControl之GridView(属性篇)(一)
- 返回上一页面刷新与不刷新的方法