Hikyuu教程:简单波动率(EMV)择时交易系统的构建与实现

news2024/11/24 13:11:08

今日,我们将探讨如何借助 hikyuu 框架实现简单波动指标 EMV 的择时系统。与以往稍有不同的是,本次我们将采用策略部件仓库的写法来完成示例代码,以便大家进一步了解和熟悉仓库的使用方法。

什么是简易波动指标(EMV)

首先,我们需要了解EMV指标的基本原理。简易波动指标(EMV),是为数不多的考虑价量关系的技术指标。在股价下跌的过程中,由于买盘力量的逐渐减弱,成交量会相应减少,进而导致EMV数值的下降。当股价跌至某一合理的支撑区域时,低价买入的订单会重新激活市场,使得成交量再度增加,此时EMV数值也会相应上升。当EMV数值由负转正并逐渐趋近于零时,这通常意味着有坚定的资金成功扭转了股价的下跌趋势,市场行情开始反转上扬,并发出新的买入信号。

关于EMV的计算方法,具体步骤如下:

  1. 计算MID值,MID = (TH + TL) / 2 - (YH + YL) / 2。其中,TH代表当天最高价,TL代表当天最低价,YH代表前日最高价,YL代表前日最低价。MID值大于零意味着当天的平均价格高于前日的平均价格。
  2. 计算BRO值,BRO = VOL / (H - L)。其中,VOL代表交易量,H和L分别代表同一天的最高价和最低价。
  3. 计算EM值,EM = MID / BRO。
  4. 计算EMV值,EMV为EM的N日简单移动平均值。

通过以上步骤,我们可以得到EMV指标的具体数值。

实现 EMV 指标

通过 shell 进入本地 hub 目录,输入如下代码: “python setup.py create -t ind -n emv”,如:
在这里插入图片描述

该命令将在 ind 目录下生成 part.py 和 test.py 两个文件,修改 part.py 来实现 EMV:
在这里插入图片描述

接着可以在 test.py 中进行测试,比如我们在其中绘制 emv 的曲线,如:
在这里插入图片描述

现在,可以直接在 ipython 中使用 emv,比如:

In [6]: s = sm['sh000001']
In [7]: k = s.get_kdata(Query(Datetime(20190101)))
In [8]: ind = get_part("start.ind.emv")
In [9]: ind(k).plot()

在这里插入图片描述

实现 EMV 择时系统

现在,我们使用 EMV 指标来实现一个择时系统:EMV 在0 以下表示弱势,在0 以上表示强势;EMV 由负转正应买进,由正转负应卖出。

同样,在 shell 中键入 “python setup.py create -t sys -n emv择时”,然后修改 part.py 文件:

def part(n: int = 14, tm: TradeManager = None) -> System:
    """
    使用简易波动率指标(EMV)的交易系统。
    EMV 在0 以下表示弱势,在0 以上表示强势;EMV 由负转正应买进,由正转负应卖出。
    """
    local_hub = get_current_hub(__file__)
    emv = get_part(f'{local_hub}.ind.emv', n=n)
    my_sg = SG_Bool(emv > 0, emv <= 0)
    my_tm = crtTM() if tm is None else tm
    my_mm = MM_Nothing()
    my_sys = SYS_Simple(tm=my_tm, sg=my_sg, mm=my_mm)
    return my_sys

在 test.py 中,以平安银行为例,来测试这个择时系统策略:

from hikyuu.interactive import *
try:
    from .part import *
except:
    from part import *

import sys
if sys.platform == 'win32':
    import os
    os.system('chcp 65001')

if __name__ == "__main__":
    local_hub = get_current_hub(__file__)
    update_hub(local_hub)

    my_sys = get_part(f"{local_hub}.sys.emv择时")
    print(my_sys)

    if len(sys.argv) <= 1:
        import matplotlib.pylab as plt
        stk = sm['sz000001']
        my_sys.run(stk, Query(Datetime(20120101)))
        my_sys.performance()
        plt.show()

在这里插入图片描述

交易成本的影响

上面的测试中,已平仓交易总数166次,结合之前 EMV 指标图可以看到,这个系统的交易频次是比较高的。众所周知,交易频次越高交易成本的影响就越大,而上面默认创建的 TM 是使用的零成本进行的计算,那么让我们看看加入交易成本后,系统的盈利情况。

