首页 > 其他分享 >从零开始量化交易 - 尝试构建自己的量化系统

从零开始量化交易 - 尝试构建自己的量化系统

时间:2023-05-04 16:24:10浏览次数:48  
标签:从零开始 存储 策略 调度 回测 构建 量化 数据 SDK

为什么要构建自己的量化系统

在使用了一段时间聚宽平台的在线策略编辑模块之后,发现了几个让我自己用起来不太舒服的地方:

  • 运行启动时间偏慢

    因其环境隔离的特性,编译运行或者回测,都会启动一个Docker容器,在容器中进行。

  • 回测时间偏慢且受限制

    这方面应该属于是策略的问题。当回测的策略是每天进行选股交易时,需要频繁的多次访问数据库。并在内存中通过DataFrame进行计算。

    在通常意义的工程看来,其实可以在数据库层面进行特定的优化。但特定的优化适合我的同时,未必适合其他平台用户。这也是平台类型的回测工具的受限的地方。

    也是因为平台其不可能做善事,总要谋求收益去支付基础设施费用,甚至产生盈利。所以对于回测时间受限制是理解的。

  • 需要熟悉其特定的API,换个平台需要重新熟悉,虽然平移成本相对较低

    每个平台对于金融产品以及其衍生品的存储方式不一致,也会导致不同平台之间的API是特定的。然而其本质上还是这些金融产品以及其属性。因此如果在本地建立数据模型,对我而言会方便很多。

  • 无法编组进行重复回测

    因为我没有金融行业的从业经验,没有积累去看比如PE,换手率,价值面等理论之城。对于选股其实没有好的经验之城。那么我自己更适合的是依靠数据本身的变化来选择策略。因此,适合我的是,每个交易周期对于我已经编写的策略分数据范围的重复进行回测。记录其收益率等关键指标信息。然后选择一个最高的,按这个策略执行。

    这就要求我的回测速度要非常快,否则等回测完,也就闭市了,就没有意义了。

因此,更适合我自己的策略运行方式,其实是搭建一个本地的数据集,以及寻找能够支撑本地数据的量化交易框架,在本地运行。初步的理想结构如下图所示:

设计详述

截止目前为止,我理解的量化交易系统分为三个部分,包含了金融产品数据的获取,策略的回测执行,以及策略的执行结果报告。(暂时不涉及到模拟盘交易以及实盘交易部分)。

对于三个部分,初步的设想理念如下:

Data Fetcher

Data Fetcher模块中,包含了几块内容:

  • SDK

    目前市面上有非常多的金融产品数据获取的SDK,如:TushareBaostock等。虽然是使用python语言编写,对于目前的我而言,只需要获取日级别的历史交易数据,以及金融产品的基本面数据即可。如果采用爬虫或者调用Http接口的方式去做,反而显得有点浪费。

    因此,在这里决定采用python的已有的SDK作为初期数据的获取方式。在后期酌情考虑自研扩充SDK。

  • Scheduler

    对于数据的获取,并不需要实时。对于日级别的行情数据完全可以在收盘之后进行获取,依据SDK提供方的数据处理时间进行。因此,需要一个调度器定时的执行数据获取逻辑。根据不同的任务设定不同的执行周期和触发时间点。因此,Scheduler通过读取配置信息方便后期进行随时调整

  • Data Writer

    通过SDK获取的数据通过Data Writer进行写入,在此做一层封装可以兼容更多的存储系统。比如,前期为了方便写入MySQL,后期为了查询性能的提升,更改为Click House等等.

  • Config

    封装了一层配置的存储方式。前期为了方便可以是文件类型的存储,后期可以更改为数据库系统,如MySQL等。

Strategy Tester

Strategy Tester模块针对策略的回测进行工作,按照我的情况,需要在交易周期跑完所有的策略,并选中一个最符合期望的策略执行。因此其依赖调度器完成回测的调度。在初期为了实现简便,会采用轮询的方式进行调度,而在后期会根据自身对于策略的理解,采用更好的调度方式(诸如k8s 多pod并行调度等等)

另外Strategy Tester需要提供一个实现策略的SDK,能够支持模拟买入,持仓信息查询等等。这块在研究了vnpy之后再进行决定是否自研。

因此Strategy Tester的核心部分由如下几块构成:

  • Strategy Collection(Strategy Pool)

    策略池。这里存放的都是编写好的策略,策略本身根据SDK制定初始化,周期运行等核心代码。对于调度器而言,调度的就是这些策略。

  • Scheduler

    调度器。调度器本身有自己的调度周期,可通过配置信息配置。另外,所调度的策略也存在一个周期策略,因此是由双重调度策略控制。

  • Parameter Controller

    对于策略而言,其可对外暴露需要不断调试的参数信息。如:初始资金、交易时间范围、持仓时间等等。

  • MySQL

    因为Click House更适合存储写入后修改频次低的数据,并提供稳定高性能的查询能力。因此对于参数、策略的调度等需要频繁变化的信息,更适合存储在MySQL

Result Reporter

Result Reporter模块用于将策略的回测结果通过钉钉邮件的方式通知给我。在初期用于监控策略的执行情况以及耗时,在后期用于监控根据我的期望选择策略是否准确。以及模拟盘、实盘的实际交易情况等等。

在后期更改为一个在线的网页,用于实施查看。

