交易信号有效性测算1——N日涨跌幅

news2024/12/27 13:29:38

在交易信号发出后,我们需要一些程序化的流程,来验证信号的有效性,其中信号发出后N日的涨跌幅就是一个比较常见的任务

布林带交易策略

我们以布林带(BOLL)交易策略为示例:

  • 中轨线 = N日移动平均线
  • 上轨线 = 中轨线 + k 标准差
  • 下轨线 = 中轨线 - k 标准差

交易信号:

  • 买点:收盘价下穿布林带下方
  • 卖点:收盘价上穿布林带上方

我们在python中,使用talib.BBANDS()来计算,参数包含:

  • 中轨线 = {timeperiod} 日移动平均线,移动平均线计算规则为 {matype}
  • 上轨线 = 中轨线 + {nbdevup} 标准差
  • 下轨线 = 中轨线 - {nbdevdn} 标准差

其中 matype值对应的算法为:0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3

在这里插入图片描述

N日涨跌幅测算

统计信号发出后,计算N日的涨跌幅:

  1. 首先有个对比,即全时间段的N日涨跌幅
  2. 计算信号发出后N日的涨跌幅
  3. 由于有些信号存在连续性,因此统计跳过一些连续的交易日信号后,重新统计N日涨跌幅
def n_day_rise_fall(stock_df, n=10, skip_n=None):
    """计算未来N日的涨跌幅
    :param stock_df: 统计涨跌幅的dataframe
    :param n: 未来N日的涨跌幅
    :param skip_n: 跳过一段时间,统计未来N日的涨跌幅
    """
    stock_df.reset_index(inplace=True, drop=True)  # 重置index
    stock_df.sort_values("date", inplace=True)  # 按时间,从小到大排序
    collect_dict = {}
    
    # =========== 以每一天为参考,统计未来N日涨跌幅 ==============
    pct_series = stock_df['close'].pct_change(n)
    collect_dict['全部涨跌幅'] = (pct_series.dropna().values * 100).tolist()
    
    # =========== 统计买点之后未来N日涨跌幅 ==============
    buy_index = stock_df[stock_df['BUY'] == True].index
    n_after_buy_list = []
    for _buy_i in buy_index:
        close_values = stock_df.loc[_buy_i:(_buy_i + n), :]['close'].values
        range_value = (close_values[-1] - close_values[0]) / close_values[0]
        n_after_buy_list.append(range_value * 100)
    collect_dict[f"未来{n}日涨跌幅"] = n_after_buy_list
    
    # ======== 跳过买点的连续性,统计未来N日的涨跌幅 ==========
    if skip_n:
        skip_n_after_buy_list = []
        record_buy_index = -skip_n
        for _buy_i in buy_index:
            if _buy_i < record_buy_index + skip_n:
                continue
            close_values = stock_df.loc[_buy_i:(_buy_i + n), :]['close'].values
            range_value = (close_values[-1] - close_values[0]) / close_values[0]
            skip_n_after_buy_list.append(range_value * 100)
            record_buy_index = deepcopy(_buy_i)
        collect_dict[f'跳过{skip_n}的未来{n}日涨跌幅'] = skip_n_after_buy_list
    return collect_dict

示例

其中from data_utils import total_stock_market_data,这个是博主自己用的数据源,大家可以换成自己的

import pandas as pd
from data_utils import total_stock_market_data
from copy import deepcopy
import talib
import numpy as np


