Python量化交易平台开发教程系列4-事件驱动引擎原理和使用

python定时任务在实盘交易系统中的应用 定时任务在量化中的应用     在实盘量化程序中有时候我们需要定时的从数据接口获取数据来供交易策略处理产生交易信号进而做出交易决策。比如基于15分钟K线设计的交易策略需要每15分钟向数据接口发出请求获取最新的15分钟k线数据交给交易策略处理,产生相应的交易信号最后做出相应的交易决策。 python模块介绍 示例代码     在上述的量化应用场景当中我们一般使用apscheduler定时框架,以便在... 阅读详情

原创文章,转载请注明出处:用Python的交易员

前言

从这篇开始,后面的教程都会基于Python(终于可以跟C++说再见了)。

经过上一篇复杂繁琐的API编译后,我们已经有了一个可以在Python环境中用来收行情和发单的接口,但是尽管作者在Github上也放了简单的API功能测试代码作为接口使用方法的示例,绝大部分读者应该对于如何用这个接口去开发自己的交易系统毫无头绪。

类似的情况也常常发生于当我们从万得、恒生、网上的其他开源项目(比如pyctp)等等拿到开发接口和文档示例后:

看了半天觉得似乎上面讲的都懂。

enter image description here

但要写个自己的系统依旧不知道从何处下手。

enter image description here

所以在搞定交易接口后,我们开发交易系统的第一步就是要弄清楚系统的工作原理,在读完这篇教程后,你应该至少不会再对如何写一个交易系统茫然无措了。

事件驱动

计算机程序分类

所有的计算机程序都可以大致分为两类:脚本型(单次运行)和连续运行型(直到用户主动退出)。

脚本型

脚本型的程序包括最早的批处理文件以及使用Python做交易策略回测等等,这类程序的特点是在用户启动后会按照编程时设计好的步骤一步步运行,所有步骤运行完后自动退出。

连续运行型

连续运行型的程序包含了操作系统和绝大部分我们日常使用的软件等等,这类程序启动后会处于一个无限循环中连续运行,直到用户主动退出时才会结束。

连续运行型程序

我们要开发的交易系统就是属于连续运行型程序,而这种程序根据其计算逻辑的运行机制不同,又可以粗略的分为时间驱动和事件驱动两种。

时间驱动

时间驱动的程序逻辑相对容易设计,简单来说就是让电脑每隔一段时间自动做一些事情。这个事情本身可以很复杂、包括很多步骤,但这些步骤都是线性的,按照顺序一步步执行下来。

以下代码展示了一个非常简单的时间驱动的Python程序。

from time import sleep

def demo():
    print u'时间驱动的程序每隔1秒运行demo函数'

while 1:
    demo()
    sleep(1.0)

时间驱动的程序本质上就是每隔一段时间固定运行一次脚本(上面代码中的demo函数)。尽管脚本自身可以很长、包含非常多的步骤,但是我们可以看出这种程序的运行机制相对比较简单、容易理解。

举一些量化交易相关的例子:

  1. 每隔5分钟,通过新浪财经网页的公开API读取一次沪深300成分股的价格,根据当日涨幅进行排序后输出到电脑屏幕上。

  2. 每隔1秒钟,检查一次最新收到的股指期货TICK数据,更新K线和其他技术指标,检查是否满足趋势策略的下单条件,若满足则执行下单。

对速度要求较高的量化交易方面(日内CTA策略、高频策略等等),时间驱动的程序会存在一个非常大的缺点:对数据信息在反应操作上的处理延时。例子2中,在每次逻辑脚本运行完等待的那1秒钟里,程序对于接收到的新数据信息(行情、成交推送等等)是不会做出任何反应的,只有在等待时间结束后脚本再次运行时才会进行相关的计算处理。而处理延时在量化交易中的直接后果就是money:市价单滑点、限价单错过本可成交的价格。

时间驱动的程序在量化交易方面还存在一些其他的缺点:如浪费CPU的计算资源、实现异步逻辑复杂度高等等。

事件驱动

与时间驱动对应的就是事件驱动的程序:当某个新的事件被推送到程序中时(如API推送新的行情、成交),程序立即调用和这个事件相对应的处理函数进行相关的操作。

