量化交易系统开发-实时行情自动化交易-股票大资金动力指标

news2024/11/12 8:45:21

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。

本篇是结合代码的说说股票TICK数据分析资金动力指标,由于股票没有用户数据,所以想把影响价格波动的动力资金识别出来,这部分需要TICK数据聚合而成,主动力大资金指标通过TICK数据加工到日级,所以还是有一定门槛。

在股票市场中,Tick 数据记录了每一笔成交的详细信息,包括成交时间、成交价格、成交数量等。Tick 数据提供了市场最细粒度的交易信息,是分析市场微观结构、追踪大资金动向的关键数据源之一。主动力大资金指标旨在通过对 Tick 数据的深入分析,识别出大资金对市场的推动作用,为投资者和交易策略提供参考。以下是关于如何基于股票 Tick 数据生成主动力大资金指标的详细扩展。

1. Tick 数据的收集与预处理

生成主动力大资金指标的第一步是收集和预处理 Tick 数据。Tick 数据通常包含每一笔交易的时间戳、成交价格、成交量、买卖双方的信息等。

  • 数据收集:通过交易所提供的 API 或第三方数据供应商获取 Tick 数据。对于高频交易策略,建议使用低延迟的 WebSocket 连接来实时采集 Tick 数据,确保数据的时效性。

  • 数据清洗:由于 Tick 数据量大且可能存在噪声和异常值,需要对原始数据进行清洗。清洗步骤包括:去除价格或成交量异常的记录,过滤掉极小交易量的“噪声”交易,以确保数据质量。

  • 数据整合:将不同来源的 Tick 数据进行整合和标准化,以确保数据的一致性和完整性,尤其是在多交易所采集数据的场景中,需要对不同交易所的时间戳进行同步和校正。

2. 大资金识别与分类

生成主动力大资金指标的核心在于识别市场中大资金的流动,即区分大额交易和一般性交易。通常,大资金的交易对市场具有更大的影响,因此需要采用一定的标准来识别大资金的交易行为。

  • 大资金交易的阈值设定:根据市场整体的流动性和个股的特性,设定一个阈值,用于区分大资金交易和普通交易。例如,可以根据过去一段时间的成交量分布,设定成交量达到某个百分位数的交易为“大资金”交易。通常,将单笔成交量超过某个绝对值(如某个股票平均每笔交易量的 10 倍)视为大资金。

  • 大资金交易的分类:将大资金交易按类型进行分类,例如主动买入、主动卖出等。主动买入是指以卖一价成交的交易,主动卖出则是以买一价成交的交易。通过区分买卖方向,可以进一步分析大资金的市场影响力。

  • 价格冲击分析:通过观察大资金交易对价格的冲击,评估这些交易对市场价格的短期影响。例如,可以计算大资金交易前后若干秒内的价格变化,以量化其冲击效果。

3. 主动力大资金指标的计算

主动力大资金指标旨在量化大资金对市场的影响,核心是评估大资金的净流入和对价格走势的推动力。

  • 净大资金流入计算:净大资金流入是指一定时间窗口内,主动买入的大资金成交量减去主动卖出的大资金成交量。例如,可以在一分钟内累加所有大资金的主动买入和主动卖出的交易量,得到净流入量。净流入为正,表示市场中买方力量较强,净流出为负则表示卖方力量占优。

  • 加权大资金推动力:为了更精确地评估大资金的市场推动力,可以对每笔大资金交易按其对市场价格的影响程度进行加权。加权因子可以考虑交易量、交易时段的流动性等因素。例如,在市场流动性较差的时段,大资金交易对价格的影响可能更大,因此可以给予更高的权重。

  • 累积主动力指标:将净大资金流入在时间上进行累积,生成主动力曲线,以反映大资金在较长时间内的市场推动力。例如,可以计算每天的主动力大资金净流入累积值,生成一个时间序列来评估趋势。

4. 主动力大资金指标的应用

主动力大资金指标能够为投资者提供有关市场大资金动向的重要信息,可用于多个方面的交易决策和市场分析。

  • 趋势识别:主动力大资金指标可以帮助识别市场的趋势变化。例如,当累积的主动力大资金指标持续为正且呈上升趋势时,表明市场中有持续的买入压力,市场可能进入上升趋势;相反,如果指标持续为负,表明市场中卖压较大,可能出现下行趋势。

  • 反转信号:主动力大资金指标的快速变化可以作为市场反转的先行信号。例如,当市场价格在高位横盘时,如果主动力大资金指标由正转负,表明有大量大资金开始卖出,这可能预示着市场将出现回调。

  • 辅助短线策略:对于短线交易者,主动力大资金指标可以作为开平仓信号的辅助参考。当大资金的买入推动力显著增加时,可能是一个短期买入机会;而当大资金的卖出压力增大时,则可以考虑卖出或平仓。

