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

news/2024/6/14 16:39:10 标签: 区块链

马西森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股买单

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


http://www.niftyadmin.cn/n/5344582.html

相关文章

自然语言处理(NLP)的发展

自然语言处理的发展 随着深度学习和大数据技术的进步&#xff0c;自然语言处理取得了显著的进步。人们正在研究如何使计算机更好地理解和生成人类语言&#xff0c;以及如何应用NLP技术改善搜索引擎、语音助手、机器翻译等领域。 方向一&#xff1a;技术进步 自然语言处理&…

《游戏-01_3D-开发》之—人物动画控制器

创建变量&#xff0c; 创建线&#xff0c; 连接&#xff0c; 选中线会变为蓝色&#xff0c;新增变量&#xff0c; 设置线&#xff0c; 双击子层进入子层&#xff0c; 创建变量&#xff0c; 双击SkillPanel 拖拽好之后返回上一层&#xff0c; 依次连接&#xff0c; 设置线&#…

热门技术问答 | 请 GaussDB 用户查收

近年来&#xff0c;Navicat 与华为云 GaussDB 展开一系列技术合作&#xff0c;为 GaussDB 用户提供面向管理开发工具的生态工具。Navicat 现已完成 GaussDB 主备版&#xff08;单节点、多节点&#xff09;和分布式数据库的多项技术对接。Navicat 通过工具的流畅性和实用性&…

# [NOI2019] 斗主地 洛谷黑题题解

[NOI2019] 斗主地 题目背景 时限 4 秒 内存 512MB 题目描述 小 S 在和小 F 玩一个叫“斗地主”的游戏。 可怜的小 S 发现自己打牌并打不过小 F&#xff0c;所以他想要在洗牌环节动动手脚。 一副牌一共有 n n n 张牌&#xff0c;从上到下依次标号为 1 ∼ n 1 \sim n 1∼…

Java设计模式中的代理模式

Java设计模式中的代理模式 代理模式是一种结构型设计模式&#xff0c;它提供了一个代理对象&#xff0c;以控制对其他对象的访问。代理可以充当中介&#xff0c;用于控制对真实对象的访问。 代码举例演示 静态代理&#xff1a; // 接口 interface Subject {void request();…

腾讯云短信开发

短信服务应用申请 """ 准备工作 1&#xff09;创建短信应用 - 应用管理 2&#xff09;申请短信签名 - 国内短信 > 签名管理 3&#xff09;申请短信模块 - 国内短信 > 正文模板管理 """python中开发腾讯云短信服务 """ 1…

java获取一段音频/mp3的时长

引言 在日常开发中&#xff0c;经常会遇到产品经理提出一个需求“上传音乐/音频”&#xff0c;而且还得显示出音频的播放时长。那我们直接世界上最简单的实现方案&#xff0c;必须是最简单&#xff0c;多一句啰嗦不准点赞。 How to do 1.提前引入包 <!--视频多媒体工具包…

C# 将HTML网页、HTML字符串转换为PDF文件

将HTML转换为PDF可实现格式保留、可靠打印、文档归档等多种用途&#xff0c;满足不同领域和情境下的需求。本文将通过以下两个示例&#xff0c;演示如何使用第三方库Spire.PDF for .NET和QT插件在C# 中将Html 网页&#xff08;URL&#xff09;或HTML字符串转为PDF文件。 HTML转…