上面例子2的事件驱动版:交易程序对股指TICK数据进行监听,当没有新的行情过来时,程序保持监听状态不进行任何操作;当收到新的数据时,数据处理函数立即更新K线和其他技术指标,并检查是否满足趋势策略的下单条件执行下单。

对于简单的程序,我们可以采用上面测试代码中的方案,直接在API的回调函数中写入相应的逻辑。但随着程序复杂度的增加,这种方案会变得越来越不可行。假设我们有一个带有图形界面的量化交易系统,系统在某一时刻接收到了API推送的股指期货行情数据,针对这个数据系统需要进行如下处理:

  1. 更新图表上显示的K线图形(绘图)

  2. 更新行情监控表中股指期货的行情数据(表格更新)

  3. 策略1需要运行一次内部算法,检查该数据是否会触发策略进行下单(运算、下单)

  4. 策略2同样需要运行一次内部算法,检查该数据是否会触发策略进行下单(运算、下单)

  5. 风控系统需要检查最新行情价格是否会导致账户的整体风险超限,若超限需要进行报警(运算、报警)

此时将上面所有的操作都写到一个回调函数中无疑变成了非常差的方案,代码过长容易出错不说,可扩展性也差,每添加一个策略或者功能则又需要修改之前的源代码(有经验的读者会知道,经常修改生产代码是一种非常危险的运营管理方法)。

为了解决这种情况,我们需要用到事件驱动引擎来管理不同事件的事件监听函数并执行所有和事件驱动相关的操作。

事件驱动引擎原理

vn.py框架中的vn.event模块包含了一个可扩展的事件驱动引擎。整个引擎的实现并不复杂,除去注释、空行后大概也就100行左右的代码:

# encoding: UTF-8

# 系统模块
from Queue import Queue, Empty
from threading import Thread

# 第三方模块
from PyQt4.QtCore import QTimer

# 自己开发的模块
from eventType import *


########################################################################
class EventEngine:
    """
    事件驱动引擎
    事件驱动引擎中所有的变量都设置为了私有,这是为了防止不小心
    从外部修改了这些变量的值或状态,导致bug。

    变量说明
    __queue:私有变量,事件队列
    __active:私有变量,事件引擎开关
    __thread:私有变量,事件处理线程
    __timer:私有变量,计时器
    __handlers:私有变量,事件处理函数字典


    方法说明
    __run: 私有方法,事件处理线程连续运行用
    __process: 私有方法,处理事件,调用注册在引擎中的监听函数
    __onTimer:私有方法,计时器固定事件间隔触发后,向事件队列中存入计时器事件
    start: 公共方法,启动引擎
    stop:公共方法,停止引擎
    register:公共方法,向引擎中注册监听函数
    unregister:公共方法,向引擎中注销监听函数
    put:公共方法,向事件队列中存入新的事件

    事件监听函数必须定义为输入参数仅为一个event对象,即:

    函数
    def func(event)
        ...

    对象方法
    def method(self, event)
        ...

    """

    #----------------------------------------------------------------------
    def __init__(self):
        """初始化事件引擎"""
        # 事件队列
        self.__queue = Queue()

        # 事件引擎开关
        self.__active = False

        # 事件处理线程
        self.__thread = Thread(target = self.__run)

        # 计时器,用于触发计时器事件
        self.__timer = QTimer()
        self.__timer.timeout.connect(self.__onTimer)

        # 这里的__handlers是一个字典,用来保存对应的事件调用关系
        # 其中每个键对应的值是一个列表,列表中保存了对该事件进行监听的函数功能
        self.__handlers = {}

    #----------------------------------------------------------------------
    def __run(self):
        """引擎运行"""
        while self.__active == True:
            try:
                event = self.__queue.get(block = True, timeout = 1)  # 获取事件的阻塞时间设为1秒
                self.__process(event)
            except Empty:
                pass

    #----------------------------------------------------------------------
    def __process(self, event):
        """处理事件"""
        # 检查是否存在对该事件进行监听的处理函数
        if event.type_ in self.__handlers:
            # 若存在,则按顺序将事件传递给处理函数执行
            [handler(event) for handler in self.__handlers[event.type_]]

            # 以上语句为Python列表解析方式的写法,对应的常规循环写法为:
            #for handler in self.__handlers[event.type_]:
                #handler(event)

    #----------------------------------------------------------------------
    def __onTimer(self):
        """向事件队列中存入计时器事件"""
        # 创建计时器事件
        event = Event(type_=EVENT_TIMER)

        # 向队列中存入计时器事件
        self.put(event)

    #----------------------------------------------------------------------
    def start(self):
        """引擎启动"""
        # 将引擎设为启动
        self.__active = True

        # 启动事件处理线程
        self.__thread.start()

        # 启动计时器,计时器事件间隔默认设定为1秒
        self.__timer.start(1000)

    #----------------------------------------------------------------------
    def stop(self):
        """停止引擎"""
        # 将引擎设为停止
        self.__active = False

        # 停止计时器
        self.__timer.stop()

        # 等待事件处理线程退出
        self.__thread.join()

    #----------------------------------------------------------------------
    def register(self, type_, handler):
        """注册事件处理函数监听"""
        # 尝试获取该事件类型对应的处理函数列表,若无则创建
        try:
            handlerList = self.__handlers[type_]
        except KeyError:
            handlerList = []
            self.__handlers[type_] = handlerList

        # 若要注册的处理器不在该事件的处理器列表中,则注册该事件
        if handler not in handlerList:
            handlerList.append(handler)

    #----------------------------------------------------------------------
    def unregister(self, type_, handler):
        """注销事件处理函数监听"""
        # 尝试获取该事件类型对应的处理函数列表,若无则忽略该次注销请求
        try:
            handlerList = self.handlers[type_]

            # 如果该函数存在于列表中,则移除
            if handler in handlerList:
                handlerList.remove(handler)

            # 如果函数列表为空,则从引擎中移除该事件类型
            if not handlerList:
                del self.handlers[type_]
        except KeyError:
            pass

    #----------------------------------------------------------------------
    def put(self, event):
        """向事件队列中存入事件"""
        self.__queue.put(event)

