Hikyuu-SYS-趋势双均线交易策略实现

news2024/11/16 19:03:38

本篇中,我们将通过技术分析流派中经典的“趋势双均线策略”,向大家展现如何 Hikyuu 来测试自己的想法,并最终将它转化为策略!

准备工作

下面的代码在 Jupyter Lab 中执行,和直接使用 .py 文件执行的区别主要在于 matplotlib 的引入方式。

导入相关库:

%matplotlib inline
from hikyuu.interactive import *

我们的关注点是关于一只ETF基金的投资:上证50ETF,代码:SH510050。我们考虑的回测周期:

  • 起始日期:2020年1月1日
  • 结束日期:2024年4月30日
# 定义回测时间
start_date = Datetime(20200101)
end_date = Datetime(20240429)

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

查看最后5天的K线记录:

k[-5:]

输出如下:

[KRecord(Datetime(202404220000), 2.4650, 2.4860, 2.4560, 2.4600, 1999412.8640, 8092445.0000),
KRecord(Datetime(202404230000), 2.4570, 2.4620, 2.4450, 2.4470, 1338976.2560, 5461993.0000),
KRecord(Datetime(202404240000), 2.4540, 2.4620, 2.4400, 2.4570, 1637772.2880, 6679206.0000),
KRecord(Datetime(202404250000), 2.4530, 2.4720, 2.4450, 2.4660, 1344262.7840, 5467004.0000),
KRecord(Datetime(202404260000), 2.4680, 2.5040, 2.4680, 2.4960, 2552948.7360, 10252533.0000)]

适当的图表有助于直观的了解标的的历史走势,这里我们可以分别绘制 K线:
在这里插入图片描述

策略描述

这里我们使用类似通达信指标语法的方式,实现均线指标

  • 快线:10日 MA
  • 慢线:120日 MA

我们将收盘价与5日MA、10日MA线绘制在一张图上,看看有没有什么启发?

slow_n = 120
fast_n = 20
slow_ma = MA(CLOSE, slow_n)
fast_ma = MA(CLOSE, fast_n)

# 默认的 k 数据较多,绘制看不清,这里取当前最后的200个k线作为示意
k.close.plot(legend_on=True, label='收盘价')
slow_ma(k).plot(new=False, legend_on=True, label=f'{slow_n}日均线')
fast_ma(k).plot(new=False, legend_on=True, label=f'{fast_n}日均线')

在这里插入图片描述

通过指标公式来定义信号

  • 买入信号:快线大于慢线
  • 卖出信号:快线小于慢线
buy_ind = fast_ma > slow_ma
sell_ind = NOT(buy_ind)
buy_ind(k).plot()

在这里插入图片描述

使用 Hikyuu 实现策略

上面的部分介绍了从绘图与指标,在研究策略时观察指标信号的基础流程。下面我们用 Hikyuu 来实际实现这个策略,Hikyuu为用户隐藏了数据获取、指标计算以及回测逻辑。用户可以更加专注于策略逻辑的描述:

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

# 创建信号指示器
my_sg = SG_Bool(buy_ind, sell_ind)

# 创建资金管理算法
my_mm = MM_Nothing()

# 移滑价差, 后续可以自行尝试移滑价差的影响
my_sp = SP_FixedValue(0.05)

# 创建交易系统
my_sys = SYS_Simple(tm=my_tm, sg=my_sg, mm=my_mm, sp=my_sp)

执行交易系统回测,并查看系统绩效:

my_sys.run(stk, Query(start_date, end_date))
my_sys.performance()

在这里插入图片描述
查看交易明细:

my_tm.tovsc(".")  # 直接将 my_tm 的交易详情保存到当前目录下

测试以下所有 A 股的绩效

从上面看,这个简单的双均线系统,对上证ETF50似乎不怎么有效,那么对整个A股市场的其他股票是否有能赚钱的呢?让我们使用 Hikyuu 来快速验证整个A股市场,看看这个策略的普适性