使用交易成本,只需要创建一个带有交易成本计算函数的 TM 实例并赋值给 SYS 即可,如下所示。

	my_tm = crtTM(Datetime(20120101), init_cash=100000,
                       cost_func=TC_FixedA2017())
        my_sys.tm = my_tm
        my_sys.run(stk, Query(Datetime(20120101)))
        my_sys.performance()

在这里插入图片描述
原本还有 0.98% 盈利的系统,现在直接亏到 -53%!

为什么使用 hub 的方式

hub 本质是一种规范的命名和组织方式,实际上使用 python 包和函数也是可以的。但规范的命名和组织会带来一些额外的方便,比如更好的文件目录拷贝粘贴修改,还有像下面这样,我们可以快速比较目前已经完成的 “趋势双均线、趋势布林带、emv择时”系统,下面的示例在 jupyter 中执行:

%matplotlib inline
%time from hikyuu.interactive import *

# 定义回测时间
start_date = Datetime(20200101)
end_date = Datetime(20240501)
query = Query(start_date, end_date)

# 指定分析对象
stk = sm['sh510050']
k = stk.get_kdata(Query(start_date, end_date))

# 定义回测账户,并指定成本算法
my_tm = crtTM(start_date, init_cash=100000, cost_func=TC_FixedA2017())

for name in ('趋势双均线', '趋势布林带', 'emv择时'):
    my_sys = get_part(f"start.sys.{name}")
    my_sys.tm = my_tm
    my_sys.run(stk, query)
    my_sys.performance()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[ubuntu]docker 卡登录 You‘ve been signed out

Setting->Resources->Proxies设置当前使用的proxies即可 参考&#xff1a;https://github.com/docker/for-mac/issues/7160#issuecomment-2061040813

香蕉派BPI-F3 进迭时空(SpacemiT)K1RISC-V开发板软件下载链接

香蕉派BPI-F3是一款工业级 8核RISC-V开源硬件开发板&#xff0c;它采用进迭时空&#xff08;SpacemiT&#xff09; K1 8核RISC-V芯片设计&#xff0c;CPU集成2.0 TOPs AI计算能力。4G DDR和16G eMMC。2个GbE以太网接口&#xff0c;4个USB 3.0和PCIe M.2接口&#xff0c;支持HDM…

Sylar C++高性能服务器学习记录21 【ByteArray模块-知识储备篇】

早在19年5月就在某站上看到sylar的视频了&#xff0c;一直认为这是一个非常不错的视频。 由于本人一直是自学编程&#xff0c;基础不扎实&#xff0c;也没有任何人的督促&#xff0c;没能坚持下去。 每每想起倍感惋惜&#xff0c;遂提笔再续前缘。 为了能更好的看懂sylar&…

HTML静态网页成品作业(HTML+CSS)—— 金宝贝儿童教育机构介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

社交创新:Facebook的技术与产品发展

在当今数字化时代&#xff0c;社交网络已经渗透到我们生活的方方面面&#xff0c;成为了人们日常交流、信息获取和社交互动的主要方式。而在这个众多社交平台中&#xff0c;Facebook作为其中的佼佼者&#xff0c;其技术与产品的发展历程也是一个社交创新的缩影。本文将探索Face…

从写简历到谈薪资的最全教程

从写简历到谈薪资的最全教程 目录简历注意事项举个例子写简历投递简历也有技巧模拟面试的重要性面试经验怎么刷不断迭代达越来越强斗智斗勇谈薪资拿到offer就结束了吗&#xff1f;我能给你的帮助 目录 大家好&#xff0c;我是一名普通本科毕业的学生&#xff0c;工作数年&#…

git根据历史某次提交创建新分支

有时候项目在做版本管理的时候&#xff0c;忘记了创建某次版本的分支&#xff0c;而直接在主分支上进行开发了&#xff0c;这个时候&#xff0c;想要对某次提交单独拉出来一个版本分支&#xff0c;就需要用到这个功能&#xff1a; git checkout -b 新分支名 某次提交的id 找到…

最新 Navicat Data Modeler 4 | 产品介绍

在过去的几周里&#xff0c;我们已经介绍了 Navicat 版本 17&#xff0c;现在我们来把注意力转移到另外两个值得关注的产品上&#xff0c;即 Navicat Data Modeler 和 Navicat BI&#xff08;之前称为 Navicat Chart Creator&#xff09;。今天的博客将介绍 Navicat Data Model…