5. 计算中的技术挑战与解决方案

在基于 Tick 数据生成主动力大资金指标的过程中,存在一些技术挑战,主要包括数据量庞大、计算性能要求高、数据的噪声和延迟等。

  • 数据量庞大:Tick 数据的频率非常高,特别是在交易活跃的时段,每秒钟可能有数百笔甚至上千笔成交记录。因此,数据存储和计算的性能要求很高。解决方案是使用内存数据库(如 Redis)来缓存实时 Tick 数据,并定期将历史数据存入分布式存储系统(如 Hadoop 或 Cassandra),以保证数据的读写效率。

  • 计算性能优化:为了在交易决策中实时应用主动力大资金指标,计算必须足够快速。可以使用分布式计算框架(如 Apache Flink 或 Spark Streaming)对 Tick 数据进行实时处理,并使用流式计算技术来降低延迟,保证计算结果的实时性。

  • 数据噪声处理:Tick 数据中包含大量的小额交易,这些交易可能对分析结果产生干扰,因此需要进行噪声处理。例如,可以设定一个最小交易量阈值,仅对超过该阈值的交易进行处理。此外,通过对连续多笔成交进行聚合,可以进一步过滤掉噪声,得到更加稳定的主动力大资金指标。

6. 主动力大资金指标代码参考
# 获取资金动力:主动买1/主动卖-1/无法判断0
# 根据tick划分阶段:1、第一条tick(集合竞价和无集合竞价);2、正常交易;3、尾盘集合竞价最后一条(挂单都为0);4、最后一条close;
# 主动买1:按照顺序if
# 1.第一条数据成交价大于昨日收盘价:包括集合竞价和没有集合竞价数据的第一条,(start >= 1) and (price > pre_close)
# 2.跌停:(当前tick成交价等于跌停价) and (买1交易量为0 or 买1交易量为0),(0 < limit_up_sign < 1)
# 3.当前tick成交价大于上一tick的价格,(price > pre_price)
# # 注掉3.当前tick成交价大于上一tick的卖1挂单价格,(price > pre_a1_p)
# # 注掉3-1.验证3可以通过当前tick成交量占比上一tick的大于等于pre_a1_p小于等于price的卖挂单量,卖挂单量大于50%成交量判断
# # 注掉4.当前tick成交价等于上一tick的卖1挂单价格,通过当前tick买1价大于等于上一tick卖1价判断,(price = pre_a1_p) and (b1_p >= pre_a1_p)
# 主动卖-1:按照顺序if
# -1.第一条数据成交价小于昨日收盘价:包括集合竞价和没有集合竞价数据的第一条,(start > 1) and (price < pre_close)
# -2.涨停:(当前tick成交价等于涨停价) and (卖1交易量为0 or 买1交易量为0),(limit_up_sign > 1)
# -3.当前tick成交价小于上一tick的价格,(price < pre_b1_p)
# # 注掉-3.当前tick成交价小于上一tick的买1挂单价格,(price < pre_b1_p)
# # 注掉-3-1.验证3可以通过当前tick成交量占比上一tick的小于等于pre_b1_p大于等于price的卖挂单量,买挂单量大于50%成交量判断
# # 注掉-4.当前tick成交价等于上一tick的买1挂单价格,通过当前tick卖1价小于等于上一tick买1价判断,(price = pre_b1_p) and (a1_p <= pre_b1_p)
# 无法判断0:
# 1.第一条数据成交价等于昨日收盘价:包括集合竞价和没有集合竞价数据的第一条,(start > 1) and (price == pre_close)
    def _get_dl_tick(self, df, before):
        df_all = before
        df_pre = df_all[df_all.datetime < df.datetime][-1:]
        # 处理非第一条数据,但第二条数据与上一条时间一样,导致没有数据
        if (len(df_pre) == 0) and (df.start == 0):
            return 0

        # start 0 表示非第一tick条数据 1 表示第一tick为集合竞价数据 2 表示第一tick不是集合竞价数据
        # 1、第一条tick数据,判断price>pre_close为主动买1;price<pre_close为主动卖1;price=pre_close为不确认0
        if df.start >= 1:
            # 主动买1:第一条数据成交价大于昨日收盘价:包括集合竞价和没有集合竞价数据的第一条,(start >= 1) and (price > pre_close)
            if df.dvwap > df.pre_close:
                return 1
            # 主动卖-1:第一条数据成交价小于昨日收盘价:包括集合竞价和没有集合竞价数据的第一条,(start > 1) and (price < pre_close)
            elif df.dvwap < df.pre_close:
                return -1
            else:
                return 0
        # 3、尾盘竞价最后一条数据,挂单价格和量都为空,辅助时间准确判断,判断涨跌停和非涨跌停:涨跌停判断挂单量变,非涨跌停根据挂单位置判断;
        elif (df.b1_p == 0) and (df.a1_p == 0):
            # 跌停
            if (df.limit_up_sign > 0) and (df.limit_up_sign < 1):
                # 上一tick也是跌停
                if (df_pre.limit_up_sign.values[0] > 0) and (df_pre.limit_up_sign.values[0] < 1):
                    return 1
                # 上一tick不是跌停
                else:
                    return -1
            # 涨停
            elif df.limit_up_sign > 1:
                # 上一tick也是涨停
                if df_pre.limit_up_sign.values[0] > 1:
                    return -1
                # 上一tick不是涨停
                else:
                    return 1
            else:
                if df.dvwap > df_pre.a1_p.values[0]:
                    return 1
                elif df.price < df_pre.b1_p.values[0]:
                    return -1
                else:
                    return 0
        # 4、收盘close最后一条,有可能上一tick买卖1挂单价格都为0,判断涨跌停和非涨跌停:涨跌停判断挂单量变,非涨跌停根据挂单位置判断;
        elif (df.close > 0) and (df.datetime >= df.datetime[:10] + ' 15:00:00'):
            df_pre_2 = df_all[df_all.datetime < df.datetime][-2:-1]
            # 跌停
            if (df.limit_up_sign > 0) and (df.limit_up_sign < 1):
                # 上一tick也是跌停
                if (df_pre.limit_up_sign.values[0] > 0) and (df_pre.limit_up_sign.values[0] < 1):
                    # 如果上一tick买卖挂单量价都为0,用上上tick数据判断
                    if (df_pre.b1_p.values[0] == 0) and (df_pre.a1_p.values[0] == 0):
                        # 如果当前tick的一档挂单量对比上一tick的一档挂单量是上涨和持平的则是消耗封单的资金即为主动买
                        if (df.a1_v + df.dvolume) >= df_pre_2.a1_v.values[0]:
                            return -1
                        else:
                            return 1
                    else:
                        # 如果当前tick的一档挂单量对比上一tick的一档挂单量是上涨和持平的则是消耗封单的资金即为主动买
                        if (df.a1_v + df.dvolume) >= df_pre.a1_v.values[0]:
                            return -1
                        else:
                            return 1
                # 上一tick不是跌停
                else:
                    return -1
            # 涨停
            elif df.limit_up_sign > 1:
                # 上一个tick也是涨停
                if df_pre.limit_up_sign.values[0] > 1:
                    # 如果上一tick买卖挂单量价都为0,用上上tick数据判断
                    if (df_pre.b1_p.values[0] == 0) and (df_pre.a1_p.values[0] == 0):
                        # 如果当前tick的一档挂单量对比上一tick的一档挂单量是上涨和持平的则是消耗封单的资金即为主动买
                        if (df.b1_v + df.dvolume) >= df_pre_2.b1_v.values[0]:
                            return 1
                        else:
                            return -1
                    else:
                        # 如果当前tick的一档挂单量对比上一tick的一档挂单量是上涨和持平的则是消耗封单的资金即为主动买
                        if (df.b1_v + df.dvolume) >= df_pre.b1_v.values[0]:
                            return 1
                        else:
                            return -1
                # 上一tick不是涨停
                else:
                    return 1
            else:
                # 主动买3.当前tick成交均价大于上一tick的成交均价格,(dvwap > pre_dvwap)
                if df.dvwap > df.pre_dvwap:
                    return 1
                # 主动卖-3.当前tick成交均价小于上一tick的成交均价格,(dvwap < pre_dvwap)
                elif df.dvwap < df.pre_dvwap:
                    return -1
                # 不确定0
                else:
                    return 0
        # 2、正常交易,非第一条start、收盘最后一条close、尾盘竞价最后一条数据
        else:
            # tick涨跌停标记-默认0,与pre_close比例[1.2, 1.1, 1.05, 0.95, 0.9, 0.8]
            # 主动买2.跌停:(当前tick成交价等于跌停价) and (卖1交易量为0 or 买1交易量为0),(0 < limit_up_sign < 1)
            if (df.limit_up_sign > 0) and (df.limit_up_sign < 1):
                # 上一tick也是跌停
                if (df_pre.limit_up_sign.values[0] > 0) and (df_pre.limit_up_sign.values[0] < 1):
                    # 如果当前tick的一档挂单量对比上一tick的一档挂单量是上涨和持平的则是消耗封单的资金即为主动买
                    if (df.a1_v + df.dvolume) >= df_pre.a1_v.values[0]:
                        return -1
                    else:
                        return 1
                # 上一tick不是跌停
                else:
                    return -1
            # 主动卖-2.涨停:(当前tick成交价等于涨停价) and (卖1交易量为0 or 买1交易量为0),(limit_up_sign > 1)
            elif df.limit_up_sign > 1:
                # 上一tick也是涨停
                if df_pre.limit_up_sign.values[0] > 1:
                    # 如果当前tick的一档挂单量对比上一tick的一档挂单量是上涨和持平的则是消耗封单的资金即为主动买
                    if (df.b1_v + df.dvolume) >= df_pre.b1_v.values[0]:
                        return 1
                    else:
                        return -1
                # 上一tick不是涨停
                else:
                    return 1
            # 非涨跌停:以价格为准判断,兼容价格在买卖挂单1之外逻辑
            else:
                # 主动买3.当前tick成交均价大于上一tick的成交均价格,(dvwap > pre_dvwap)
                if df.dvwap > df.pre_dvwap:
                    return 1
                # 主动卖-3.当前tick成交均价小于上一tick的成交均价格,(dvwap < pre_dvwap)
                elif df.dvwap < df.pre_dvwap:
                    return -1
                # 不确定0
                else:
                    return 0

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在服务器里安装2个conda