在这里插入图片描述

在 14900K 上,回测所有起始日期小于回测起始日期的A股,总共耗时 268 毫秒

让我们看下,总共有多少支股票使用这个双均线策略有盈利

在这里插入图片描述
总共有盈利的417支,那么没有盈利的有多少呢?

在这里插入图片描述

你也可尝试看看 ETF 的结果

stks = [s for s in sm if s.valid and s.type == constant.STOCKTYPE_ETF and s.start_datetime < start_date]
%time df = analysis_sys_list(stks, Query(start_date, end_date), my_sys)

将已完成的策略放入相应的 Hub 中

这一步是可选的。如果你希望重用,那么可以将其整理放入自己的组件库中。例如,我将这个双均线系统放入星球的hub中:

在这里插入图片描述
现在,可以方便的取用这个交易策略:

在这里插入图片描述

以上代码已在知识星球中分享,星球用户请自行取用

在这里插入图片描述

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

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

相关文章

C语言--带环链表问题

继续学习 一、判断链表是否带环 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;用快慢指针&#xff0c;快指针走两步&#xff0c;慢指针走一步&#xff0c;当慢指针走一半快指针进到环里 当慢指针进环&#xff0c;快指针已经在环中转了一会儿了 | |…

【论文笔记】Training language models to follow instructions with human feedback B部分

Training language models to follow instructions with human feedback B 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意…

C语言二叉树代码实现

声明&#xff1a;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 采用二叉链表作为存储结构&#xff0c;完成二叉树的建立&#xff0c;先序、中序和后序遍历的操作&#xff0c;求所有叶子及结点总数的操作等。 #include <stdio.h> #i…

ctfshow 框架复现

文章目录 web 466web 467web 468web469web 470web 471web 472web 473web 474web 475web 476 web 466 Laravel5.4版本 &#xff0c;提交数据需要base64编码 代码审计学习—Laravel5.4 - 先知社区 (aliyun.com) 用第二条链子 反序列化格式 /admin/序列化串base64<?php na…

牛客NC383 主持人调度(一)【简单 排序 Java/Go/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/e160b104354649b69600803184094adb 思路 直接看代码&#xff0c;不难Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返…

用python画一个正八边形

1 问题 使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个边长100的正八边形。 2 方法 1、利用for循环解决如何画出图形中相同的八条边的问题。 2、再利用turtle.fd()函数和turtle.seth()函数画出完整的图形。 代码清单 1 import turtleturtle.pensize(2)d0for i in r…

第77天:WAF 攻防-权限控制代码免杀异或运算变量覆盖混淆加密传参

目录 案例一&#xff1a; 代码-脚本后门免杀变异-覆盖&传参 传参 变量覆盖 案例二&#xff1a;代码-脚本后门免杀变异-异或&加密 加密 异或 案例三&#xff1a;免杀脚本生成代码 php免杀脚本 案例一&#xff1a; 代码-脚本后门免杀变异-覆盖&传参 传参 正…

【C++程序员的自我修炼】string 库中常见用法(二)

制芰荷以为衣兮 集芙蓉以为裳 不吾知其亦已兮 苟余情其信芳 目录 字符串的头部插入insert <1>头部插入一个字符串&#xff1a; <2>头部插入一个字符&#xff1a; <3>迭代器的插入 总结&#xff1a; 字符串的头部删除 erase <1>头部插入删除一个字符&a…

Spring入门及注解开发

1 引言 自定义注解可以用来为代码添加元数据信息,简化配置,提高代码的可读性和可维护性。通过自定义注解,可以实现自定义的业务逻辑、约束条件、配置参数等功能。在Spring中,自定义注解常用于标记组件、配置依赖注入、AOP切面等。 自定义注解可以添加元数据信息,低代码框…

使用sherpa-onnx给文字添加标点符号