VS2022+Qt雕刻机单片机马达串口上位机控制系统

程序示例精选 VS2022Qt雕刻机单片机马达串口上位机控制系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VS2022Qt雕刻机单片机马达串口上位机控制系统》编写代码&#xff0c;代码整洁&a…

pypi 发布自己的包

注册pypi个人用户 网址&#xff1a;https://pypi.org 目录结构dingtalk_utils 必须-pkgs- __init__.py .gitignore LICENSE 必须 README.md 必须 requirements.txt setup.py 必须安装依赖 pip install setuptools wheel安装上传工具 pip install twinesetup.py i…

深度学习(三)

5.Functional API 搭建神经网络模型 5.1利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom…

蒋耀锴:剑桥毕业,硅谷敲代码8年,回国创业做低代码

这是《开发者说》的第10期&#xff0c;本期我们邀请的开发者是蒋耀锴&#xff0c;曾在意大利、英国、美国读书&#xff0c;专长高性能计算、高容错分布式系统与软件工程&#xff0c;毕业后在硅谷的Medallia写了8年代码&#xff0c;19年回国创业做低代码&#xff0c;喜欢半夜里一…

常见Rabbitmq面试题及答案总结

1、 什么是 rabbitmq 釆用AMQP高级消息队列协议的一种消息队列技术撮大的特点就是消费并不需要 确保提供方存在,实现了服务之间的高度解耦 2、 为什么要使rabbitmq &#xff08;1&#xff09; 在分布式系统下具备异步&#xff0c;削峰&#xff0c;负载均衡等一系列高级功能&…

汽车MCU虚拟化--对中断虚拟化的思考(2)

目录 1.引入 2.TC4xx如何实现中断虚拟化 3.小结 1.引入 其实不管内核怎么变&#xff0c;针对中断虚拟化无非就是上面两种&#xff0c;要么透传给VM&#xff0c;要么由Hypervisor统一分发。汽车MCU虚拟化--对中断虚拟化的思考(1)-CSDN博客 那么&#xff0c;作为车规MCU龙头…

手把手制作Vue3+Flask全栈项目 全栈开发之路实战篇 问卷网站(五)数据处理

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

Java学习中,如何理解注解的概念及常用注解的使用方法

一、简介 Java注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;提供了一种将数据与程序元素&#xff08;类、方法、字段等&#xff09;关联的方法。注解本身不改变程序的执行逻辑&#xff0c;但可以通过工具或框架进行处理&#xff0c;从而影响编译、运行时的…

Suryxin’s ACM退役记

序 我的记忆力很差&#xff0c;经历过的很多事情都已经记不太清了&#xff0c;其中有很多美好回忆也已经消散&#xff0c;我很惋惜没能留存一些照片和声音或是文字供我怀念&#xff0c;这就像《泰坦尼克号》一样&#xff0c;露丝和杰克感人肺腑的爱情故事&#xff0c;最后也仅…

东航携手抖音生活服务开启机票首播,推出国内、国际超值机票次卡

在民航暑运旺季到来之际&#xff0c;越来越多的用户选择提前做好旅行规划&#xff0c;囤下高性价比的出游商品。6月6日18点&#xff0c;中国东方航空&#xff08;以下简称“东航”&#xff09;将在抖音开启首次机票直播&#xff0c;推荐多款超值机票次卡及空中Wi-Fi等特色产品&…

SpringBoot发邮件服务如何配置?怎么使用?

SpringBoot发邮件需要的参数&#xff1f;邮件发送性能如何优化&#xff1f; 在SpringBoot项目中配置发邮件服务是一个常见的需求&#xff0c;它允许我们通过应用程序发送通知、验证邮件或其他类型的邮件。AokSend将详细介绍如何在SpringBoot中配置发邮件服务。 SpringBoot发邮…

nginx和proxy_protocol协议

目录 1. 引言2. HTTP server的配置3. Stream server的配置3.1 作为proxy_protocol的前端服务器3.2 作为proxy_protocol的后端服务器1. 引言 proxy_protocol 是haproxy开发的一种用于在代理服务器和后端服务器之间传递客户端连接信息的协议。使用 proxy_protocol 的主要优势是能…