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,158 @@
|
|
|
1
|
+
"""
|
|
2
|
+
选币Alpha因子模块
|
|
3
|
+
|
|
4
|
+
包含用于选币的Alpha因子计算(101个WorldQuant Alpha因子)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# 导入所有alpha因子函数
|
|
8
|
+
from .alpha1 import alpha1_factor
|
|
9
|
+
from .alpha2 import alpha2_factor
|
|
10
|
+
from .alpha3 import alpha3_factor
|
|
11
|
+
from .alpha4 import alpha4_factor
|
|
12
|
+
from .alpha5 import alpha5_factor
|
|
13
|
+
from .alpha6 import alpha6_factor
|
|
14
|
+
from .alpha7 import alpha7_factor
|
|
15
|
+
from .alpha8 import alpha8_factor
|
|
16
|
+
from .alpha9 import alpha9_factor
|
|
17
|
+
from .alpha10 import alpha10_factor
|
|
18
|
+
from .alpha11 import alpha11_factor
|
|
19
|
+
from .alpha12 import alpha12_factor
|
|
20
|
+
from .alpha13 import alpha13_factor
|
|
21
|
+
from .alpha14 import alpha14_factor
|
|
22
|
+
from .alpha15 import alpha15_factor
|
|
23
|
+
from .alpha16 import alpha16_factor
|
|
24
|
+
from .alpha17 import alpha17_factor
|
|
25
|
+
from .alpha18 import alpha18_factor
|
|
26
|
+
from .alpha19 import alpha19_factor
|
|
27
|
+
from .alpha20 import alpha20_factor
|
|
28
|
+
from .alpha21 import alpha21_factor
|
|
29
|
+
from .alpha22 import alpha22_factor
|
|
30
|
+
from .alpha23 import alpha23_factor
|
|
31
|
+
from .alpha24 import alpha24_factor
|
|
32
|
+
from .alpha25 import alpha25_factor
|
|
33
|
+
from .alpha26 import alpha26_factor
|
|
34
|
+
from .alpha27 import alpha27_factor
|
|
35
|
+
from .alpha28 import alpha28_factor
|
|
36
|
+
from .alpha29 import alpha29_factor
|
|
37
|
+
from .alpha30 import alpha30_factor
|
|
38
|
+
from .alpha31 import alpha31_factor
|
|
39
|
+
from .alpha32 import alpha32_factor
|
|
40
|
+
from .alpha33 import alpha33_factor
|
|
41
|
+
from .alpha34 import alpha34_factor
|
|
42
|
+
from .alpha35 import alpha35_factor
|
|
43
|
+
from .alpha36 import alpha36_factor
|
|
44
|
+
from .alpha37 import alpha37_factor
|
|
45
|
+
from .alpha38 import alpha38_factor
|
|
46
|
+
from .alpha39 import alpha39_factor
|
|
47
|
+
from .alpha40 import alpha40_factor
|
|
48
|
+
from .alpha41 import alpha41_factor
|
|
49
|
+
from .alpha42 import alpha42_factor
|
|
50
|
+
from .alpha43 import alpha43_factor
|
|
51
|
+
from .alpha44 import alpha44_factor
|
|
52
|
+
from .alpha45 import alpha45_factor
|
|
53
|
+
from .alpha46 import alpha46_factor
|
|
54
|
+
from .alpha47 import alpha47_factor
|
|
55
|
+
from .alpha48 import alpha48_factor
|
|
56
|
+
from .alpha49 import alpha49_factor
|
|
57
|
+
from .alpha50 import alpha50_factor
|
|
58
|
+
from .alpha51 import alpha51_factor
|
|
59
|
+
from .alpha52 import alpha52_factor
|
|
60
|
+
from .alpha53 import alpha53_factor
|
|
61
|
+
from .alpha54 import alpha54_factor
|
|
62
|
+
from .alpha55 import alpha55_factor
|
|
63
|
+
from .alpha56 import alpha56_factor
|
|
64
|
+
from .alpha57 import alpha57_factor
|
|
65
|
+
from .alpha58 import alpha58_factor
|
|
66
|
+
from .alpha59 import alpha59_factor
|
|
67
|
+
from .alpha60 import alpha60_factor
|
|
68
|
+
from .alpha61 import alpha61_factor
|
|
69
|
+
from .alpha62 import alpha62_factor
|
|
70
|
+
from .alpha63 import alpha63_factor
|
|
71
|
+
from .alpha64 import alpha64_factor
|
|
72
|
+
from .alpha65 import alpha65_factor
|
|
73
|
+
from .alpha66 import alpha66_factor
|
|
74
|
+
from .alpha67 import alpha67_factor
|
|
75
|
+
from .alpha68 import alpha68_factor
|
|
76
|
+
from .alpha69 import alpha69_factor
|
|
77
|
+
from .alpha70 import alpha70_factor
|
|
78
|
+
from .alpha71 import alpha71_factor
|
|
79
|
+
from .alpha72 import alpha72_factor
|
|
80
|
+
from .alpha73 import alpha73_factor
|
|
81
|
+
from .alpha74 import alpha74_factor
|
|
82
|
+
from .alpha75 import alpha75_factor
|
|
83
|
+
from .alpha76 import alpha76_factor
|
|
84
|
+
from .alpha77 import alpha77_factor
|
|
85
|
+
from .alpha78 import alpha78_factor
|
|
86
|
+
from .alpha79 import alpha79_factor
|
|
87
|
+
from .alpha80 import alpha80_factor
|
|
88
|
+
from .alpha81 import alpha81_factor
|
|
89
|
+
from .alpha82 import alpha82_factor
|
|
90
|
+
from .alpha83 import alpha83_factor
|
|
91
|
+
from .alpha84 import alpha84_factor
|
|
92
|
+
from .alpha85 import alpha85_factor
|
|
93
|
+
from .alpha86 import alpha86_factor
|
|
94
|
+
from .alpha87 import alpha87_factor
|
|
95
|
+
from .alpha88 import alpha88_factor
|
|
96
|
+
from .alpha89 import alpha89_factor
|
|
97
|
+
from .alpha90 import alpha90_factor
|
|
98
|
+
from .alpha91 import alpha91_factor
|
|
99
|
+
from .alpha92 import alpha92_factor
|
|
100
|
+
from .alpha93 import alpha93_factor
|
|
101
|
+
from .alpha94 import alpha94_factor
|
|
102
|
+
from .alpha95 import alpha95_factor
|
|
103
|
+
from .alpha96 import alpha96_factor
|
|
104
|
+
from .alpha97 import alpha97_factor
|
|
105
|
+
from .alpha98 import alpha98_factor
|
|
106
|
+
from .alpha99 import alpha99_factor
|
|
107
|
+
from .alpha100 import alpha100_factor
|
|
108
|
+
from .alpha101 import alpha101_factor
|
|
109
|
+
|
|
110
|
+
# 导出所有alpha因子函数
|
|
111
|
+
__all__ = [
|
|
112
|
+
'alpha1_factor', 'alpha2_factor', 'alpha3_factor', 'alpha4_factor', 'alpha5_factor',
|
|
113
|
+
'alpha6_factor', 'alpha7_factor', 'alpha8_factor', 'alpha9_factor', 'alpha10_factor',
|
|
114
|
+
'alpha11_factor', 'alpha12_factor', 'alpha13_factor', 'alpha14_factor', 'alpha15_factor',
|
|
115
|
+
'alpha16_factor', 'alpha17_factor', 'alpha18_factor', 'alpha19_factor', 'alpha20_factor',
|
|
116
|
+
'alpha21_factor', 'alpha22_factor', 'alpha23_factor', 'alpha24_factor', 'alpha25_factor',
|
|
117
|
+
'alpha26_factor', 'alpha27_factor', 'alpha28_factor', 'alpha29_factor', 'alpha30_factor',
|
|
118
|
+
'alpha31_factor', 'alpha32_factor', 'alpha33_factor', 'alpha34_factor', 'alpha35_factor',
|
|
119
|
+
'alpha36_factor', 'alpha37_factor', 'alpha38_factor', 'alpha39_factor', 'alpha40_factor',
|
|
120
|
+
'alpha41_factor', 'alpha42_factor', 'alpha43_factor', 'alpha44_factor', 'alpha45_factor',
|
|
121
|
+
'alpha46_factor', 'alpha47_factor', 'alpha48_factor', 'alpha49_factor', 'alpha50_factor',
|
|
122
|
+
'alpha51_factor', 'alpha52_factor', 'alpha53_factor', 'alpha54_factor', 'alpha55_factor',
|
|
123
|
+
'alpha56_factor', 'alpha57_factor', 'alpha58_factor', 'alpha59_factor', 'alpha60_factor',
|
|
124
|
+
'alpha61_factor', 'alpha62_factor', 'alpha63_factor', 'alpha64_factor', 'alpha65_factor',
|
|
125
|
+
'alpha66_factor', 'alpha67_factor', 'alpha68_factor', 'alpha69_factor', 'alpha70_factor',
|
|
126
|
+
'alpha71_factor', 'alpha72_factor', 'alpha73_factor', 'alpha74_factor', 'alpha75_factor',
|
|
127
|
+
'alpha76_factor', 'alpha77_factor', 'alpha78_factor', 'alpha79_factor', 'alpha80_factor',
|
|
128
|
+
'alpha81_factor', 'alpha82_factor', 'alpha83_factor', 'alpha84_factor', 'alpha85_factor',
|
|
129
|
+
'alpha86_factor', 'alpha87_factor', 'alpha88_factor', 'alpha89_factor', 'alpha90_factor',
|
|
130
|
+
'alpha91_factor', 'alpha92_factor', 'alpha93_factor', 'alpha94_factor', 'alpha95_factor',
|
|
131
|
+
'alpha96_factor', 'alpha97_factor', 'alpha98_factor', 'alpha99_factor', 'alpha100_factor',
|
|
132
|
+
'alpha101_factor',
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
# 创建alpha因子字典,方便批量调用
|
|
136
|
+
ALPHA_FACTORS = {
|
|
137
|
+
1: alpha1_factor, 2: alpha2_factor, 3: alpha3_factor, 4: alpha4_factor, 5: alpha5_factor,
|
|
138
|
+
6: alpha6_factor, 7: alpha7_factor, 8: alpha8_factor, 9: alpha9_factor, 10: alpha10_factor,
|
|
139
|
+
11: alpha11_factor, 12: alpha12_factor, 13: alpha13_factor, 14: alpha14_factor, 15: alpha15_factor,
|
|
140
|
+
16: alpha16_factor, 17: alpha17_factor, 18: alpha18_factor, 19: alpha19_factor, 20: alpha20_factor,
|
|
141
|
+
21: alpha21_factor, 22: alpha22_factor, 23: alpha23_factor, 24: alpha24_factor, 25: alpha25_factor,
|
|
142
|
+
26: alpha26_factor, 27: alpha27_factor, 28: alpha28_factor, 29: alpha29_factor, 30: alpha30_factor,
|
|
143
|
+
31: alpha31_factor, 32: alpha32_factor, 33: alpha33_factor, 34: alpha34_factor, 35: alpha35_factor,
|
|
144
|
+
36: alpha36_factor, 37: alpha37_factor, 38: alpha38_factor, 39: alpha39_factor, 40: alpha40_factor,
|
|
145
|
+
41: alpha41_factor, 42: alpha42_factor, 43: alpha43_factor, 44: alpha44_factor, 45: alpha45_factor,
|
|
146
|
+
46: alpha46_factor, 47: alpha47_factor, 48: alpha48_factor, 49: alpha49_factor, 50: alpha50_factor,
|
|
147
|
+
51: alpha51_factor, 52: alpha52_factor, 53: alpha53_factor, 54: alpha54_factor, 55: alpha55_factor,
|
|
148
|
+
56: alpha56_factor, 57: alpha57_factor, 58: alpha58_factor, 59: alpha59_factor, 60: alpha60_factor,
|
|
149
|
+
61: alpha61_factor, 62: alpha62_factor, 63: alpha63_factor, 64: alpha64_factor, 65: alpha65_factor,
|
|
150
|
+
66: alpha66_factor, 67: alpha67_factor, 68: alpha68_factor, 69: alpha69_factor, 70: alpha70_factor,
|
|
151
|
+
71: alpha71_factor, 72: alpha72_factor, 73: alpha73_factor, 74: alpha74_factor, 75: alpha75_factor,
|
|
152
|
+
76: alpha76_factor, 77: alpha77_factor, 78: alpha78_factor, 79: alpha79_factor, 80: alpha80_factor,
|
|
153
|
+
81: alpha81_factor, 82: alpha82_factor, 83: alpha83_factor, 84: alpha84_factor, 85: alpha85_factor,
|
|
154
|
+
86: alpha86_factor, 87: alpha87_factor, 88: alpha88_factor, 89: alpha89_factor, 90: alpha90_factor,
|
|
155
|
+
91: alpha91_factor, 92: alpha92_factor, 93: alpha93_factor, 94: alpha94_factor, 95: alpha95_factor,
|
|
156
|
+
96: alpha96_factor, 97: alpha97_factor, 98: alpha98_factor, 99: alpha99_factor, 100: alpha100_factor,
|
|
157
|
+
101: alpha101_factor,
|
|
158
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#1 因子
|
|
3
|
+
|
|
4
|
+
公式: (rank(Ts_ArgMax(SignedPower(((returns < 0) ? stddev(returns, 20) : close), 2.), 5)) -0.5)
|
|
5
|
+
|
|
6
|
+
说明:
|
|
7
|
+
此alpha因子基于WorldQuant的101个alpha因子公式实现。
|
|
8
|
+
适配crypto交易数据格式(open_price, high_price, low_price, close_price, volume, quote_volume)。
|
|
9
|
+
|
|
10
|
+
标签:待补充
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import numpy as np
|
|
15
|
+
from typing import Optional
|
|
16
|
+
from .alpha_utils import (
|
|
17
|
+
ts_sum, sma, stddev, correlation, covariance,
|
|
18
|
+
ts_rank, product, ts_min, ts_max, delta, delay,
|
|
19
|
+
rank, scale, ts_argmax, ts_argmin, decay_linear,
|
|
20
|
+
sign, abs, log, signed_power
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def alpha1_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#1 因子计算
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
data_slice: 数据切片,必须包含以下列:
|
|
33
|
+
- open_price: 开盘价
|
|
34
|
+
- high_price: 最高价
|
|
35
|
+
- low_price: 最低价
|
|
36
|
+
- close_price: 收盘价
|
|
37
|
+
- volume: 成交量
|
|
38
|
+
- quote_volume: 成交额(用于计算vwap)
|
|
39
|
+
**kwargs: 其他可选参数
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
因子值(最后一个时间点的值)
|
|
43
|
+
"""
|
|
44
|
+
try:
|
|
45
|
+
if len(data_slice) < 2:
|
|
46
|
+
return 0.0
|
|
47
|
+
|
|
48
|
+
# 提取数据列
|
|
49
|
+
open_price = data_slice['open_price']
|
|
50
|
+
high_price = data_slice['high_price']
|
|
51
|
+
low_price = data_slice['low_price']
|
|
52
|
+
close_price = data_slice['close_price']
|
|
53
|
+
volume = data_slice['volume']
|
|
54
|
+
quote_volume = data_slice.get('quote_volume', volume * close_price) # 如果没有quote_volume,使用volume*close_price估算
|
|
55
|
+
|
|
56
|
+
# 计算收益率
|
|
57
|
+
returns = close_price.pct_change().fillna(0)
|
|
58
|
+
|
|
59
|
+
# 计算VWAP (Volume Weighted Average Price)
|
|
60
|
+
# vwap = quote_volume / volume,如果volume为0则使用close_price
|
|
61
|
+
vwap = (quote_volume / (volume + 1e-10)).fillna(close_price)
|
|
62
|
+
|
|
63
|
+
# 计算adv20 (20日平均成交量)
|
|
64
|
+
adv20 = sma(volume, 20)
|
|
65
|
+
|
|
66
|
+
# 实现Alpha因子逻辑
|
|
67
|
+
inner = close_price.copy()
|
|
68
|
+
inner[returns < 0] = stddev(returns, 20)
|
|
69
|
+
result = rank(ts_argmax(inner ** 2, 5))
|
|
70
|
+
|
|
71
|
+
# 返回最后一个值(如果是Series)或直接返回值
|
|
72
|
+
if isinstance(result, pd.Series):
|
|
73
|
+
result_value = result.iloc[-1] if len(result) > 0 else 0.0
|
|
74
|
+
elif isinstance(result, (int, float, np.number)):
|
|
75
|
+
result_value = float(result)
|
|
76
|
+
else:
|
|
77
|
+
result_value = 0.0
|
|
78
|
+
|
|
79
|
+
# 处理NaN和无穷大
|
|
80
|
+
if pd.isna(result_value) or np.isinf(result_value):
|
|
81
|
+
return 0.0
|
|
82
|
+
|
|
83
|
+
return float(result_value)
|
|
84
|
+
|
|
85
|
+
except Exception as e:
|
|
86
|
+
# 如果计算出错,返回0
|
|
87
|
+
return 0.0
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#10 因子
|
|
3
|
+
|
|
4
|
+
公式: rank(((0 < ts_min(delta(close, 1), 4)) ? delta(close, 1) : ((ts_max(delta(close, 1), 4) < 0)? delta(close, 1) : (-1 * delta(close, 1)))))
|
|
5
|
+
|
|
6
|
+
说明:
|
|
7
|
+
此alpha因子基于WorldQuant的101个alpha因子公式实现。
|
|
8
|
+
适配crypto交易数据格式(open_price, high_price, low_price, close_price, volume, quote_volume)。
|
|
9
|
+
|
|
10
|
+
标签:待补充
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import numpy as np
|
|
15
|
+
from typing import Optional
|
|
16
|
+
from .alpha_utils import (
|
|
17
|
+
ts_sum, sma, stddev, correlation, covariance,
|
|
18
|
+
ts_rank, product, ts_min, ts_max, delta, delay,
|
|
19
|
+
rank, scale, ts_argmax, ts_argmin, decay_linear,
|
|
20
|
+
sign, abs, log, signed_power
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def alpha10_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#10 因子计算
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
data_slice: 数据切片,必须包含以下列:
|
|
33
|
+
- open_price: 开盘价
|
|
34
|
+
- high_price: 最高价
|
|
35
|
+
- low_price: 最低价
|
|
36
|
+
- close_price: 收盘价
|
|
37
|
+
- volume: 成交量
|
|
38
|
+
- quote_volume: 成交额(用于计算vwap)
|
|
39
|
+
**kwargs: 其他可选参数
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
因子值(最后一个时间点的值)
|
|
43
|
+
"""
|
|
44
|
+
try:
|
|
45
|
+
if len(data_slice) < 2:
|
|
46
|
+
return 0.0
|
|
47
|
+
|
|
48
|
+
# 提取数据列
|
|
49
|
+
open_price = data_slice['open_price']
|
|
50
|
+
high_price = data_slice['high_price']
|
|
51
|
+
low_price = data_slice['low_price']
|
|
52
|
+
close_price = data_slice['close_price']
|
|
53
|
+
volume = data_slice['volume']
|
|
54
|
+
quote_volume = data_slice.get('quote_volume', volume * close_price) # 如果没有quote_volume,使用volume*close_price估算
|
|
55
|
+
|
|
56
|
+
# 计算收益率
|
|
57
|
+
returns = close_price.pct_change().fillna(0)
|
|
58
|
+
|
|
59
|
+
# 计算VWAP (Volume Weighted Average Price)
|
|
60
|
+
# vwap = quote_volume / volume,如果volume为0则使用close_price
|
|
61
|
+
vwap = (quote_volume / (volume + 1e-10)).fillna(close_price)
|
|
62
|
+
|
|
63
|
+
# 计算adv20 (20日平均成交量)
|
|
64
|
+
adv20 = sma(volume, 20)
|
|
65
|
+
|
|
66
|
+
# 实现Alpha因子逻辑
|
|
67
|
+
delta_close = delta(close_price, 1)
|
|
68
|
+
cond_1 = ts_min(delta_close, 4) > 0
|
|
69
|
+
cond_2 = ts_max(delta_close, 4) < 0
|
|
70
|
+
alpha = -1 * delta_close
|
|
71
|
+
alpha[cond_1 | cond_2] = delta_close
|
|
72
|
+
result = alpha
|
|
73
|
+
|
|
74
|
+
# 返回最后一个值(如果是Series)或直接返回值
|
|
75
|
+
if isinstance(result, pd.Series):
|
|
76
|
+
result_value = result.iloc[-1] if len(result) > 0 else 0.0
|
|
77
|
+
elif isinstance(result, (int, float, np.number)):
|
|
78
|
+
result_value = float(result)
|
|
79
|
+
else:
|
|
80
|
+
result_value = 0.0
|
|
81
|
+
|
|
82
|
+
# 处理NaN和无穷大
|
|
83
|
+
if pd.isna(result_value) or np.isinf(result_value):
|
|
84
|
+
return 0.0
|
|
85
|
+
|
|
86
|
+
return float(result_value)
|
|
87
|
+
|
|
88
|
+
except Exception as e:
|
|
89
|
+
# 如果计算出错,返回0
|
|
90
|
+
return 0.0
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#100 因子
|
|
3
|
+
|
|
4
|
+
公式: Alpha#100 (未在参考文件中找到)
|
|
5
|
+
|
|
6
|
+
说明:
|
|
7
|
+
此alpha因子基于WorldQuant的101个alpha因子公式实现。
|
|
8
|
+
适配crypto交易数据格式(open_price, high_price, low_price, close_price, volume, quote_volume)。
|
|
9
|
+
|
|
10
|
+
标签:待补充
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import numpy as np
|
|
15
|
+
from typing import Optional
|
|
16
|
+
from .alpha_utils import (
|
|
17
|
+
ts_sum, sma, stddev, correlation, covariance,
|
|
18
|
+
ts_rank, product, ts_min, ts_max, delta, delay,
|
|
19
|
+
rank, scale, ts_argmax, ts_argmin, decay_linear,
|
|
20
|
+
sign, abs, log, signed_power
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def alpha100_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#100 因子计算
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
data_slice: 数据切片,必须包含以下列:
|
|
33
|
+
- open_price: 开盘价
|
|
34
|
+
- high_price: 最高价
|
|
35
|
+
- low_price: 最低价
|
|
36
|
+
- close_price: 收盘价
|
|
37
|
+
- volume: 成交量
|
|
38
|
+
- quote_volume: 成交额(用于计算vwap)
|
|
39
|
+
**kwargs: 其他可选参数
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
因子值(最后一个时间点的值)
|
|
43
|
+
"""
|
|
44
|
+
try:
|
|
45
|
+
if len(data_slice) < 2:
|
|
46
|
+
return 0.0
|
|
47
|
+
|
|
48
|
+
# 提取数据列
|
|
49
|
+
open_price = data_slice['open_price']
|
|
50
|
+
high_price = data_slice['high_price']
|
|
51
|
+
low_price = data_slice['low_price']
|
|
52
|
+
close_price = data_slice['close_price']
|
|
53
|
+
volume = data_slice['volume']
|
|
54
|
+
quote_volume = data_slice.get('quote_volume', volume * close_price) # 如果没有quote_volume,使用volume*close_price估算
|
|
55
|
+
|
|
56
|
+
# 计算收益率
|
|
57
|
+
returns = close_price.pct_change().fillna(0)
|
|
58
|
+
|
|
59
|
+
# 计算VWAP (Volume Weighted Average Price)
|
|
60
|
+
# vwap = quote_volume / volume,如果volume为0则使用close_price
|
|
61
|
+
vwap = (quote_volume / (volume + 1e-10)).fillna(close_price)
|
|
62
|
+
|
|
63
|
+
# 计算adv20 (20日平均成交量)
|
|
64
|
+
adv20 = sma(volume, 20)
|
|
65
|
+
|
|
66
|
+
# TODO: 实现Alpha#100因子
|
|
67
|
+
# 公式: Alpha#100 (未在参考文件中找到)
|
|
68
|
+
# 注意:此alpha在参考文件中未找到实现,需要手动实现
|
|
69
|
+
|
|
70
|
+
return 0.0
|
|
71
|
+
|
|
72
|
+
except Exception as e:
|
|
73
|
+
# 如果计算出错,返回0
|
|
74
|
+
return 0.0
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#101 因子
|
|
3
|
+
|
|
4
|
+
公式: ((close - open) / ((high - low) + .001))
|
|
5
|
+
|
|
6
|
+
说明:
|
|
7
|
+
此alpha因子基于WorldQuant的101个alpha因子公式实现。
|
|
8
|
+
适配crypto交易数据格式(open_price, high_price, low_price, close_price, volume, quote_volume)。
|
|
9
|
+
|
|
10
|
+
标签:待补充
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import numpy as np
|
|
15
|
+
from typing import Optional
|
|
16
|
+
from .alpha_utils import (
|
|
17
|
+
ts_sum, sma, stddev, correlation, covariance,
|
|
18
|
+
ts_rank, product, ts_min, ts_max, delta, delay,
|
|
19
|
+
rank, scale, ts_argmax, ts_argmin, decay_linear,
|
|
20
|
+
sign, abs, log, signed_power
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def alpha101_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#101 因子计算
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
data_slice: 数据切片,必须包含以下列:
|
|
33
|
+
- open_price: 开盘价
|
|
34
|
+
- high_price: 最高价
|
|
35
|
+
- low_price: 最低价
|
|
36
|
+
- close_price: 收盘价
|
|
37
|
+
- volume: 成交量
|
|
38
|
+
- quote_volume: 成交额(用于计算vwap)
|
|
39
|
+
**kwargs: 其他可选参数
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
因子值(最后一个时间点的值)
|
|
43
|
+
"""
|
|
44
|
+
try:
|
|
45
|
+
if len(data_slice) < 2:
|
|
46
|
+
return 0.0
|
|
47
|
+
|
|
48
|
+
# 提取数据列
|
|
49
|
+
open_price = data_slice['open_price']
|
|
50
|
+
high_price = data_slice['high_price']
|
|
51
|
+
low_price = data_slice['low_price']
|
|
52
|
+
close_price = data_slice['close_price']
|
|
53
|
+
volume = data_slice['volume']
|
|
54
|
+
quote_volume = data_slice.get('quote_volume', volume * close_price) # 如果没有quote_volume,使用volume*close_price估算
|
|
55
|
+
|
|
56
|
+
# 计算收益率
|
|
57
|
+
returns = close_price.pct_change().fillna(0)
|
|
58
|
+
|
|
59
|
+
# 计算VWAP (Volume Weighted Average Price)
|
|
60
|
+
# vwap = quote_volume / volume,如果volume为0则使用close_price
|
|
61
|
+
vwap = (quote_volume / (volume + 1e-10)).fillna(close_price)
|
|
62
|
+
|
|
63
|
+
# 计算adv20 (20日平均成交量)
|
|
64
|
+
adv20 = sma(volume, 20)
|
|
65
|
+
|
|
66
|
+
# 实现Alpha因子逻辑
|
|
67
|
+
|
|
68
|
+
result = (close_price - open_price) /((high_price - low_price) + 0.001)
|
|
69
|
+
|
|
70
|
+
# 返回最后一个值(如果是Series)或直接返回值
|
|
71
|
+
if isinstance(result, pd.Series):
|
|
72
|
+
result_value = result.iloc[-1] if len(result) > 0 else 0.0
|
|
73
|
+
elif isinstance(result, (int, float, np.number)):
|
|
74
|
+
result_value = float(result)
|
|
75
|
+
else:
|
|
76
|
+
result_value = 0.0
|
|
77
|
+
|
|
78
|
+
# 处理NaN和无穷大
|
|
79
|
+
if pd.isna(result_value) or np.isinf(result_value):
|
|
80
|
+
return 0.0
|
|
81
|
+
|
|
82
|
+
return float(result_value)
|
|
83
|
+
|
|
84
|
+
except Exception as e:
|
|
85
|
+
# 如果计算出错,返回0
|
|
86
|
+
return 0.0
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#11 因子
|
|
3
|
+
|
|
4
|
+
公式: ((rank(ts_max((vwap - close), 3)) + rank(ts_min((vwap - close), 3))) *rank(delta(volume, 3)))
|
|
5
|
+
|
|
6
|
+
说明:
|
|
7
|
+
此alpha因子基于WorldQuant的101个alpha因子公式实现。
|
|
8
|
+
适配crypto交易数据格式(open_price, high_price, low_price, close_price, volume, quote_volume)。
|
|
9
|
+
|
|
10
|
+
标签:待补充
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import numpy as np
|
|
15
|
+
from typing import Optional
|
|
16
|
+
from .alpha_utils import (
|
|
17
|
+
ts_sum, sma, stddev, correlation, covariance,
|
|
18
|
+
ts_rank, product, ts_min, ts_max, delta, delay,
|
|
19
|
+
rank, scale, ts_argmax, ts_argmin, decay_linear,
|
|
20
|
+
sign, abs, log, signed_power
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def alpha11_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#11 因子计算
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
data_slice: 数据切片,必须包含以下列:
|
|
33
|
+
- open_price: 开盘价
|
|
34
|
+
- high_price: 最高价
|
|
35
|
+
- low_price: 最低价
|
|
36
|
+
- close_price: 收盘价
|
|
37
|
+
- volume: 成交量
|
|
38
|
+
- quote_volume: 成交额(用于计算vwap)
|
|
39
|
+
**kwargs: 其他可选参数
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
因子值(最后一个时间点的值)
|
|
43
|
+
"""
|
|
44
|
+
try:
|
|
45
|
+
if len(data_slice) < 2:
|
|
46
|
+
return 0.0
|
|
47
|
+
|
|
48
|
+
# 提取数据列
|
|
49
|
+
open_price = data_slice['open_price']
|
|
50
|
+
high_price = data_slice['high_price']
|
|
51
|
+
low_price = data_slice['low_price']
|
|
52
|
+
close_price = data_slice['close_price']
|
|
53
|
+
volume = data_slice['volume']
|
|
54
|
+
quote_volume = data_slice.get('quote_volume', volume * close_price) # 如果没有quote_volume,使用volume*close_price估算
|
|
55
|
+
|
|
56
|
+
# 计算收益率
|
|
57
|
+
returns = close_price.pct_change().fillna(0)
|
|
58
|
+
|
|
59
|
+
# 计算VWAP (Volume Weighted Average Price)
|
|
60
|
+
# vwap = quote_volume / volume,如果volume为0则使用close_price
|
|
61
|
+
vwap = (quote_volume / (volume + 1e-10)).fillna(close_price)
|
|
62
|
+
|
|
63
|
+
# 计算adv20 (20日平均成交量)
|
|
64
|
+
adv20 = sma(volume, 20)
|
|
65
|
+
|
|
66
|
+
# 实现Alpha因子逻辑
|
|
67
|
+
|
|
68
|
+
result = ((rank(ts_max((vwap - close_price), 3)) + rank(ts_min((vwap - close_price), 3))) *rank(delta(volume, 3)))
|
|
69
|
+
|
|
70
|
+
# 返回最后一个值(如果是Series)或直接返回值
|
|
71
|
+
if isinstance(result, pd.Series):
|
|
72
|
+
result_value = result.iloc[-1] if len(result) > 0 else 0.0
|
|
73
|
+
elif isinstance(result, (int, float, np.number)):
|
|
74
|
+
result_value = float(result)
|
|
75
|
+
else:
|
|
76
|
+
result_value = 0.0
|
|
77
|
+
|
|
78
|
+
# 处理NaN和无穷大
|
|
79
|
+
if pd.isna(result_value) or np.isinf(result_value):
|
|
80
|
+
return 0.0
|
|
81
|
+
|
|
82
|
+
return float(result_value)
|
|
83
|
+
|
|
84
|
+
except Exception as e:
|
|
85
|
+
# 如果计算出错,返回0
|
|
86
|
+
return 0.0
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#12 因子
|
|
3
|
+
|
|
4
|
+
公式: (sign(delta(volume, 1)) * (-1 * delta(close, 1)))
|
|
5
|
+
|
|
6
|
+
说明:
|
|
7
|
+
此alpha因子基于WorldQuant的101个alpha因子公式实现。
|
|
8
|
+
适配crypto交易数据格式(open_price, high_price, low_price, close_price, volume, quote_volume)。
|
|
9
|
+
|
|
10
|
+
标签:待补充
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import numpy as np
|
|
15
|
+
from typing import Optional
|
|
16
|
+
from .alpha_utils import (
|
|
17
|
+
ts_sum, sma, stddev, correlation, covariance,
|
|
18
|
+
ts_rank, product, ts_min, ts_max, delta, delay,
|
|
19
|
+
rank, scale, ts_argmax, ts_argmin, decay_linear,
|
|
20
|
+
sign, abs, log, signed_power
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def alpha12_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#12 因子计算
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
data_slice: 数据切片,必须包含以下列:
|
|
33
|
+
- open_price: 开盘价
|
|
34
|
+
- high_price: 最高价
|
|
35
|
+
- low_price: 最低价
|
|
36
|
+
- close_price: 收盘价
|
|
37
|
+
- volume: 成交量
|
|
38
|
+
- quote_volume: 成交额(用于计算vwap)
|
|
39
|
+
**kwargs: 其他可选参数
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
因子值(最后一个时间点的值)
|
|
43
|
+
"""
|
|
44
|
+
try:
|
|
45
|
+
if len(data_slice) < 2:
|
|
46
|
+
return 0.0
|
|
47
|
+
|
|
48
|
+
# 提取数据列
|
|
49
|
+
open_price = data_slice['open_price']
|
|
50
|
+
high_price = data_slice['high_price']
|
|
51
|
+
low_price = data_slice['low_price']
|
|
52
|
+
close_price = data_slice['close_price']
|
|
53
|
+
volume = data_slice['volume']
|
|
54
|
+
quote_volume = data_slice.get('quote_volume', volume * close_price) # 如果没有quote_volume,使用volume*close_price估算
|
|
55
|
+
|
|
56
|
+
# 计算收益率
|
|
57
|
+
returns = close_price.pct_change().fillna(0)
|
|
58
|
+
|
|
59
|
+
# 计算VWAP (Volume Weighted Average Price)
|
|
60
|
+
# vwap = quote_volume / volume,如果volume为0则使用close_price
|
|
61
|
+
vwap = (quote_volume / (volume + 1e-10)).fillna(close_price)
|
|
62
|
+
|
|
63
|
+
# 计算adv20 (20日平均成交量)
|
|
64
|
+
adv20 = sma(volume, 20)
|
|
65
|
+
|
|
66
|
+
# 实现Alpha因子逻辑
|
|
67
|
+
|
|
68
|
+
result = sign(delta(volume, 1)) * (-1 * delta(close_price, 1))
|
|
69
|
+
|
|
70
|
+
# 返回最后一个值(如果是Series)或直接返回值
|
|
71
|
+
if isinstance(result, pd.Series):
|
|
72
|
+
result_value = result.iloc[-1] if len(result) > 0 else 0.0
|
|
73
|
+
elif isinstance(result, (int, float, np.number)):
|
|
74
|
+
result_value = float(result)
|
|
75
|
+
else:
|
|
76
|
+
result_value = 0.0
|
|
77
|
+
|
|
78
|
+
# 处理NaN和无穷大
|
|
79
|
+
if pd.isna(result_value) or np.isinf(result_value):
|
|
80
|
+
return 0.0
|
|
81
|
+
|
|
82
|
+
return float(result_value)
|
|
83
|
+
|
|
84
|
+
except Exception as e:
|
|
85
|
+
# 如果计算出错,返回0
|
|
86
|
+
return 0.0
|