上篇文章https://blog.csdn.net/AWNUXCVBN/article/details/138372795 识别出的文字都是没有标点符号的&#xff0c;虽然可以添加整句断行&#xff0c;但总觉得怪怪的…… 于是看了一下&#xff0c;ncnn没有添加标点符号的功能&#xff0c;翻了一下onnx有示例&#xff0c;但没有…

【测试报告】网页聊天室

⭐ 作者&#xff1a;Jwenen &#x1f331; 作者主页&#xff1a;Jwenen的个人主页 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 测试报告 1. 编写目的2. 项目介绍3. 功能测试用例4. 自动化测试源码 1. 编写目的 本报告为网页聊…

【华为】AC直连二层组网隧道转发实验配置

【华为】AC直连二层组网隧道转发实验配置 实验需求拓扑配置AC数据规划表 AC的配置顺序AC1基本配置(二层通信)AP上线VAP组关联--WLAN业务流量 LSW1AR1STA获取AP的业务流量 配置文档 实验需求 AC组网方式&#xff1a;直连二层组网。 业务数据转发方式&#xff1a;隧道转发。 DHC…

Odoo14修改登录界面,实现炫酷粒子效果

目录 原登录界面 最终效果 实现步骤 插件下载 原登录界面 最终效果 实现步骤 1 odoo创建插件web_login 2 在static目录下编写css和js文件 login.css代码 html, body {position:fixed;top:0px;left:0px;height:100%;width:100%;/*Fallback if gradeints dont work */b…

ASP.NET网上车辆档案管理系统

摘 要 本文采用基于Web的Asp.net技术&#xff0c;并与sql server 2000数据库相结合&#xff0c;研发了一套车辆档案管理系统。该系统扩展性好&#xff0c;易于维护。简化了车辆档案设计流程&#xff0c;去除了冗余信息。汽车销售企业可以通过本系统完成整个销售及售后所有档案…

python数据分析——数据分析概念定义和发展前景

数据分析概念定义和发展前景 前言一、数据分析概念二、数据的定义2.1数据的定义2.2数据的分类 三、数据的价值数据为什么具有价值 四、数据分析的目的对于企业来说 五、数据分析类型的划分5.1描述性统计分析5.2 探索性数据分析5.3 传统的统计分析方法5.4验证性数据分析 六、 数…

[答疑]系统需求并不会修改领域事实(警惕伪创新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 jeri 2024-4-17 12:59 潘老师&#xff0c;在整理领域模型时&#xff0c;这个申请是有多次的&#xff0c;直到申请成功&#xff0c;多重性是* &#xff0c;但分析模型时&#xff0c;需…

【题解】NowCoder Fibonacci数列

题目来源&#xff1a;牛客 题目链接&#xff1a;Fibonacci数列 Fibonacci数列 题目描述&#xff1a; Fibonacci 数列是这样定义的&#xff1a; F[0] 0 F[1] 1 for each i ≥ 2 : F[i] F[i-1] F[i-2] 因此&#xff0c;Fibonacci 数列就形如&#xff1a;0, 1, 1, 2, 3, 5…

STM32 PWM波定时溢出中断

打开定时器和中断 主函数初始化开启PWM和中断 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, Pwm_data); HAL_TIM_Base_Start_IT(&htim2); 回调函数中判断是否为tim2 void HAL_TIM_PeriodElapsedCallback(TIM_Han…

Vue阶段练习:初始化渲染、获取焦点、记账清单

阶段练习主要承接Vue 生命周期-CSDN博客 &#xff0c;学习完该部分内容后&#xff0c;进行自我检测&#xff0c;每个练习主要分为效果显示、需求分析、静态代码、完整代码、总结 四个部分&#xff0c;效果显示和准备代码已给出&#xff0c;我们需要完成“完整代码”部分。 练习…

Redis-五大数据类型-List(列表)

五大数据类型-List&#xff08;列表&#xff09; 简介 List是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部&#xff08;左边&#xff09;或者尾部&#xff08;右边&#xff09;。 底层是一个双向链表&#xff0c;对两段操作性能极高&#…