cyqnt-trd 0.1.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cyqnt_trd/__init__.py +26 -0
- cyqnt_trd/backtesting/README.md +264 -0
- cyqnt_trd/backtesting/__init__.py +12 -0
- cyqnt_trd/backtesting/factor_test.py +332 -0
- cyqnt_trd/backtesting/framework.py +311 -0
- cyqnt_trd/backtesting/strategy_backtest.py +545 -0
- cyqnt_trd/diagnose_api.py +28 -0
- cyqnt_trd/get_data/__init__.py +15 -0
- cyqnt_trd/get_data/get_futures_data.py +472 -0
- cyqnt_trd/get_data/get_trending_data.py +771 -0
- cyqnt_trd/online_trading/__init__.py +13 -0
- cyqnt_trd/online_trading/realtime_price_tracker.py +1001 -0
- cyqnt_trd/test.py +119 -0
- cyqnt_trd/test_script/README.md +411 -0
- cyqnt_trd/test_script/get_network_info.py +192 -0
- cyqnt_trd/test_script/get_symbols_by_volume.py +227 -0
- cyqnt_trd/test_script/realtime_price_tracker.py +839 -0
- cyqnt_trd/test_script/test_alpha.py +261 -0
- cyqnt_trd/test_script/test_kline_data.py +479 -0
- cyqnt_trd/test_script/test_order.py +1360 -0
- cyqnt_trd/trading_signal/README.md +276 -0
- cyqnt_trd/trading_signal/__init__.py +17 -0
- cyqnt_trd/trading_signal/example_test_alpha.py +430 -0
- cyqnt_trd/trading_signal/example_usage.py +431 -0
- cyqnt_trd/trading_signal/factor/__init__.py +18 -0
- cyqnt_trd/trading_signal/factor/ma_factor.py +75 -0
- cyqnt_trd/trading_signal/factor/rsi_factor.py +56 -0
- cyqnt_trd/trading_signal/selected_alpha/__init__.py +158 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha1.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha10.py +90 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha100.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha101.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha11.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha12.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha13.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha14.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha15.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha16.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha17.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha18.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha19.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha2.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha20.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha21.py +89 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha22.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha23.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha24.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha25.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha26.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha27.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha28.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha29.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha3.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha30.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha31.py +90 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha32.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha33.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha34.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha35.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha36.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha37.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha38.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha39.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha4.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha40.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha41.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha42.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha43.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha44.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha45.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha46.py +89 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha47.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha48.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha49.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha5.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha50.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha51.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha52.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha53.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha54.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha55.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha56.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha57.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha58.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha59.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha6.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha60.py +89 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha61.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha62.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha63.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha64.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha65.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha66.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha67.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha68.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha69.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha7.py +88 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha70.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha71.py +92 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha72.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha73.py +91 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha74.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha75.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha76.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha77.py +92 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha78.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha79.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha8.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha80.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha81.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha82.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha83.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha84.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha85.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha86.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha87.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha88.py +92 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha89.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha9.py +90 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha90.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha91.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha92.py +92 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha93.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha94.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha95.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha96.py +92 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha97.py +74 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha98.py +87 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha99.py +86 -0
- cyqnt_trd/trading_signal/selected_alpha/alpha_utils.py +342 -0
- cyqnt_trd/trading_signal/selected_alpha/create_all_alphas.py +279 -0
- cyqnt_trd/trading_signal/selected_alpha/generate_alphas.py +133 -0
- cyqnt_trd/trading_signal/selected_alpha/test_alpha.py +261 -0
- cyqnt_trd/trading_signal/signal/__init__.py +20 -0
- cyqnt_trd/trading_signal/signal/factor_based_signal.py +387 -0
- cyqnt_trd/trading_signal/signal/ma_signal.py +163 -0
- cyqnt_trd/utils/__init__.py +3 -0
- cyqnt_trd/utils/set_user.py +33 -0
- cyqnt_trd-0.1.2.dist-info/METADATA +148 -0
- cyqnt_trd-0.1.2.dist-info/RECORD +147 -0
- cyqnt_trd-0.1.2.dist-info/WHEEL +5 -0
- cyqnt_trd-0.1.2.dist-info/licenses/LICENSE +21 -0
- cyqnt_trd-0.1.2.dist-info/top_level.txt +2 -0
- test/real_time_trade.py +746 -0
- test/test_example_usage.py +381 -0
- test/test_get_data.py +310 -0
- test/test_realtime_price_tracker.py +546 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha因子测试脚本
|
|
3
|
+
|
|
4
|
+
测试 selected_alpha 模块中的 Alpha 因子
|
|
5
|
+
|
|
6
|
+
使用方法:
|
|
7
|
+
# 方式1: 作为模块运行(推荐)
|
|
8
|
+
cd /Users/user/Desktop/repo/cyqnt_trd
|
|
9
|
+
python -m cyqnt_trd.test_script.test_alpha
|
|
10
|
+
|
|
11
|
+
# 方式2: 直接运行脚本
|
|
12
|
+
cd /Users/user/Desktop/repo/cyqnt_trd
|
|
13
|
+
python cyqnt_trd/test_script/test_alpha.py
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import sys
|
|
17
|
+
import os
|
|
18
|
+
|
|
19
|
+
# 添加项目根目录到路径,以便导入模块
|
|
20
|
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
21
|
+
# 获取项目根目录(cyqnt_trd 的父目录)
|
|
22
|
+
# test_alpha.py 位于: cyqnt_trd/cyqnt_trd/test_script/test_alpha.py
|
|
23
|
+
# 需要向上2级到达: cyqnt_trd/
|
|
24
|
+
project_root = os.path.dirname(os.path.dirname(current_dir))
|
|
25
|
+
if project_root not in sys.path:
|
|
26
|
+
sys.path.insert(0, project_root)
|
|
27
|
+
|
|
28
|
+
# 导入回测框架和Alpha因子模块
|
|
29
|
+
try:
|
|
30
|
+
from cyqnt_trd.backtesting import BacktestFramework
|
|
31
|
+
from cyqnt_trd.trading_signal.selected_alpha import alpha1_factor
|
|
32
|
+
from cyqnt_trd.trading_signal.signal import factor_based_signal
|
|
33
|
+
except ImportError as e:
|
|
34
|
+
print(f"导入错误: {e}")
|
|
35
|
+
print(f"\n当前工作目录: {os.getcwd()}")
|
|
36
|
+
print(f"当前文件路径: {os.path.abspath(__file__)}")
|
|
37
|
+
print(f"项目根目录: {project_root}")
|
|
38
|
+
print(f"Python路径: {sys.path[:3]}")
|
|
39
|
+
print("\n提示:请使用以下方式运行:")
|
|
40
|
+
print(" cd /Users/user/Desktop/repo/cyqnt_trd")
|
|
41
|
+
print(" python -m cyqnt_trd.test_script.test_alpha")
|
|
42
|
+
print("\n或者直接运行脚本:")
|
|
43
|
+
print(" cd /Users/user/Desktop/repo/cyqnt_trd")
|
|
44
|
+
print(" python cyqnt_trd/test_script/test_alpha.py")
|
|
45
|
+
sys.exit(1)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_alpha1_factor():
|
|
49
|
+
"""
|
|
50
|
+
测试 Alpha#1 因子
|
|
51
|
+
|
|
52
|
+
测试因子在预测未来价格方向上的胜率
|
|
53
|
+
"""
|
|
54
|
+
print("=" * 60)
|
|
55
|
+
print("测试 Alpha#1 因子")
|
|
56
|
+
print("=" * 60)
|
|
57
|
+
print("\n因子说明:")
|
|
58
|
+
print(" - 公式: rank(Ts_ArgMax(SignedPower(((returns<0)?stddev(returns,20):close),2.),5))-0.5)")
|
|
59
|
+
print(" - 策略逻辑:对过去5天按照收盘价最高或下行波动率最高进行排名")
|
|
60
|
+
print(" - 下行波动率最高的一天离计算时间越近,越可以投资")
|
|
61
|
+
print(" - 收盘价最高离计算时间越近,越可以投资")
|
|
62
|
+
print(" - 标签:mean-reversion+momentum")
|
|
63
|
+
print()
|
|
64
|
+
|
|
65
|
+
# 加载数据
|
|
66
|
+
# 可以使用不同的数据文件进行测试
|
|
67
|
+
data_path = '/Users/user/Desktop/repo/cyqnt_trd/tmp/data/BTCUSDT_futures/BTCUSDT_3m_158879_20250101_000000_20251127_235959_20251128_145101.json'
|
|
68
|
+
|
|
69
|
+
# 如果数据文件不存在,尝试其他路径
|
|
70
|
+
if not os.path.exists(data_path):
|
|
71
|
+
# 尝试查找其他可用的数据文件
|
|
72
|
+
data_dir = '/Users/user/Desktop/repo/cyqnt_trd/tmp/data'
|
|
73
|
+
if os.path.exists(data_dir):
|
|
74
|
+
# 查找第一个可用的JSON文件
|
|
75
|
+
for root, dirs, files in os.walk(data_dir):
|
|
76
|
+
for file in files:
|
|
77
|
+
if file.endswith('.json'):
|
|
78
|
+
data_path = os.path.join(root, file)
|
|
79
|
+
print(f"使用数据文件: {data_path}")
|
|
80
|
+
break
|
|
81
|
+
if data_path and os.path.exists(data_path):
|
|
82
|
+
break
|
|
83
|
+
|
|
84
|
+
if not os.path.exists(data_path):
|
|
85
|
+
print(f"错误:找不到数据文件: {data_path}")
|
|
86
|
+
print("请确保数据文件存在,或修改 data_path 变量指向正确的数据文件")
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
framework = BacktestFramework(data_path=data_path)
|
|
90
|
+
|
|
91
|
+
# 创建因子包装函数
|
|
92
|
+
def alpha1_wrapper(data_slice):
|
|
93
|
+
"""
|
|
94
|
+
Alpha#1 因子包装函数
|
|
95
|
+
|
|
96
|
+
使用默认参数:lookback_days=5, stddev_period=20, power=2.0
|
|
97
|
+
"""
|
|
98
|
+
return alpha1_factor(
|
|
99
|
+
data_slice,
|
|
100
|
+
lookback_days=5,
|
|
101
|
+
stddev_period=20,
|
|
102
|
+
power=2.0
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# 测试因子
|
|
106
|
+
forward_periods = 3
|
|
107
|
+
print("开始测试 Alpha#1 因子...")
|
|
108
|
+
print(f" 回看天数: 5")
|
|
109
|
+
print(f" 标准差周期: 20")
|
|
110
|
+
print(f" 幂次: 2.0")
|
|
111
|
+
print(f" 向前看周期: {forward_periods}")
|
|
112
|
+
print()
|
|
113
|
+
|
|
114
|
+
factor_results = framework.test_factor(
|
|
115
|
+
factor_func=alpha1_wrapper,
|
|
116
|
+
forward_periods=forward_periods, # 未来forward_periods个周期
|
|
117
|
+
min_periods=30, # 至少需要30个周期(5+20+一些缓冲)
|
|
118
|
+
factor_name="Alpha#1因子"
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# 打印结果并保存
|
|
122
|
+
save_dir = '/Users/user/Desktop/repo/cyqnt_trd/result'
|
|
123
|
+
framework.print_factor_results(
|
|
124
|
+
factor_results,
|
|
125
|
+
save_dir=save_dir
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def test_alpha1_with_different_params():
|
|
130
|
+
"""
|
|
131
|
+
测试 Alpha#1 因子的不同参数组合
|
|
132
|
+
"""
|
|
133
|
+
print("\n" + "=" * 60)
|
|
134
|
+
print("测试 Alpha#1 因子的不同参数组合")
|
|
135
|
+
print("=" * 60)
|
|
136
|
+
|
|
137
|
+
# 加载数据
|
|
138
|
+
data_path = '/Users/user/Desktop/repo/cyqnt_trd/tmp/data/BTCUSDT_futures/BTCUSDT_3m_158879_20250101_000000_20251127_235959_20251128_145101.json'
|
|
139
|
+
|
|
140
|
+
if not os.path.exists(data_path):
|
|
141
|
+
print(f"错误:找不到数据文件: {data_path}")
|
|
142
|
+
return
|
|
143
|
+
|
|
144
|
+
framework = BacktestFramework(data_path=data_path)
|
|
145
|
+
|
|
146
|
+
# 测试不同的参数组合
|
|
147
|
+
param_combinations = [
|
|
148
|
+
{"lookback_days": 3, "stddev_period": 10, "power": 2.0, "name": "Alpha#1 (lookback=3, stddev=10)"},
|
|
149
|
+
{"lookback_days": 5, "stddev_period": 20, "power": 2.0, "name": "Alpha#1 (lookback=5, stddev=20)"},
|
|
150
|
+
{"lookback_days": 7, "stddev_period": 30, "power": 2.0, "name": "Alpha#1 (lookback=7, stddev=30)"},
|
|
151
|
+
]
|
|
152
|
+
|
|
153
|
+
for params in param_combinations:
|
|
154
|
+
print(f"\n测试参数组合: {params['name']}")
|
|
155
|
+
print(f" lookback_days={params['lookback_days']}, stddev_period={params['stddev_period']}, power={params['power']}")
|
|
156
|
+
|
|
157
|
+
def alpha1_wrapper(data_slice):
|
|
158
|
+
return alpha1_factor(
|
|
159
|
+
data_slice,
|
|
160
|
+
lookback_days=params['lookback_days'],
|
|
161
|
+
stddev_period=params['stddev_period'],
|
|
162
|
+
power=params['power']
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
min_periods = params['lookback_days'] + params['stddev_period'] + 5
|
|
166
|
+
|
|
167
|
+
factor_results = framework.test_factor(
|
|
168
|
+
factor_func=alpha1_wrapper,
|
|
169
|
+
forward_periods=3,
|
|
170
|
+
min_periods=min_periods,
|
|
171
|
+
factor_name=params['name']
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
# 只打印简要结果
|
|
175
|
+
print(f" 总样本数: {factor_results['total_samples']}")
|
|
176
|
+
print(f" 看多信号数: {factor_results['long_signals']}")
|
|
177
|
+
print(f" 看空信号数: {factor_results['short_signals']}")
|
|
178
|
+
print(f" 看多胜率: {factor_results['long_win_rate']:.2%}")
|
|
179
|
+
print(f" 看空胜率: {factor_results['short_win_rate']:.2%}")
|
|
180
|
+
print(f" 总体胜率: {factor_results['overall_win_rate']:.2%}")
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def test_alpha1_in_signal():
|
|
184
|
+
"""
|
|
185
|
+
测试在信号策略中使用 Alpha#1 因子
|
|
186
|
+
"""
|
|
187
|
+
print("\n" + "=" * 60)
|
|
188
|
+
print("测试在信号策略中使用 Alpha#1 因子")
|
|
189
|
+
print("=" * 60)
|
|
190
|
+
|
|
191
|
+
# 加载数据
|
|
192
|
+
data_path = '/Users/user/Desktop/repo/cyqnt_trd/tmp/data/BTCUSDT_futures/BTCUSDT_1d_1095_20251127_113603.json'
|
|
193
|
+
|
|
194
|
+
if not os.path.exists(data_path):
|
|
195
|
+
print(f"错误:找不到数据文件: {data_path}")
|
|
196
|
+
return
|
|
197
|
+
|
|
198
|
+
framework = BacktestFramework(data_path=data_path)
|
|
199
|
+
|
|
200
|
+
# 创建使用 Alpha#1 因子的信号策略
|
|
201
|
+
def alpha1_signal_wrapper(data_slice, position, entry_price, entry_index, take_profit, stop_loss, check_periods):
|
|
202
|
+
"""
|
|
203
|
+
使用 Alpha#1 因子的信号策略
|
|
204
|
+
"""
|
|
205
|
+
# 使用 Alpha#1 因子
|
|
206
|
+
factor_func = lambda d: alpha1_factor(d, lookback_days=5, stddev_period=20, power=2.0)
|
|
207
|
+
return factor_based_signal(
|
|
208
|
+
data_slice, position, entry_price, entry_index,
|
|
209
|
+
take_profit, stop_loss, check_periods,
|
|
210
|
+
factor_func=factor_func
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# 回测策略
|
|
214
|
+
print("开始回测基于 Alpha#1 因子的策略...")
|
|
215
|
+
backtest_results = framework.backtest_strategy(
|
|
216
|
+
signal_func=alpha1_signal_wrapper,
|
|
217
|
+
min_periods=30, # 至少需要30个周期
|
|
218
|
+
position_size=0.2, # 每次使用20%的资金
|
|
219
|
+
initial_capital=10000.0,
|
|
220
|
+
commission_rate=0.00001, # 0.001%手续费
|
|
221
|
+
take_profit=0.1, # 止盈10%
|
|
222
|
+
stop_loss=0.5, # 止损50%
|
|
223
|
+
check_periods=1, # 只能为1,因为实际使用时无法看到未来数据
|
|
224
|
+
strategy_name="基于Alpha#1因子的策略"
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
# 打印结果
|
|
228
|
+
framework.print_backtest_results(backtest_results)
|
|
229
|
+
|
|
230
|
+
# 绘制结果并保存
|
|
231
|
+
save_dir = '/Users/user/Desktop/repo/cyqnt_trd/result'
|
|
232
|
+
framework.plot_backtest_results(
|
|
233
|
+
backtest_results,
|
|
234
|
+
save_dir=save_dir
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def main():
|
|
239
|
+
"""
|
|
240
|
+
主函数:运行所有测试
|
|
241
|
+
"""
|
|
242
|
+
# 测试 Alpha#1 因子
|
|
243
|
+
# test_alpha1_factor()
|
|
244
|
+
|
|
245
|
+
# 测试不同参数组合(可选,取消注释以运行)
|
|
246
|
+
# test_alpha1_with_different_params()
|
|
247
|
+
|
|
248
|
+
# 测试在信号策略中使用 Alpha#1 因子(可选,取消注释以运行)
|
|
249
|
+
test_alpha1_in_signal()
|
|
250
|
+
|
|
251
|
+
print("\n" + "=" * 60)
|
|
252
|
+
print("测试完成!")
|
|
253
|
+
print("=" * 60)
|
|
254
|
+
print("\n提示:")
|
|
255
|
+
print(" - 取消注释 main() 函数中的其他测试函数来运行更多测试")
|
|
256
|
+
print(" - 推荐使用模块方式运行: python -m cyqnt_trd.test_script.test_alpha")
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
if __name__ == "__main__":
|
|
260
|
+
main()
|
|
261
|
+
|