其包含如下核心模块:

  • Result Collector

    策略执行的结果收集器,用于分析和筛选策略。

  • Trade Log

    回测、模拟盘或实盘的交易行为日志。

  • System Log

    系统运行的日志。包含调度执行,调度进度,执行的策略个数。以及运行中出错的信息。

  • Notifier

    通知模块。封装钉钉或邮件通知的接口

问题与延伸

在上面的初步设想架构中,存在了一些问题:

  • 缺少交易系统
  • 缺少细化的数据流转示意
  • 对于每个模块的开发语言并没有确认
  • 对于回测框架的技术选型没有完成

针对上述问题,逐步的来解决。首先解决的是本地数据的问题:

思路为以A股为例,获取交易日历股票信息日行情数据,并分开存储。其中交易日历和日行情数据不存在变更(或极低概率存在变更的场景,哪怕出现变更也可以删除原有数据重新建立),因此存储于Click House更为合适。而股票信息存在ST变更停牌等情况。而且针对策略,也会实时更新是否涨停,是否跌停等信息。避免在每个交易周期的头部进行计算。因此,该信息存储于MySQL更为合适。

另外,调度器的执行从数据库中读取其执行频率,为方便更改,存储于MySQL更为合适。

接下来,就是尝试建立自己的本地数据...

标签:从零开始,存储,策略,调度,回测,构建,量化,数据,SDK
From: https://www.cnblogs.com/budaomudesanye/p/17371591.html

相关文章

  • 从0开始构建一个Oauth2Server服务 <19> Token 编解码
    Token编解码令牌提供了一种通过在令牌字符串本身中编码所有必要信息来避免将令牌存储在数据库中的方法。这样做的主要好处是API服务器能够验证访问令牌,而无需对每个API请求进行数据库查找,从而使API更容易扩展。OAuth2.0BearerTokens的好处是应用程序不需要知道您决定如......
  • 1159 Structure of a Binary Tree + 根据前序和中序构建二叉树+ 层序遍历模板复习
    题目链接:https://pintia.cn/problem-sets/994805342720868352/exam/problems/1478635126488367104唉,今天的bug出在了下面这条语句。if(tree[root_key].left*tree[root_key].right<0)full_tree=false;我写成了full_tree=!(tree[root_key].left*tree[root_key].rig......
  • 如何设计一个轻量化网络模型
    要设计一个轻量化网络模型,并具备强大的特征提取与语义理解能力,可以采用以下策略:使用较少的卷积层和全连接层,减少模型的参数数量和计算量;使用卷积层进行特征提取,使用全局池化层进行特征整合;加入注意力机制,提升模型的语义理解能力;使用残差连接,增强模型的稳定性和泛化能力;对模......
  • Docker 构建 elasticsearch + kibana
    elasticsearch环境准备修改系统配置cat>>/etc/sysctl.conf<<-'EOF'net.ipv4.ip_forward=1vm.max_map_count=655360EOF重新加载配置sysctl-p&&systemctlrestartnetwork下载ik分词器本次部署使用的是7.10.1版本,可在此处直接下载,其它版本请在github自行下载。将......
  • 吴恩达Prompt课 - 02 构建原则
    吴恩达和OpenAI一起制作了节一个半小时的,面向开发者的关于《ChatGPTPromptEngineering》的课,对自己Prompt提高非常有帮助。英文课程地址:https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/我反复学习后,针对每小节的例子和关键部分按......
  • 2月构建之法其余阅读笔记
    第十二章用户体验12.1用户体验的要素用户的第一印象从用户的角度考虑问题软件服务始终都要记住用户的选择(长期的使用只会使软件更好用)短期刺激长期影响不让用户犯简单的错误注重用户体验和质量情感设计12.3评价标准对于一个软件的用户界面,我们有没有什么评价标准呢?......
  • 2月构建之法七八章阅读笔记
    第七章MSF微软公司中关于软件开发的思想和宣言有一个方法论——微软解决方案框架(MicrosoftSolutionFramework,MSF),也就是微软推荐的软件开发方法7.2MSF基本原则推动信息共享与沟通(Fosteropencommunications)为共同的远景而工作(Worktowardasharedvision)“共同的......
  • 2月构建之法九十章阅读笔记
    第九章项目经理9.1PM是啥软件团队里除了能写代码、测试代码和画图做设计的成员,还有一类角色,不做上面这些事情但也很重要,我们叫他们项目经理——PMPM的M就是Manager,但是P有这几种:ProductManager、ProjectManager、ProgramManager,在不同的行业和公司,他们的作用各不相同。接下......
  • bytehound centos 7构建说明
    bytehound已经提供了相关的包,但是因为依赖的glib版本比较高,低版本的centos不能运行(比如centos7),所以自己构建了一个版本的准备使用centos-release-scl,当然还需要rust可以先安装好,同时还需要node(需要yarn)yum-yinstallcentos-release-sclyuminstall-ydev......
  • 构建之法阅读笔记3
    服务化架构:随着系统复杂度的提高,单体应用已经无法满足业务需求,因此需要将系统拆分成多个小的、自治的服务,以提高系统的可扩展性和灵活性。去中心化思想:在设计系统时,应该避免单点故障,采用去中心化的思想,将负载分散到多个服务器上。同时,要考虑数据的一致性和复制策略。弹性设计:系统......