初始化

当事件驱动引擎对象被创建时,初始化函数__init__会创建以下私有变量:

  • __queue:用来保存事件的队列

  • __active:用来控制引擎启动、停止的开关

  • __thread:负责处理事件、执行具体操作的线程

  • __timer:用来每隔一段时间触发定时事件的计时器

  • __handlers:用来保存不同类型事件所对应的事件处理函数的字典

注册事件处理函数

引擎提供了register方法,用来向引擎注册事件处理函数的监听,传入参数为

  1. type_:表示事件类型的常量字符串,由用户自行定义,注意不同事件类型间不能重复

  2. handler:当该类型的事件被触发时,用户希望进行相应操作的事件处理函数,函数的定义方法参考代码中的注释

当用户调用register方法注册事件处理函数时,引擎会尝试获取__handlers字典中该事件类型所对应的处理函数列表(若无则创建一个空列表),并向这个列表中添加该事件处理函数。使用了Python的列表对象,用户可以很容易的控制同一个事件类型下多个事件处理函数的工作顺序,因此对某些涉及多步操作的复杂算法可以保证按照正确的顺序执行,这点是相比于某些系统0消息机制(如Qt的Signal/Slot)最大的优势。

如当标的物行情发生变化时,期权高频套利算法需要执行以下操作:

  1. 使用定价引擎先计算新的期权理论价、希腊值

  2. 使用风控引擎对当前持仓的风险度汇总,并计算报价的中间价

  3. 使用套利引擎基于预先设定的价差、下单手数等参数,计算具体价格并发单

以上三步操作,只需在交易系统启动时按顺序注册监听到标的物行情事件上,就可以保证操作顺序的正确。

和register对应的是unregister方法,用于注销事件处理函数的监听,传入参数相同,具体原理请参照源代码。在实际应用中,用户可以动态的组合使用register和unregister方法,只在需要监听某些事件的时候监听,完成后取消监听,从而节省CPU资源。

这里让笔者吐槽一下某些国内的C++平台(当然不是指所有的),每个策略对系统里所有的订单回报进行监听,如果是自身相关的就处理,不相关的就PASS。这种写法,光是判断是否和自身相关就得多做多少无谓的判断、浪费多少CPU资源,随着策略数量的增加,浪费呈线性增加的趋势,这种平台还叫嚣做高频,唉......

触发事件

用户可以通过引擎的put方法向事件队列__queue中存入事件,等待事件处理线程来进行处理,事件类的实现如下:

