【量化交易】股市舞者:小明的撮合交易之旅

马西森AES撮合交易系统

在繁华的都市中,小明,一个普通的青年,刚刚赚到了人生的第一桶金——20万。这笔意外的财富,点燃了他对股市的强烈兴趣。他开始如饥似渴地学习金融知识,钻研各种交易策略。
在这里插入图片描述

一天,小明偶然间了解到了马西森AES撮合交易系统。马西森,金融界的传奇人物,他的撮合交易系统被誉为市场最公平、最高效的交易方式。小明被这一系统的精密和高效深深吸引,决定要深入了解撮合交易的原理、费用以及与交易所的关系。
在这里插入图片描述

撮合交易,顾名思义,就是将买家和卖家的订单进行匹配,达成交易。在马西森AES系统中,买卖双方的订单被放入一个公共的池子中,系统会根据价格和时间优先原则进行撮合。这种方式的优点在于公平、透明,且能确保市场的流动性。
小明开始了他的撮合交易学习之旅。他阅读了大量的书籍和资料,还参加了各种线上线下的培训课程。在学习过程中,他不仅了解了撮合交易的基本原理和操作技巧,还掌握了一些高级的交易策略和心理调适方法。
经过一段时间的学习和实践,小明逐渐熟悉了撮合交易的流程和规则。他决定进行第一次尝试。他仔细分析了市场趋势,制定了交易计划,然后提交了订单。虽然第一次尝试并没有获得预期的收益,但小明并不气馁。他认真总结了经验教训,调整了策略,继续前行。
就这样,小明在撮合交易的道路上不断探索和进步。然而,就当他信心满满地制订了一次看似完美的撮合交易计划时,市场却给了他一个沉重的打击。他的交易失败了,损失惨重10万的投入2天内全部蒸发,脸上因这次失败也明显苍老许多。
在这里插入图片描述

这次失败让小明陷入了深深的困惑和自责中。他坐在椅子上,手托着腮,眉头紧锁,一度开始怀疑自己的能力,甚至对撮合交易产生了恐惧。但是,他并没有放弃。他知道,失败是成功之母。他决定重新审视自己的交易策略和心态,找出问题的根源。
在这里插入图片描述
在这个过程中,小明逐渐意识到:交易不仅是一门技术活,更是一场心理战。他开始学习如何控制自己的情绪和欲望,如何面对市场的不确定性。他明白了,要想在股市中立足,不仅需要有扎实的金融知识和高超的交易技巧,更需要有稳健的心态和长远的眼光。
经过一段时间的调整和反思,小明重新站了起来。他不再急于求成,而是更加注重交易的稳健性和可持续性。他开始关注市场的长期趋势和基本面因素,而不是仅仅关注短期的价格波动。
随着时间的推移,小明的交易业绩逐渐回升。他不仅在撮合交易中赚到了更多的钱,更重要的是,他找到了自己的交易之道和人生方向。

以下是撮合中的交易源代码

import time
from collections import deque

class Order:
    def __init__(self, price, amount, is_buy, timestamp=None):
        self.price = price# 订单价格
        self.amount = amount# 订单数量
        self.is_buy = is_buy# 订单类型(True为买单,False为卖单)
        self.timestamp = timestamp or time.time() # 订单时间戳(默认为当前时间)
        
