1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
"""持仓权重回测
飞书文档:https://s0cqcxuy3p.feishu.cn/wiki/Pf1fw1woQi4iJikbKJmcYToznxb
"""
"""持仓权重回测
:param dfw: pd.DataFrame, columns = ['dt', 'symbol', 'weight', 'price'], 持仓权重数据,其中
dt 为K线结束时间,必须是连续的交易时间序列,不允许有时间断层
symbol 为合约代码,
weight 为K线结束时间对应的持仓权重,品种之间的权重是独立的,不会互相影响
price 为结束时间对应的交易价格,可以是当前K线的收盘价,或者下一根K线的开盘价,或者未来N根K线的TWAP、VWAP等
数据样例如下:
=================== ======== ======== =======
dt symbol weight price
=================== ======== ======== =======
2019-01-02 09:01:00 DLi9001 0.5 961.695
2019-01-02 09:02:00 DLi9001 0.25 960.72
2019-01-02 09:03:00 DLi9001 0.25 962.669
2019-01-02 09:04:00 DLi9001 0.25 960.72
2019-01-02 09:05:00 DLi9001 0.25 961.695
=================== ======== ======== =======
:param digits: int, 权重列保留小数位数
:param fee_rate: float, default 0.0002,单边交易成本,包括手续费与冲击成本
:param n_jobs: int, default 1,并行计算的线程数
:param weight_type: str, default 'ts',持仓权重类别,可选值:'ts'(时序策略)、'cs'(截面策略)
:param yearly_days: int, default 252,年化交易日数量
"""
=
=
=
# 保存实例变量,与 Python 原版一致
=
=
=
=
=
=
=
: =
"""获取回测赚钱/亏钱最多的前n个品种
:param n: int, 前n个品种
:param kind: str, 获取赚钱最多的品种,默认为"profit",即获取赚钱最多的品种
:return: list, 品种列表
"""
assert in ,
=
=
=
return
"""回测绩效评价
:return: dict, 回测绩效评价, 样例如下:
{'开始日期': '2017-01-03', '结束日期': '2023-07-31', '绝对收益': 0.6889, '年化': 0.0922,
'夏普': 1.1931, '最大回撤': 0.1373, '卡玛': 0.6715, '日胜率': 0.5436, '日盈亏比': 1.0568,
'日赢面': 0.1181, '年化波动率': 0.0773, '下行波动率': 0.0551, '非零覆盖': 0.9665,
'盈亏平衡点': 0.9782, '新高间隔': 229.0, '新高占比': 0.0861, '回撤风险': 1.7762,
'回归年度回报率': 0.1046, '长度调整平均最大回撤': 0.1714, '交易胜率': 0.3717,
'单笔收益': 25.59, '持仓K线数': 972.81, '多头占比': 0.5028, '空头占比': 0.4611,
'与基准相关性': 0.0727, '与基准空头相关性': -0.148, '波动比': 0.5865,
'与基准波动相关性': 0.2055, '品种数量': 9}
"""
return
"""从 Rust 内部提取符号字典映射"""
return
"""按需将 Rust 内部的整数符号映射回字符串代码。"""
=
=
return
"""品种等权费后日收益率
样例如下:
========== =========== ============ =========== ============
date DLj9001 SQag9001 ZZSF9001 total
========== =========== ============ =========== ============
2017-01-03 0.0264417 0.00246216 -0.00180836 0.00903183
2017-01-04 -0.0237968 -0.00226261 0.00659331 -0.00648869
2017-01-05 -0.00247365 0.00568681 -0.00669249 -0.00115977
2017-01-06 -0.0145385 -0.0103144 -0.0184913 -0.0144481
2017-01-07 0 -0.000373236 0 -0.000124412
========== =========== ============ =========== ============
"""
return
"""品种每日的交易信息
columns = ['date', 'symbol', 'edge', 'return', 'cost', 'n1b', 'turnover']
其中:
date 交易日,
symbol 合约代码,
n1b 品种每日收益率,
edge 策略每日收益率,
return 策略每日收益率减去交易成本后的真实收益,
cost 交易成本
turnover 当日的单边换手率
"""
return
"""策略超额收益
样例数据如下:
========== ============ ============ ============
date 超额 策略 基准
========== ============ ============ ============
2017-01-03 0.0163507 0.00903183 -0.00731888
2017-01-04 -0.0180457 -0.00648869 0.011557
2017-01-05 -0.000717903 -0.00115977 -0.000441871
2017-01-06 -0.00610561 -0.0144481 -0.00834245
2017-01-07 -0.000867702 -0.000373236 0.000494466
========== ============ ============ ============
"""
return
=
=
=
=
return
=
=
=
return
"""策略超额收益统计"""
return
"""基准收益统计"""
return
"""多头每日收益率
样例如下:
========== ========== =========== =========== ============
date DLj9001 SQag9001 ZZSF9001 total
========== ========== =========== =========== ============
2017-01-03 0 0.00246216 -0.00180836 0.000217931
2017-01-04 0 -0.00226261 0.00659331 0.00144357
2017-01-05 0 0.00568681 -0.00669249 -0.000335226
2017-01-06 -0.0100097 -0.00816301 -0.0184913 -0.0122213
2017-01-07 0 0 0 0
========== ========== =========== =========== ============
"""
return
"""空头每日收益率"""
return
"""多头收益统计
输出样例如下:
{'绝对收益': 0.5073,
'年化': 0.0679,
'夏普': 1.0786,
'最大回撤': 0.0721,
'卡玛': 0.9418,
'日胜率': 0.5276,
'日盈亏比': 1.1263,
'日赢面': 0.1218,
'年化波动率': 0.063,
'下行波动率': 0.0478,
'非零覆盖': 0.9421,
'盈亏平衡点': 0.9819,
'新高间隔': 222.0,
'新高占比': 0.0728,
'回撤风险': 1.1444,
'回归年度回报率': 0.0745,
'长度调整平均最大回撤': 0.2595,
'开始日期': '2017-01-03',
'结束日期': '2023-07-31'}
"""
return
"""空头收益统计"""
return
"""所有交易对数据
包含所有品种的买卖交易对信息,包含以下字段:
- symbol: 品种代码
- 开仓时间: 开仓时间
- 平仓时间: 平仓时间
- 方向: 交易方向(多头/空头)
- 开仓价格: 开仓价格
- 平仓价格: 平仓价格
- 盈亏比例: 盈亏比例
- 持仓K线数: 持仓K线数量
"""
return
"""获取某个合约的每日收益率
:param symbol: str,合约代码
:return: pd.DataFrame,品种每日收益率,
columns = ['date', 'symbol', 'edge', 'return', 'cost', 'n1b',
'turnover', 'long_return', 'short_return', ...]
"""
=
return
"""获取某个合约的开平交易记录
:param symbol: str,合约代码
:return: pd.DataFrame,品种的开平仓交易记录
"""
=
=
return