########################################################################
class Event:
    """事件对象"""

    #----------------------------------------------------------------------
    def __init__(self, type_=None):
        """Constructor"""
        self.type_ = type_      # 事件类型
        self.dict_ = {}         # 字典用于保存具体的事件数据

对象创建时用户可以选择传入事件类型字符串type_作为参数。dict_字典用于保存具体事件相关的数据信息,以供事件处理函数进行操作。

事件处理线程的连续运行

事件引擎的事件处理线程__thread中执行连续运行工作的函数为__run:当事件引擎的开关__active没有被关闭时,引擎尝试从事件队列中读取最新的事件,若读取成功则立即调用__process函数处理该事件,若无法读取(队列为空)则进入阻塞状态节省CPU资源,当阻塞时间(默认为1秒)结束时再次进入以上循环。

__process函数工作时,首先检查事件对象的事件类型在__handlers字典中是否存在,若存在(说明有事件处理函数在监听该事件)则按照注册顺序调用监听函数列表中的事件处理函数进行相关操作。

计时器

事件引擎中的__timer是一个PyQt中的QTimer对象,提供的功能非常简单:每隔一段时间(由用户设定)自动运行函数__onTimer。__onTimer函数会创建一个类型为EVENT_TIMER(在eventType.py文件中定义)的事件对象,并调用引擎的put方法存入到事件队列中。

敏感的读者可能已经意识到了,这个计时器本质上是一个由时间驱动的功能。尽管我们在前文中提到了事件驱动在量化交易平台开发中的重要性,但不可否认某些交易功能的实现必须基于时间驱动,例如:下单后若2秒不成交则立即撤单、每隔5分钟将当日的成交记录保存到数据库中等。这类功能在实现时就可以选择使用事件处理函数对EVENT_TIMER类型的计时器事件进行监听(参考下一章节“事件驱动引擎使用”中的示例)。

启动、停止

用户可以通过start和stop两个方法来启动和停止事件驱动引擎,原理很简单读者可以直接参考源代码。

当启动计时器时,事件间隔默认设定为了1秒(1000毫秒),这个参数用户可以视乎自己的需求进行调整。假设用户使用时间驱动的函数工作间隔为分钟级,则可以选择将参数设置为60秒(600000毫秒),以此类推。

事件驱动引擎使用

同样在eventEngine.py中,包含了一段测试代码test函数,用来展示事件驱动引擎的使用方法:

#----------------------------------------------------------------------
def test():
    """测试函数"""
    import sys
    from datetime import datetime
    from PyQt4.QtCore import QCoreApplication

    def simpletest(event):
        print u'处理每秒触发的计时器事件:%s' % str(datetime.now())

    app = QCoreApplication(sys.argv)

    ee = EventEngine()
    ee.register(EVENT_TIMER, simpletest)
    ee.start()

    app.exec_()


# 直接运行脚本可以进行测试
if __name__ == '__main__':
    test()

test函数整体上包含了这几步:

  1. 导入相关的包(sys、datetime、PyQt4),注意由于EventEngine的实现中使用了PyQt4的QTimer类,因此整个程序的运行必须包含在Qt事件循环中,即使用QCoreApplication(或者PyQt4.QtGui中的QApplication)的exec_()方法在程序主线程中启动事件循环。

  2. 定义一个简单的函数simpletest,该函数包含一个输入参数event对象,函数被调用后会打印一段字符以及当前的时间

  3. 创建QCoreApplication对象app

  4. 创建事件驱动引擎EventEngine对象ee

  5. 向引擎中注册simpletest函数对定时器事件EVENT_TIMER的监听

  6. 启动事件驱动引擎

  7. 启动Qt事件循环

整体上看,当用户开发自己的程序时,需要修改的只是第2步和第5步:创建自己的事件处理函数并将这些函数注册到相应的事件类型上进行监听。

总结

有了API接口和事件驱动引擎,接下来我们可以开始开发自己的平台了,后面的几篇教程将会一步步展示一个简单的LTS交易平台的开发过程。

python实现的自动化交易员 立即下载

相关推荐

数字化转型是什么?核心又是什么呢?

