本篇中,我们将通过技术分析流派中经典的“趋势双均线策略”,向大家展现如何 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中:
现在,可以方便的取用这个交易策略:
以上代码已在知识星球中分享,星球用户请自行取用