def n_day_rise_fall(stock_df, n=10, skip_n=None):
    """计算未来N日的涨跌幅
    :param stock_df: 统计涨跌幅的dataframe
    :param n: 未来N日的涨跌幅
    :param skip_n: 跳过一段时间,统计未来N日的涨跌幅
    """
    stock_df.reset_index(inplace=True, drop=True)  # 重置index
    stock_df.sort_values("date", inplace=True)  # 按时间,从小到大排序
    collect_dict = {}
    # =========== 以每一天为参考,统计未来N日涨跌幅 ==============
    pct_series = stock_df['close'].pct_change(n)
    collect_dict['全部涨跌幅'] = (pct_series.dropna().values * 100).tolist()
    # =========== 统计买点之后未来N日涨跌幅 ==============
    buy_index = stock_df[stock_df['BUY'] == True].index
    n_after_buy_list = []
    for _buy_i in buy_index:
        close_values = stock_df.loc[_buy_i:(_buy_i + n), :]['close'].values
        range_value = (close_values[-1] - close_values[0]) / close_values[0]
        n_after_buy_list.append(range_value * 100)
    collect_dict[f"未来{n}日涨跌幅"] = n_after_buy_list
    # ======== 跳过买点的连续性,统计未来N日的涨跌幅 ==========
    if skip_n:
        skip_n_after_buy_list = []
        record_buy_index = -skip_n
        for _buy_i in buy_index:
            if _buy_i < record_buy_index + skip_n:
                continue
            close_values = stock_df.loc[_buy_i:(_buy_i + n), :]['close'].values
            range_value = (close_values[-1] - close_values[0]) / close_values[0]
            skip_n_after_buy_list.append(range_value * 100)
            record_buy_index = deepcopy(_buy_i)
        collect_dict[f'跳过{skip_n}的未来{n}日涨跌幅'] = skip_n_after_buy_list
    return collect_dict


def cal_describe(data_dict):
    """统计每一个个股的情况"""
    des_dict = {}
    for _key, _value in data_dict.items():
        _value = np.array(_value)
        des_dict[_key] = {
            "num": len(_value),
            "mean": _value.mean(),
            "std": _value.std(),
            "1/4分位": np.percentile(_value, 25),
            "中位数": np.percentile(_value, 50),
            "3/4分位": np.percentile(_value, 75),
        }
    return des_dict


def add_boll_feature(df: pd.DataFrame):
    """计算指标[BUY][SELL]"""
    upper, middle, lower = talib.BBANDS(df["close"], timeperiod=14)  # 计算布林带指标
    df['boll_upper'] = upper
    df['boll_middle'] = middle
    df['boll_lower'] = lower
    # 判断买点与卖点
    df.dropna(inplace=True)
    df['BUY'] = None
    df['SELL'] = None
    for _index, series in df.iterrows():
        if series['close'] <= series['boll_lower']:
            df.loc[_index, "BUY"] = True
        if series['close'] >= series['boll_upper']:
            df.loc[_index, "SELL"] = True
    return df


def main():
    stock_dict = total_stock_market_data(limit=3, start_date="2020-01-01", end_date="2023-01-01")
    describe_collect_dict = {}
    for _key, _stock_df in stock_dict.items():
        _stock_df = _stock_df[["date", "open", "close", "high", 'low']]
        _stock_df.sort_values("date", inplace=True)
        stock_df = deepcopy(_stock_df)
        stock_df = add_boll_feature(stock_df)
        _coll_dict = n_day_rise_fall(stock_df, skip_n=5)
        describe_dict = cal_describe(_coll_dict)
        describe_collect_dict[_key] = describe_dict


if __name__ == '__main__':
    main()

比如数据源是:
在这里插入图片描述
最终得到的:

{
	'全部涨跌幅': {
		'num': 705, 
		'mean': 0.048260603236591246, 
		'std': 7.074501373770825, 
		'1/4分位': -4.712887188691961, 
		'中位数': -0.509262075967043, 
		'3/4分位': 4.109585014510864}, 
	'未来10日涨跌幅': {
		'num': 34, 
		'mean': 0.9538746236276364, 
		'std': 6.347669735599827, 
		'1/4分位': -3.5691535297657966, 
		'中位数': -0.6329642309802745, 
		'3/4分位': 5.306936708754319}, 
	'跳过5的未来10日涨跌幅': {
		'num': 19, 
		'mean': -0.7768875022887046, 
		'std': 5.618893194327587, 
		'1/4分位': -4.332845170390464, 
		'中位数': -1.5776713355815666, 
		'3/4分位': 1.9155965506750263}
}

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

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

