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

文/fasiondog

本篇中,我们将通过技术分析流派中经典的“趋势双均线策略”,向大家展现如何 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股市场,看看这个策略的普适性

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

总共有盈利的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中:

现在,可以方便的取用这个交易策略:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注