# 定义交易所类
class Exchange:
    def __init__(self):
        self.buy_orders = deque()  # 买单列表,按价格从高到低,时间从早到晚排序
        self.sell_orders = deque()  # 卖单列表,按价格从低到高,时间从早到晚排序
    # 添加订单到交易所
    def add_order(self, order):
        # 判断订单类型,决定与哪种订单进行撮合
        if order.is_buy:
            # 尝试与卖单列表中的订单进行撮合
            while self.sell_orders and order.amount > 0:
                sell_order = self.sell_orders[0]
                # 如果买单价格高于或等于卖单价格,则可以进行撮合
                if sell_order.price <= order.price:
                    deal_amount = min(order.amount, sell_order.amount)  # 计算可撮合数量
                    order.amount -= deal_amount  # 更新买单剩余数量
                    sell_order.amount -= deal_amount  # 更新卖单剩余数量
                    print(f"交易成功!成交价:{sell_order.price},成交量:{deal_amount}")
                    if sell_order.amount == 0:  # 如果卖单数量为零,则从卖单列表中移除
                        self.sell_orders.popleft()
                else:  # 如果买单价格低于卖单价格,则终止撮合
                    break
            # 如果买单还有剩余,则加入买单列表,并保持列表排序
            if order.amount > 0:  
                self._insert_order(self.buy_orders, order)
        else:  # 卖单逻辑与买单相似,但方向相反
            while self.buy_orders and order.amount > 0:
                buy_order = self.buy_orders[0] # 获取买单列表中的第一个订单
                if buy_order.price >= order.price:
                    deal_amount = min(order.amount, buy_order.amount)  # 计算可撮合数量
                    order.amount -= deal_amount
                    buy_order.amount -= deal_amount
                    print(f"交易成功!成交价:{buy_order.price},成交量:{deal_amount}")
                    if buy_order.amount == 0:
                        self.buy_orders.popleft()
                else:
                    break
            if order.amount > 0:  # 如果卖单还有剩余,则加入卖单列表,并保持列表排序
                self._insert_order(self.sell_orders, order)

    def _insert_order(self, order_list, new_order):
        """在保持排序的同时插入新订单"""
        for i, order in enumerate(order_list):
            # 根据订单类型决定插入位置,买单按价格从高到低,卖单按价格从低到高
            if (new_order.is_buy and new_order.price >= order.price) or \
               (not new_order.is_buy and new_order.price <= order.price):
                order_list.insert(i, new_order)
                break   # 由于新订单已插入,后续的订单不需要再比较  
            elif i == len(order_list) - 1:  # 如果新订单价格比列表中所有订单价格都高,则插入到最后
                order_list.append(new_order)    
        else:  # 如果新订单价格比列表中所有订单价格都低,则插入到列表开头
            order_list.appendleft(new_order)# 在列表末尾添加新订单        
            print(f"新订单:{new_order.price}{new_order.amount}{new_order.is_buy}")# 输出新订单信息
            self._print_order_list(order_list)  

    def _print_order_list(self, order_list):
        print(f"订单列表:")
        for order in order_list: # 遍历订单列表中的每个订单
            print(f"{order.price}{order.amount}{order.is_buy}") # 输出每个订单的详细信息(价格、数量、类型)
            print() # 换行使内容更加清晰
            
if __name__ == "__main__":
    exchange = Exchange()
    #
    exchange.add_order(Order(1000000, 8800, True))   # 100元100股买单

小明的故事告诉我们:股市并非赌博场所,而是一个充满机会与挑战的市场。只有不断学习、实践和反思,才能在这个市场中立足并取得成功。而对于那些正在探索股市奥秘的投资者来说,小明的故事也许能提供一些有益的启示和借鉴。把故事中的情节和代码中的注释完美结合,让代码学习过程更有趣味性,更容易让人理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/347268.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

现货黄金做日内交易和波段交易有何差异?

在现货黄金投资中&#xff0c;日内交易和波段交易都是投资者常用的手段。但投资者其实搞不懂两者有何区别&#xff0c;有时甚至不清楚自己做的是日内交易还是波段交易&#xff0c;下面我们就来讨论一下这两种交易方法的异同。 两者的区别主要是在持仓的时间上。日内交易顾名思义…

Python算法题集_接雨水

本文为Python算法题集之一的代码示例 题目42&#xff1a;接雨水 说明&#xff1a;给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,…

【计算机网络】【练习题】【新加坡南洋理工大学】【Computer Control Network】

说明&#xff1a; 仅供学习使用。 一、题目描述 该题目描述一个网络中传播时延&#xff08;Transmission Delay&#xff09;的例子。题目如下&#xff1a; 二、问题解答&#xff08;个人&#xff09; 笔者第3问采用均值不等式求解。标答中采用求导数的方法求极值。似乎均值…

el-table 动态渲染多级表头;一级表头根据数据动态生成,二级表头固定

一、表格需求&#xff1a; 实现一个动态表头&#xff0c;一级表头&#xff0c;根据数据动态生成&#xff0c;二级表头固定&#xff0c;每列的数据不一样&#xff0c;难点在于数据的处理。做这种表头需要两组数据&#xff0c;一组数据是实现表头的&#xff0c;另一组数据是内容…

WinSCP如何使用公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

文件名翻译工具,文件名称翻译软件

无论是工作、学习还是生活&#xff0c;我们时常会遇到文件名称难以理解的情况。这时&#xff0c;一款优秀的文件名称翻译软件就显得尤为重要。今天&#xff0c;我要为大家介绍一个备受好评软件——文件批量改名高手&#xff0c;这款软件自带翻译功能&#xff0c;可以帮你轻松实…

分布式锁实现(mysql,以及redis)以及分布式的概念(续)redsync包使用

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物 这张尽量结合上一章进行使用&#xff1a;上一章 这章主要是讲如何通过redis实现分布式锁的 redis实现 这里我用redis去实现&#xff1a; 技术&#xff1a;golang&#xff0c;redis&#xff0c;数据结构 …