1、安装新的conda 下载地址&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 本文选择&#xff1a;Anaconda3-2023.03-1-Linux-x86_64.sh 安装&#xff1a;Ubuntu安装Anaconda详细步骤&#xff08;Ubuntu22.04.1&#xff…

OceanBase中,如何解读 obdiag 收集的火焰图 【DBA早下班系列】

1. 前言 在之前的文章 遇到性能问题&#xff0c;如何给OceanBase“拍CT“&#xff08;火焰图与扁鹊图&#xff09;中&#xff0c;分享了obdiag 快速收集火焰图的方法&#xff0c;那么&#xff0c;紧接着的问题便是&#xff1a;收集到火焰图和扁鹊图之后&#xff0c;该如何解读…

【数据库实验一】数据库及数据库中表的建立实验

目录 实验1 学习RDBMS的使用和创建数据库 一、 实验目的 二、实验内容 三、实验环境 四、实验前准备 五、实验步骤 六、实验结果 七、评价分析及心得体会 实验2 定义表和数据库完整性 一、 实验目的 二、实验内容 三、实验环境 四、实验前准备 五、实验步骤 六…

基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(下)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器&#xff08;上&#xff09; 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器&#xff08;下&#xff09; 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇&#xff08;上&#xff09; 【…

设计模式-七个基本原则之一-单一职责原则 + SpringBoot案例

