需从hikyuu.interactive引入,而不是直接从hikyuu库中引入(hikyuu是一个库,可用于编制其他的工具,而hikyuu.interactive.interactive是基于hikyuu库实现的交互式探索工具)
%matplotlib inline
%time from hikyuu.interactive import *
#use_draw_engine('echarts') #use_draw_engine('matplotlib') #默认为'matplotlib'绘图
2024-04-02 13:40:04,206 [INFO] hikyuu version: 1.3.5_202404021336_RELEASE_windows_x64 [<module>] (D:\workspace\hikyuu\hikyuu\__init__.py:91) [hikyuu::hku_info]
2024-04-02 13:40:04.592 [HKU-I] - Using MYSQL BaseInfoDriver (BaseInfoDriver.cpp:58) 2024-04-02 13:40:04.614 [HKU-I] - Loading market information... (StockManager.cpp:532) 2024-04-02 13:40:04.626 [HKU-I] - Loading stock type information... (StockManager.cpp:545) 2024-04-02 13:40:04.639 [HKU-I] - Loading stock information... (StockManager.cpp:460) 2024-04-02 13:40:04.800 [HKU-I] - Loading stock weight... (StockManager.cpp:562) 2024-04-02 13:40:05.926 [HKU-I] - Loading KData... (StockManager.cpp:133) 2024-04-02 13:40:06.602 [HKU-I] - Preloading all day kdata to buffer! (StockManager.cpp:171) 2024-04-02 13:40:06.603 [HKU-I] - Preloading all week kdata to buffer! (StockManager.cpp:174) 2024-04-02 13:40:06.603 [HKU-I] - Preloading all month kdata to buffer! (StockManager.cpp:177) 2024-04-02 13:40:06.607 [HKU-I] - 0.68s Loaded Data. (StockManager.cpp:150) CPU times: total: 203 ms Wall time: 2.84 s
#创建模拟交易账户进行回测,初始资金30万
my_tm = crtTM(init_cash = 300000)
#创建信号指示器(以5日EMA为快线,5日EMA自身的10日EMA作为慢线,快线向上穿越慢线时买入,反之卖出)
my_sg = SG_Flex(EMA(C, n=5), slow_n=10)
#固定每次买入1000股
my_mm = MM_FixedCount(1000)
#创建交易系统并运行
sys = SYS_Simple(tm = my_tm, sg = my_sg, mm = my_mm)
sys.run(sm['sz000001'], Query(-150))
#绘制系统信号
sys.plot()
k = sm['sz000001'].get_kdata(Query(-150))
c = CLOSE(k)
fast = EMA(c, 5)
slow = EMA(fast, 10)
#绘制信号指示器使用两个指标
fast.plot(new=False)
slow.plot(new=False)
#绘制资金收益曲线
x = my_tm.get_profit_curve(k.get_datetime_list(), Query.DAY)
x = PRICELIST(x)
x.plot()
#回测统计
from datetime import datetime
per = Performance()
print(per.report(my_tm, Datetime(datetime.today())))
帐户初始金额: 300000.00 累计投入本金: 300000.00 累计投入资产: 0.00 累计借入现金: 0.00 累计借入资产: 0.00 累计红利: 0.00 现金余额: 289640.00 未平仓头寸净值: 10640.00 当前总资产: 300280.00 已平仓交易总成本: 0.00 已平仓净利润总额: 200.00 单笔交易最大占用现金比例%: 3.83 交易平均占用现金比例%: 3.40 已平仓帐户收益率%: 0.07 帐户年复合收益率%: 0.16 帐户平均年收益率%: 0.16 赢利交易赢利总额: 1220.00 亏损交易亏损总额: -1020.00 已平仓交易总数: 6.00 赢利交易数: 1.00 亏损交易数: 5.00 赢利交易比例%: 16.67 赢利期望值: 33.33 赢利交易平均赢利: 1220.00 亏损交易平均亏损: -204.00 平均赢利/平均亏损比例: 5.98 净赢利/亏损比例: 1.20 最大单笔赢利: 1220.00 最大单笔盈利百分比%: 13.08 最大单笔亏损: -320.00 最大单笔亏损百分比%: -3.40 赢利交易平均持仓时间: 50.00 赢利交易最大持仓时间: 50.00 亏损交易平均持仓时间: 5.20 亏损交易最大持仓时间: 7.00 空仓总时间: 135.00 空仓时间/总时间%: 63.00 平均空仓时间: 22.00 最长空仓时间: 57.00 最大连续赢利笔数: 1.00 最大连续亏损笔数: 1.00 最大连续赢利金额: 1220.00 最大连续亏损金额: -810.00 R乘数期望值: 0.00 交易机会频率/年: 10.43 年度期望R乘数: 0.00 赢利交易平均R乘数: 0.13 亏损交易平均R乘数: -0.02 最大单笔赢利R乘数: 0.13 最大单笔亏损R乘数: -0.03 最大连续赢利R乘数: 0.13 最大连续亏损R乘数: -0.08
经常有人问到性能问题,下面这段的代码使用之前的系统示例,遍历指定板块的所有股票,计算他们的“盈利交易比例%”(即胜率)。
def test_func(stock, query):
"""计算指定stock的系统策略胜率,系统策略为之前的简单双均线交叉系统(每次固定买入100股)
"""
#创建模拟交易账户进行回测,初始资金30万
my_tm = crtTM(init_cash = 1000000)
#创建信号指示器(以5日EMA为快线,5日EMA自身的10日EMA作为慢线,快线向上穿越慢线时买入,反之卖出)
my_sg = SG_Flex(EMA(C, n=5), slow_n=10)
#固定每次买入1000股
my_mm = MM_FixedCount(100)
#创建交易系统并运行
sys = SYS_Simple(tm = my_tm, sg = my_sg, mm = my_mm)
sys.run(stock, query)
per = Performance()
per.statistics(my_tm, Datetime(datetime.today()))
return per["赢利交易比例%".encode('gb2312')]
def total_func(blk, query):
"""遍历指定板块的所有的股票,计算系统胜率"""
result = {}
for s in blk:
if s.valid and s.type != constant.STOCKTYPE_INDEX:
result[s.name] = test_func(s, query)
return result
遍历所有当前有效且并非指数的证券。下面是我的机器执行结果,共计算4151支证券,最近500个交易日,共耗时2.89秒。机器配置:Intel i7-4700HQ 2.G。
%time a = total_func(sm, Query(-500))
len(a)
CPU times: total: 469 ms Wall time: 1.86 s
6412