2024 年 10 款顶级的数据恢复软件榜单

2024年&#xff0c;随着人工智能、云计算等技术的不断发展&#xff0c;数据已经成为我们生活中不可或缺的一部分。然而&#xff0c;数据丢失的风险仍然存在。删除文件、病毒攻击、硬件损坏和其他情况都可能导致数据丢失。而数据恢复软件就成为解决这一问题的有效方案。 2024 年…

springCloud的ribbon和feign

ribbon方式调用 就是将原来的具体地址&#xff0c;改为了通过服务名去调用。注册中心中有多个服务&#xff0c;相同服务名&#xff0c;就会算作可以调用的服务。 首先得有一个注册中心&#xff0c;然后各种服务注册进去&#xff0c;然后利用ribbon或者feign去调用。 ribbon是直…

微认证 openEuler社区开源贡献实践

文章目录 1. 开源与开源社区2. openEuler 社区概述3.参与openEuler社区贡献4.openEuler软件包开发Linux软件管理——源码编译 1. 开源与开源社区 Richard Matthew Stallman&#xff0c;1983年9月推出GNU项目&#xff0c;并发起自由软件运动(free software movement或free/open…

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料…

Dify学习笔记-应用发布(四)

1、发布为公开 Web 站点 使用 Dify 创建 AI 应用的一个好处在于&#xff0c;你可以在几分钟内就发布一个可供用户使用的 Web 应用&#xff0c;该应用将根据你的 Prompt 编排工作。 如果你使用的是自部署的开源版&#xff0c;该应用将运行在你的服务器上 如果你使用的是云服务&…

3.确认弹窗(ConfirmPopup)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7 在开发中&#xff0c;最常用的弹窗之一表示确认弹窗&#xff0c;为了减少重复的开发工作&#xff0c;所以需要基于Popup进行封装。 1.布局 分为标题、确认内容、按钮三个区域&#xff0c;都是可供调整的。 &l…

java复习篇 数据结构:链表第二节 哨兵

目录 单向链表哨兵 初始 头插 思路 代码 尾插 思路 遍历 遍历验证头插 尾插代码 尾插测试 get 思路 代码 测试 insert 思路 代码 测试 remove 移除头结点 提问 移除指定位置 测试 单向链表哨兵 单向链表里面有一个特殊的节点称为哨兵节点&#xff0c;…

MacOS 无法ping 通 github.com 解决方案

ping github.com 会显示请求超时&#xff1a; PING github.com (192.30.253.112): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2 Request timeout for icmp_seq 3 Request timeout for icmp_seq 4 Request …

一文了解Ceph原理以及常见ceph指令

一、Ceph介绍 什么是分布式存储&#xff1f; 与集中式存储相反&#xff0c;分布式存储通常采用存储单元集群的形式。并且具有在集群节点之间进行数据同步和协调的机制。其目的是为了通过服务器解决大规模&#xff0c;高并发情况下的Web访问问题。 Ceph是一个统一的、分布式的存…

如何利用H5页面引导关注公众号-数灵通

随着流量获取成本的增加&#xff0c;许多企业开始寻找新的引流渠道来储存流量。H5小活动成为了一种有效的引流方式&#xff0c;并且在客户之间传递&#xff0c;形成了裂变效应。企业开始将目光转向H5网站&#xff0c;希望通过引导客户关注公众号来提升品牌影响力。 为了实现这一…

143基于matlab的2D平面桁架有限元分析

基于matlab的2D平面桁架有限元分析&#xff0c;可以改变材料参数&#xff0c;输出平面结构外形&#xff0c;各桁架应力&#xff0c;位移及作用力。可查看节点力&#xff0c;程序已调通&#xff0c;可直接运行。 143 matlab 平面桁架 有限元分析 桁架应力 (xiaohongshu.com)

温湿度传感器原理解析,温湿度传感器的应用场景有哪些?

作为常见的检测装置&#xff0c;现在已经有大大小小几十种传感器出现在我们的日常生活中。作为能够测量环境温度和湿度的传感器&#xff0c;温湿度传感器正是最常见的传感器之一&#xff0c;作为温湿度监测系统的一部分&#xff0c;被广泛应用于智慧机房、智慧楼宇、智慧农业等…

重构改善既有代码的设计-学习(三):重新组织数据

1、拆分变量&#xff08;Split Variable&#xff09; 有些变量用于保存一段冗长代码的运算结果&#xff0c;以便稍后使用。这种变量应该只被赋值一次。 如果它们被赋值超过一次&#xff0c;就意味它们在函数中承担了一个以上的责任。如果变量承担多个责任&#xff0c;它就应该被…