单一职责原理:(SRP) 面向对象七个基本原则之一 清晰的职责&#xff1a;每个类应该有一个明确的职责&#xff0c;避免将多个责任混合在一起。降低耦合&#xff1a;通过将不同的职责分开&#xff0c;可以降低类之间的耦合度&#xff0c;提高系统的灵活性。易于维护&#xff1a;当…

【Linux】进程信号全攻略(一)

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 信号的概念 二&#xff1a;&#x1f525; 信号产生的方式 &#x1f98b; 使用键盘&#x1f98b; 系统调用函数&#x1f98b; 软件条件&#x1f98b; 进程异…

selenium+chromedriver下载与安装

安装selenium 使用pip安装selenium&#xff1a; pip install selenium安装成功&#xff1a; 安装WebDriver 根据你使用的浏览器下载相应的 WebDriver。 Chrome&#xff1a;下载地址Firefox&#xff1a;下载地址Edge&#xff1a;下载地址Safari&#xff1a;下载地址 1、c…

前端环境配置

对于换公司的小伙伴来讲&#xff0c;重新安装环境&#xff0c;百度或许稍微有点麻烦&#xff0c;本文章让你无脑式直接操作&#xff0c;保证环境畅通无阻。 1.安装nvm-setup 该插件是一款管理nodeJs的包&#xff0c;无需你单独下载nodeJs去安装&#xff0c;只需要下载安装此…