01到底什么是数字化转型? 这时候你或许要问笔者了,既然你说使用新兴技术不是数字化转型,那使用新的商业模式总该是数字化转型了吧?你比如阿里巴巴,作为我们中国人最熟悉的开展电子商务的公司,它可以说是新的商业模式最大的开创者了:阿里巴巴是世界上最大的零售商,却没有任何一家实体店和任何库存;再比如优步(Uber),我们非常熟悉的一个线上打车平台,它可以算是世界上最大的出租车公司了,但是它不拥有一辆出租车。还有近些年来,我们经常使用的的旅游房屋租赁社区爱彼迎(Airbnb),它可以为消费者提供多样的住宿信息..

weixin_58342023的博客 4043

python 升级_Python期货期权无风险套利监控升级版

代码基于天勤量化平台,先贴出完整代码:#!/usr/bin/env python # -*- coding: utf-8 -*- #import asyncio from tqsdk import TqApi, TqAuth from contextlib import closing from time import time # 创建API实例. api = TqApi(auth=TqAut...

weixin_39901439的博客 408

解密微信DAT图片:一键转换JPG/PNG/GIF的实用指南

本文详细解析微信DAT图片的加密机制及转换方法,提供从定位文件到使用WeijieSoft工具一键转换JPG/PNG/GIF的完整指南。涵盖新旧版微信存储路径差异、批量处理技巧及常见问题解决方案,帮助用户高效恢复重要图片并释放存储空间。

weixin_29305337的博客 3625

python期货量化交易实战_谈谈国内的量化交易软件,以及期货交易中程序化的优劣...

以下是汇总了许多期货水友向老肖咨询有关程序化交易相关的问题,在这篇文章中跟大家简单的解释和分享一下。国内的量化交易软件目前的主流有哪些?老肖:量化交易软件目前有以下三类:1、WHCJ的程序化软件,由第三方软件公司研发,使用前WH会要求提前一次性付费7800元,且不可退换,因此对于客户有这种需求的,需要在指定期货公司提前开户,并且入金超过150万;2、TB等市面上其他常用的程序化软件,没有多余费用,...

weixin_29491655的博客 5513

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 349

(2)NPW(监控片)【中】---业务场景精讲

自己在日常工作当中,由于非产线人员出生,对NPW的知识一直一知半解,业务场景认识的不够透彻,做系统的时候很难理解甲方的NPW业务应用,特收集了不少关于NPW的一些业务场景,下面都是一些摘抄,大家关注我标红标粗的部分,

阿拉伯梳子的专栏 1591

python手动绘图_远程下单|Python实时提醒交易信号

前言我们用量化交易的目的就是让程序全自动地去跑策略,全自动的去执行交易,所以大家非常关心全自动下单的实现。对个人交易者来说,如果是期货交易,程序化交易的限制没有股票那么严格,毕竟市场影响比股票小,像上期所CTP、中金所飞马、大商所飞创以及郑商所易盛,这些柜台系统都可以实现,像交易开拓者(TB)、文华财经以及金字塔等带有脚本功能的软件,也对接了某一柜台系统。而股票的自动化交易在2015年之后就被管制...

weixin_42515045的博客 3039

LLM制造业最佳实践:基于大语言模型处理最优化问题,制造业如何更优排产,提升资源利用率

随着制造业数字化转型加速,生产排产优化成为提升企业效率和竞争力的关键环节。大语言模型(LLM)凭借其强大的多模态数据处理、动态优化和智能推理能力,在复杂排产场景中展现出独特优势。谷歌、DeepSeek等机构的研究表明,LLM可通过自然语言交互和生成式决策,突破传统优化算法的局限性。本报告结合半导体行业实践案例与技术路径,系统分析LLM在排产优化中的应用潜力与挑战。

shiter编写程序的艺术 940

python期货自动交易_期货交易系统_python期货自动化交易

Save now on a new Heating & Air Conditioning SystemHow much are you going to pay the utility companies for comfort this year?With rates projected to increase as much as 63% now is the time to place yo...

weixin_39646628的博客 621

【RBF预测】基于粒子群算法优化RBF神经网络实现数据回归预测含Matlab源码

1 简介 原油含水率预测对于确定油井水,油层位以及估计原油产量有着非常重要意义.BP神经网络是最近常用的原油含水率预测方法,然而,由于BP神经网络存在容易陷入局部极小值,收敛速度慢等问题,影响了其预测的实用性和准确性,对此,提出基于粒子群优化RBF神经网络(PSO-RBFNN)的原油含水率预测方法,粒子群优化算法用于RBF神经网络参数优化.在分析原油含水率预测的影响因素基础上,建立粒子群优化RBF神经网络的原油含水率预测模型.实验结果表明,在原油含水率预测中,基于粒子群优化RBF神经网络比BP神经网络有着