相关文章

Linux 上的 .NET 崩溃了怎么抓 Dump

一&#xff1a;背景 1. 讲故事 训练营中有朋友问在 Linux 上如何抓 crash dump&#xff0c;在我的系列文章中演示的大多是在 Windows 平台上&#xff0c;这也没办法要跟着市场走&#xff0c;谁让 .NET 的主战场在工控 和 医疗 呢&#xff0c;上一张在 合肥 分享时的一个统计图…

Unity3D:项目 ID 不匹配的情况下如何应对

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 如果在 Services 窗口的 Settings 中找不到项目 ID&#xff0c;或者如果发现项目 ID 不匹配&#xff0c;这可能是因为使用了较早版本的 Unity 来升级项目&#xff0c;或在脱机时创建…

Win10电脑应用程序并行配置不正确怎么办?

Win10电脑应用程序并行配置不正确怎么办&#xff1f;有用户在运行某些软件时&#xff0c;突然提示出错信息“应用程序无法启动&#xff0c;因为应用程序的并行配置不正确&#xff0c;出现这一问题可能是禁用本地相关服务&#xff0c;或者新安装的系统缺少必要的VC 运行。那么具…

PTQ-PDPMV1 PROSOFT DP主网络接口模块

Quantum的PROFIBUS DP主网络接口模块 PTQ-PDPMV1 PROFIBUS DP主网络接口允许Quantum处理器与支持PROFIBUS DP V0或V1的从设备轻松连接。该模块作为PROFIBUS网络和处理器之间的输入/输出模块。PROFIBUS是工业自动化中最常用的协议之一。应用领域包括电力和配电、石化、水和天然…

基于stm32mp157 linux开发板ARM裸机开发教程7:Cortex-A7 GPIO 实验(连载中)

前言&#xff1a; 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中&#xff0c;使其内容更加丰富&#xff0c;讲解更加细致&#xff0c;全文所使用的开发平台均为华清远见FS-MP1A开发板&#xff08;STM32MP157开发板&#xff09; 针对对FS-MP1A开发板&…

如何在命令行编译运行java程序?

2023年5月29日&#xff0c;周一下午&#xff1a; 好久没写java程序了&#xff0c;今天居然忘了怎么用命令行编译运行java程序了&#xff0c;还好后来想起来了&#xff0c;为了避免忘记&#xff0c;写篇博客记录一下 1、先用记事本等编辑器写一个java程序&#xff0c;文件名要和…

网络货运系统源码 网络货运平台源码,货运APP源码 货物运输管理源码

网络货运系统源码 网络货运平台源码&#xff0c;货运APP源码 货物运输管理源码 网络货运为无车承运人更名而来&#xff0c;网络货运平台的好处可以节省找车找货的时间与成本。根据国家对智慧物流行业的发展规划&#xff0c;及《网络平台道路货物运输经营管理办法》等相关法律法…

github创建仓库和拉取代码

目录 一、git创建仓库 第一步&#xff1a;首先登录github 第二步&#xff1a;进入建立的仓库(或者新建仓库) 第三步&#xff1a;创建成功 第四步&#xff1a;在本地新建一个文件夹&#xff0c;然后在文件夹下打开git bash 第五步&#xff1a;在git bash命令框执行git init…

Linux:centos:修改临时ip永久ip

使用 ifconfig 查看网卡信息以及ip 临时配置ip 找到要修改ip的网卡的名称&#xff08;我这里使用名称为&#xff1a;ens33网卡&#xff09; # ifconfig 网卡名 ip /子网掩码 ifconfig ens33 192.168.1.2/24 配置永久ip 去配置网卡文件 vi /vim 或 nano vim /etc/s…