python(自用查看版)

目录 1.注意事项 1.1 python的除法不是整除&#xff0c;得到的是浮点数 1.2算术符号基于数学的算术优先级。具体可自行查看。 1.3注释 1.4缩进 1.5换行 1.6常见关键字 1.7续行符 1.8报错 1.9赋值 1.10比较运算符 2.常量和表达式 3.变量 4.数据类型 4.1整型int …

基于Prometheus的client_golang库实现应用的自定义可观测监控

文章目录 1. 安装client_golang库2. 编写可观测监控代码3. 运行效果4. jar、graalvm、golang编译运行版本对比 前文使用javagraalvm实现原生应用可观测监控&#xff1a; prometheus client_java实现进程的CPU、内存、IO、流量的可观测&#xff0c;但是部分java依赖包使用了复杂…

Docker网络概述

1. Docker 网络概述 1.1 网络组件 Docker网络的核心组件包括网络驱动程序、网络、容器以及IP地址管理&#xff08;IPAM&#xff09;。这些组件共同工作&#xff0c;为容器提供网络连接和通信能力。 网络驱动程序&#xff1a;Docker支持多种网络驱动程序&#xff0c;每种驱动程…

新160个crackme - 094-TheBigMan-crackme6

运行分析 需破解Name和Serial PE分析 LCC win32程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索字符串&#xff0c;进入关键函数 ida动调&#xff0c;发现关键判断函数func_1 进入后&#xff0c;发现Name长度需满足一定要求&#xff0c;且func_2返回值不能…

大数据-214 数据挖掘 机器学习理论 - KMeans Python 实现 算法验证 sklearn n_clusters labels

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【Django】视图函数

【Django】视图函数 视图函数的本质是Python中的函数&#xff0c;视图函数负责处理用户的请求并返回响应&#xff0c;该响应可以是网页的HTML内容、重定向、404错误、XML文档、图像或者任何东西&#xff0c;一般在应用中的views.py编写&#xff0c;示例代码如下&#xff1a; …

kafka+zookeeper的搭建

kafka从2.8版本开始&#xff0c;就可以不用配置zookeeper了&#xff0c;但是也可以继续配置。我目前使用的kafka版本是kafka_2.12-3.0.0.tgz&#xff0c;其中前面的2.12表示是使用该版本的scala语言进行编写的&#xff0c;而后面的3.00才是kafka当前的版本。 通过百度网盘分享…

了解bootstrap改造asp.net core MVC的样式模板

我们都知道&#xff0c;在使用默认的asp.net core MVC模板建立项目的时候&#xff0c;里面的样式是已经事先被写好了的。一般来说都在css目录下的site.css和bootstrap.css及下面的bootstrap.min.css中。我们打开bootstrap这些样式文件&#xff0c;里面有大量的样式类的定义&…

HTMLCSS:旋转的动态卡片

效果演示 这段代码创建了一个具有动态背景和渐变效果的卡片。卡片背景有一个无限循环的旋转动画&#xff0c;增加了视觉吸引力。这种效果可以用于展示个人信息、项目介绍或其他需要吸引用户注意的内容。 HTML <div class"card"><h3>前端Hardy</h3&…

深入Pillow:处理图像下载中的意外挑战

在当今数字化时代&#xff0c;获取和处理图像数据已经成为了许多应用程序的核心功能。从社交媒体到电子商务&#xff0c;图像的获取和处理对于用户体验至关重要。下载图片不仅能够丰富我们的内容&#xff0c;还能够通过分析图像数据为我们的应用提供更多价值。然而&#xff0c;…

管理 Elasticsearch 变得更容易了,非常容易!

作者&#xff1a;来自 Elastic Ken Exner Elasticsearch 用户&#xff0c;我们听到了你的心声。管理 Elasticsearch 有时会变得很复杂&#xff0c;面临的挑战包括性能调整、问题检测和资源优化。我们一直致力于简化你的体验。今天&#xff0c;我们宣布了自收购 Opster 以来的一…