qq_59747472的博客 1236

手把手教你ensp仿真搭建校园网(含防火墙及无线网络)系列(一)校园网核心交换机配置

本系列博客将带你从零开始,使用 华为 eNSP(Enterprise Network Simulation Platform) 仿真搭建一个完整的校园网络,涵盖 核心层、汇聚层、接入层、防火墙安全策略、无线AC+AP组网 等实战场景。无论你是网络初学者还是希望深化实战经验的工程师,都能通过本教程掌握企业级网络的规划、配置与排错技巧。

echo的博客 3816

8.Python 学习系列--------Python实用模块

Python常用的模块是 numpy 创建数组,访问数组 数组的运算 通用的函数,数组的合并和分割   matplotlib 学会查找官方文档,通过查找官方文档的小例子,来快速的学习  gallery 画廊 pandas,主要用来分析数据,处理工具 创建数据框 基础数据的处理方式 向量化的操作方式 数据框的增,查,删除   scipy scipy的主要数据模块,可以用...

weixin_39970417的博客 336

DSShop移动商城网店系统 反序列化RCE漏洞复现

DSShop单店铺移动商城网店系统的getCartList方法的cart参数存在php反序列化漏洞,攻击者可以通过漏洞执行任意代码,获取服务器权限。

0xSec 1472

【量化】Python量化交易平台vnpy开发-汇总笔记

文章目录0.引言1.类CTP交易API的工作原理2.类CTP交易API的Python封装设计3.vn.py项目中API封装的编译4.事件驱动引擎原理和使用5.底层接口对接6.中层引擎设计7.顶层GUI界面开发(1)8.顶层GUI界面开发(2) 文章专栏:https://zhuanlan.zhihu.com/vn-py 开源代码:https://github.com/vnpy/vnpy [5年前的文...

GreatXiang888的博客 3643

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

揭秘VeighNa量化交易平台:事件驱动引擎与主引擎的核心工作原理

VeighNa(vn.py)是基于Python的开源量化交易平台开发框架,其核心架构采用事件驱动设计模式,通过事件驱动引擎(EventEngine)和主引擎(MainEngine)的协同工作,实现了高效、灵活的量化交易系统。本文将深入解析这两大核心组件的工作原理,帮助开发者和用户理解VeighNa的内部运行机制。 ## 事件驱动引擎:量化交易的神经中枢 事件驱动引擎(EventEngine)是

gitblog_00438的博客 900

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python量化交易平台开发教程系列7-顶层GUI界面开发(1)

原创文章,转载请注明出处:用Python的交易员 前言 终于有时间来写第一篇顶层GUI界面开发相关的教程了,之前实在是事情太多,跟各位读者抱个歉。 整合底层接口的各项功能到中层引擎中后,当我们开发顶层应用时(GUI或者策略算法),只需知道中层引擎对外提供的主动API函数以及事件引擎中相关的事件类型和数据形式即可。 在GUI和策略算法这两个主要类型的顶层应用中,作者选择先介绍

智能量化交易 6272

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python量化交易平台开发教程系列_Python量化交易平台开发教程系列0-引言

原创文章,转载请注明出处:用Python的交易员为什么用Python来开发量化交易平台目前本人所在的公司一共有三款平台,分别基于C++, C#和Python。其中C#和Python平台都是由交易员开发;C++平台则是由专职IT团队作为一个通用平台开发,内部组件进行了封装(交易员不可见),对外提供行情、交易的API用于策略开发(除了C++ 外也包括C#和Python可用的API)。理论上这款C++平...

weixin_39695490的博客 288

vnpy事件驱动引擎深度解析:构建高性能量化交易系统的核心架构

vnpy作为基于Python的开源量化交易平台开发框架,其核心优势在于精心设计的事件驱动引擎。本文将深入解析vnpy事件驱动引擎的设计理念、实现机制以及在量化交易系统中的关键作用,帮助开发者理解这一核心模块的工作原理。 ## 🎯 事件驱动引擎的重要性 在量化交易系统中,实时性、并发性和可扩展性是至关重要的需求。vnpy的事件驱动引擎通过异步消息传递机制,实现了各个模块之间的松耦合通信,确保了