腾讯云轻量服务器和云服务器区别(超详细全解析)

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器成本低&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CVM适…

10 个对于Android开发者有用的Kotlin扩展函数#1

10 个对于Android开发者有用的Kotlin扩展函数 使用扩展函数来提高安卓开发体验 什么是扩展功能&#xff1f; Kotlin 中的扩展函数允许您向现有类添加新功能&#xff0c;而无需继承它或修改类本身。这是从类定义外部扩展类功能的便捷方式。 Log 您可以any object使用此扩展…

【ABAQUS】什么是剪切闭锁?剪切闭锁会导致什么?

“完全积分”是指当单元具有规则形状时&#xff0c;对单元刚度矩阵中的多项式项进行精确积分所需的高斯点数。对于六面体和四边形元素&#xff0c;“规则形状”意味着边缘是直的&#xff0c;并以直角相交&#xff0c;任何边缘节点都位于边缘的中点。 完全积分的线性元素在每个…

6种常见电流检测电路设计方案

电流检测电路设计方案&#xff08;一&#xff09; 低端检流电路的检流电阻串联到地&#xff08;图1&#xff09;&#xff0c;而高端检流电路的检流电阻是串联到高电压端&#xff08;图2&#xff09;。两种方法各有特点&#xff1a;低端检流方式在地线回路中增加了额外的线绕电…

正则表达式快速上手

一、推荐个正则表达式练习网站&#xff1a;regex101: build, test, and debug regexhttps://regex101.com/ 二、正则表达式常用的几个符号 &#xff08;一&#xff09;限定符 1. &#xff1f;&#xff1a; 表示匹配的字符串中&#xff0c;&#xff1f;前面的字符可有可无&a…

VUE3.0 路由跳转之后页面停留在上一个浏览页面位置不会回到顶部问题

方式一&#xff1a;普通用法&#xff0c;vue2.0也可用 // 一般方式路由拦截 export default {// 组件守护器beforeRouteEnter(to, from, next) {// A跳转到B&#xff0c;B页面停留在A页面的滚动位置&#xff1b;解决方法&#xff1a;将scrollTop设置为0window.scroll(0, 0);ne…

使用docker部署mysql的主从复制

前言&#xff1a; 客户需要数据库做一个备份&#xff0c;所以这次部署mysql的主从复制&#xff0c;由于测试原因两个mysql服务都安装在一台服务器上&#xff0c;实际部署中一般分开部署。 介绍&#xff1a; 用途&#xff1a; 实时灾备&#xff0c;用于故障切换读写分离&…

excel常用操作

1 基础操作 1.1 冻结首行 选中需要冻结的行&#xff0c;视图--冻结窗格&#xff0c;从而使其固定显示。

提权神器:WindowsVulnScan

简介 这是一款基于主机的漏洞扫描工具&#xff0c;采用多线程确保可以快速的请求数据&#xff0c;采用线程锁可以在向sqlite数据库中写入数据避免database is locked的错误&#xff0c;采用md5哈希算法确保数据不重复插入。 它可以实现自动化对目标主机操作系统信息收集&…

【开发者指南】如何在MyEclipse中使用 XML编辑器

XML编辑器包括高级XML编辑功能。通过本文&#xff0c;你将了解其编辑功能和网页XML编辑&#xff0c;一起来看看吧~ 1. Web XML编辑器 MyEclipse Web XML编辑器包括高级XML编辑功能&#xff0c;如: 语法高亮显示标签和属性内容辅助实时验证(在您输入时)文档内容的源视图、设计…

图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)

https://www.cnblogs.com/polly333/p/7280764.html https://www.cnblogs.com/polly333/p/7280764.html https://www.cnblogs.com/polly333/p/7280764.html 一、图像增强算法原理 图像增强算法常见于对图像的亮度、对比度、饱和度、色调等进行调节&#xff0c;增加其清晰度&a…