gitblog_00159的博客 812

量化交易平台—事件驱动原理

【前言】在搞定交易接口后,我们开发交易系统的第一步就是要弄清楚系统的工作原理。本文是我看的公司的中频平台文档的总结,公司是基于开源的vn.py修改而来,但是驱动引擎是一样的。   会参考vn.py官方文档,公司是参考其修改的。但在正在研发的高频交易平台上是根据CTP接口接发数据的格式,合并成单线程,配合solarflare的网卡,速度不吃亏。本文以及下面的三篇文章主要是现有的中频平台的,当然高频...

weixin_30569153的博客 1258

VeighNa框架入门:构建你的第一个Python量化交易系统

VeighNa框架入门:构建你的第一个Python量化交易系统 【免费下载链接】vnpy 基于Python的开源量化交易平台开发框架 项目地址: https://gitcode.com/vnpy/vnpy ...

gitblog_00600的博客 2028

RQAlpha事件驱动架构深度解析:掌握量化回测引擎运行机制

RQAlpha是一个基于Python的量化回测框架,其核心采用了**事件驱动架构**来实现高效、可扩展的量化策略回测。这种架构设计使得系统能够模拟真实市场环境,为量化交易策略提供可靠的测试平台。🚀 在量化投资领域,**事件驱动架构**是构建高性能回测引擎的关键技术。RQAlpha通过精心设计的事件系统,实现了对市场数据、交易信号、风控逻辑的精确时序控制。 ## 事件驱动架构的核心组件 [!

gitblog_00981的博客 964

4个步骤掌握量化策略开发:基于Lean引擎构建智能交易系统

量化策略开发是金融科技领域的核心技能,而选择合适的量化引擎直接决定了策略实现的效率和回测的准确性。Lean量化引擎作为QuantConnect开发的开源算法交易平台,支持Python和C#双语言开发,集成了数据获取、策略编写、回测分析和实盘交易等全流程功能,是构建智能交易系统的理想选择。本文将通过四个核心步骤,带您从零开始掌握基于Lean引擎的量化策略开发,无论您是零基础入门还是有经验的开发者,都

gitblog_00141的博客 317

QuantConnect Lean算法交易引擎架构解析:从设计原理到高效开发实践

QuantConnect Lean算法交易引擎是一个开源的量化交易平台,专为金融算法交易而设计。该系统采用模块化架构设计,支持多资产类别交易策略开发,提供从回测到实盘部署的完整解决方案。Lean引擎的核心优势在于其统一的数据处理框架、灵活的策略开发接口以及高性能的计算引擎,为量化开发者提供了专业级的交易系统开发工具。 ## 1. 技术挑战与需求分析 传统量化交易开发面临多重技术挑战:数据格式不

gitblog_00063的博客 820

探索量化交易新范式:QuantConnect Lean引擎进阶指南

量化交易引擎作为金融科技的核心驱动力,正在重塑投资决策的未来。QuantConnect Lean引擎作为开源策略开发的领军平台,以其模块化架构和跨语言支持,为开发者提供了从策略构思到实盘部署的全流程解决方案。本文将深入剖析Lean引擎的技术原理,构建实战开发路径,并拓展其在复杂市场环境中的应用场景,帮助你突破量化策略开发的技术瓶颈。 ## 技术原理:Lean引擎如何构建量化交易系统? ###

gitblog_01042的博客 916

Lean量化引擎:开源算法交易平台架构设计与实战应用指南

Lean量化引擎是QuantConnect开发的开源算法交易平台,支持Python和C#双语言开发,提供从数据获取、策略编写到回测分析的全流程解决方案。该引擎采用事件驱动架构,支持股票、期货、期权、外汇、CFD等多种资产类型,具备纳秒级时间戳精度和完整的交易生命周期管理能力,为量化交易开发者提供专业级的策略开发与回测环境。 ## 技术概述:开源量化交易引擎的核心价值与应用场景 ### 问题解析

gitblog_07429的博客 478
上一篇: Python量化交易平台开发教程系列3-vn.py项目中API封装的编译
下一篇: Python量化交易平台开发教程系列5-底层接口对接
Trader_Python
博客等级 码龄11年 392粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值