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.
Files changed (147) hide show
  1. cyqnt_trd/__init__.py +26 -0
  2. cyqnt_trd/backtesting/README.md +264 -0
  3. cyqnt_trd/backtesting/__init__.py +12 -0
  4. cyqnt_trd/backtesting/factor_test.py +332 -0
  5. cyqnt_trd/backtesting/framework.py +311 -0
  6. cyqnt_trd/backtesting/strategy_backtest.py +545 -0
  7. cyqnt_trd/diagnose_api.py +28 -0
  8. cyqnt_trd/get_data/__init__.py +15 -0
  9. cyqnt_trd/get_data/get_futures_data.py +472 -0
  10. cyqnt_trd/get_data/get_trending_data.py +771 -0
  11. cyqnt_trd/online_trading/__init__.py +13 -0
  12. cyqnt_trd/online_trading/realtime_price_tracker.py +1001 -0
  13. cyqnt_trd/test.py +119 -0
  14. cyqnt_trd/test_script/README.md +411 -0
  15. cyqnt_trd/test_script/get_network_info.py +192 -0
  16. cyqnt_trd/test_script/get_symbols_by_volume.py +227 -0
  17. cyqnt_trd/test_script/realtime_price_tracker.py +839 -0
  18. cyqnt_trd/test_script/test_alpha.py +261 -0
  19. cyqnt_trd/test_script/test_kline_data.py +479 -0
  20. cyqnt_trd/test_script/test_order.py +1360 -0
  21. cyqnt_trd/trading_signal/README.md +276 -0
  22. cyqnt_trd/trading_signal/__init__.py +17 -0
  23. cyqnt_trd/trading_signal/example_test_alpha.py +430 -0
  24. cyqnt_trd/trading_signal/example_usage.py +431 -0
  25. cyqnt_trd/trading_signal/factor/__init__.py +18 -0
  26. cyqnt_trd/trading_signal/factor/ma_factor.py +75 -0
  27. cyqnt_trd/trading_signal/factor/rsi_factor.py +56 -0
  28. cyqnt_trd/trading_signal/selected_alpha/__init__.py +158 -0
  29. cyqnt_trd/trading_signal/selected_alpha/alpha1.py +87 -0
  30. cyqnt_trd/trading_signal/selected_alpha/alpha10.py +90 -0
  31. cyqnt_trd/trading_signal/selected_alpha/alpha100.py +74 -0
  32. cyqnt_trd/trading_signal/selected_alpha/alpha101.py +86 -0
  33. cyqnt_trd/trading_signal/selected_alpha/alpha11.py +86 -0
  34. cyqnt_trd/trading_signal/selected_alpha/alpha12.py +86 -0
  35. cyqnt_trd/trading_signal/selected_alpha/alpha13.py +86 -0
  36. cyqnt_trd/trading_signal/selected_alpha/alpha14.py +87 -0
  37. cyqnt_trd/trading_signal/selected_alpha/alpha15.py +87 -0
  38. cyqnt_trd/trading_signal/selected_alpha/alpha16.py +86 -0
  39. cyqnt_trd/trading_signal/selected_alpha/alpha17.py +88 -0
  40. cyqnt_trd/trading_signal/selected_alpha/alpha18.py +88 -0
  41. cyqnt_trd/trading_signal/selected_alpha/alpha19.py +87 -0
  42. cyqnt_trd/trading_signal/selected_alpha/alpha2.py +86 -0
  43. cyqnt_trd/trading_signal/selected_alpha/alpha20.py +88 -0
  44. cyqnt_trd/trading_signal/selected_alpha/alpha21.py +89 -0
  45. cyqnt_trd/trading_signal/selected_alpha/alpha22.py +87 -0
  46. cyqnt_trd/trading_signal/selected_alpha/alpha23.py +88 -0
  47. cyqnt_trd/trading_signal/selected_alpha/alpha24.py +88 -0
  48. cyqnt_trd/trading_signal/selected_alpha/alpha25.py +86 -0
  49. cyqnt_trd/trading_signal/selected_alpha/alpha26.py +87 -0
  50. cyqnt_trd/trading_signal/selected_alpha/alpha27.py +88 -0
  51. cyqnt_trd/trading_signal/selected_alpha/alpha28.py +88 -0
  52. cyqnt_trd/trading_signal/selected_alpha/alpha29.py +87 -0
  53. cyqnt_trd/trading_signal/selected_alpha/alpha3.py +86 -0
  54. cyqnt_trd/trading_signal/selected_alpha/alpha30.py +87 -0
  55. cyqnt_trd/trading_signal/selected_alpha/alpha31.py +90 -0
  56. cyqnt_trd/trading_signal/selected_alpha/alpha32.py +86 -0
  57. cyqnt_trd/trading_signal/selected_alpha/alpha33.py +86 -0
  58. cyqnt_trd/trading_signal/selected_alpha/alpha34.py +87 -0
  59. cyqnt_trd/trading_signal/selected_alpha/alpha35.py +88 -0
  60. cyqnt_trd/trading_signal/selected_alpha/alpha36.py +86 -0
  61. cyqnt_trd/trading_signal/selected_alpha/alpha37.py +86 -0
  62. cyqnt_trd/trading_signal/selected_alpha/alpha38.py +87 -0
  63. cyqnt_trd/trading_signal/selected_alpha/alpha39.py +87 -0
  64. cyqnt_trd/trading_signal/selected_alpha/alpha4.py +86 -0
  65. cyqnt_trd/trading_signal/selected_alpha/alpha40.py +86 -0
  66. cyqnt_trd/trading_signal/selected_alpha/alpha41.py +86 -0
  67. cyqnt_trd/trading_signal/selected_alpha/alpha42.py +86 -0
  68. cyqnt_trd/trading_signal/selected_alpha/alpha43.py +86 -0
  69. cyqnt_trd/trading_signal/selected_alpha/alpha44.py +87 -0
  70. cyqnt_trd/trading_signal/selected_alpha/alpha45.py +88 -0
  71. cyqnt_trd/trading_signal/selected_alpha/alpha46.py +89 -0
  72. cyqnt_trd/trading_signal/selected_alpha/alpha47.py +86 -0
  73. cyqnt_trd/trading_signal/selected_alpha/alpha48.py +74 -0
  74. cyqnt_trd/trading_signal/selected_alpha/alpha49.py +88 -0
  75. cyqnt_trd/trading_signal/selected_alpha/alpha5.py +86 -0
  76. cyqnt_trd/trading_signal/selected_alpha/alpha50.py +86 -0
  77. cyqnt_trd/trading_signal/selected_alpha/alpha51.py +88 -0
  78. cyqnt_trd/trading_signal/selected_alpha/alpha52.py +87 -0
  79. cyqnt_trd/trading_signal/selected_alpha/alpha53.py +86 -0
  80. cyqnt_trd/trading_signal/selected_alpha/alpha54.py +86 -0
  81. cyqnt_trd/trading_signal/selected_alpha/alpha55.py +88 -0
  82. cyqnt_trd/trading_signal/selected_alpha/alpha56.py +86 -0
  83. cyqnt_trd/trading_signal/selected_alpha/alpha57.py +86 -0
  84. cyqnt_trd/trading_signal/selected_alpha/alpha58.py +74 -0
  85. cyqnt_trd/trading_signal/selected_alpha/alpha59.py +74 -0
  86. cyqnt_trd/trading_signal/selected_alpha/alpha6.py +86 -0
  87. cyqnt_trd/trading_signal/selected_alpha/alpha60.py +89 -0
  88. cyqnt_trd/trading_signal/selected_alpha/alpha61.py +88 -0
  89. cyqnt_trd/trading_signal/selected_alpha/alpha62.py +86 -0
  90. cyqnt_trd/trading_signal/selected_alpha/alpha63.py +74 -0
  91. cyqnt_trd/trading_signal/selected_alpha/alpha64.py +86 -0
  92. cyqnt_trd/trading_signal/selected_alpha/alpha65.py +86 -0
  93. cyqnt_trd/trading_signal/selected_alpha/alpha66.py +86 -0
  94. cyqnt_trd/trading_signal/selected_alpha/alpha67.py +74 -0
  95. cyqnt_trd/trading_signal/selected_alpha/alpha68.py +86 -0
  96. cyqnt_trd/trading_signal/selected_alpha/alpha69.py +74 -0
  97. cyqnt_trd/trading_signal/selected_alpha/alpha7.py +88 -0
  98. cyqnt_trd/trading_signal/selected_alpha/alpha70.py +74 -0
  99. cyqnt_trd/trading_signal/selected_alpha/alpha71.py +92 -0
  100. cyqnt_trd/trading_signal/selected_alpha/alpha72.py +86 -0
  101. cyqnt_trd/trading_signal/selected_alpha/alpha73.py +91 -0
  102. cyqnt_trd/trading_signal/selected_alpha/alpha74.py +86 -0
  103. cyqnt_trd/trading_signal/selected_alpha/alpha75.py +86 -0
  104. cyqnt_trd/trading_signal/selected_alpha/alpha76.py +74 -0
  105. cyqnt_trd/trading_signal/selected_alpha/alpha77.py +92 -0
  106. cyqnt_trd/trading_signal/selected_alpha/alpha78.py +86 -0
  107. cyqnt_trd/trading_signal/selected_alpha/alpha79.py +74 -0
  108. cyqnt_trd/trading_signal/selected_alpha/alpha8.py +87 -0
  109. cyqnt_trd/trading_signal/selected_alpha/alpha80.py +74 -0
  110. cyqnt_trd/trading_signal/selected_alpha/alpha81.py +86 -0
  111. cyqnt_trd/trading_signal/selected_alpha/alpha82.py +74 -0
  112. cyqnt_trd/trading_signal/selected_alpha/alpha83.py +86 -0
  113. cyqnt_trd/trading_signal/selected_alpha/alpha84.py +86 -0
  114. cyqnt_trd/trading_signal/selected_alpha/alpha85.py +86 -0
  115. cyqnt_trd/trading_signal/selected_alpha/alpha86.py +86 -0
  116. cyqnt_trd/trading_signal/selected_alpha/alpha87.py +74 -0
  117. cyqnt_trd/trading_signal/selected_alpha/alpha88.py +92 -0
  118. cyqnt_trd/trading_signal/selected_alpha/alpha89.py +74 -0
  119. cyqnt_trd/trading_signal/selected_alpha/alpha9.py +90 -0
  120. cyqnt_trd/trading_signal/selected_alpha/alpha90.py +74 -0
  121. cyqnt_trd/trading_signal/selected_alpha/alpha91.py +74 -0
  122. cyqnt_trd/trading_signal/selected_alpha/alpha92.py +92 -0
  123. cyqnt_trd/trading_signal/selected_alpha/alpha93.py +74 -0
  124. cyqnt_trd/trading_signal/selected_alpha/alpha94.py +86 -0
  125. cyqnt_trd/trading_signal/selected_alpha/alpha95.py +86 -0
  126. cyqnt_trd/trading_signal/selected_alpha/alpha96.py +92 -0
  127. cyqnt_trd/trading_signal/selected_alpha/alpha97.py +74 -0
  128. cyqnt_trd/trading_signal/selected_alpha/alpha98.py +87 -0
  129. cyqnt_trd/trading_signal/selected_alpha/alpha99.py +86 -0
  130. cyqnt_trd/trading_signal/selected_alpha/alpha_utils.py +342 -0
  131. cyqnt_trd/trading_signal/selected_alpha/create_all_alphas.py +279 -0
  132. cyqnt_trd/trading_signal/selected_alpha/generate_alphas.py +133 -0
  133. cyqnt_trd/trading_signal/selected_alpha/test_alpha.py +261 -0
  134. cyqnt_trd/trading_signal/signal/__init__.py +20 -0
  135. cyqnt_trd/trading_signal/signal/factor_based_signal.py +387 -0
  136. cyqnt_trd/trading_signal/signal/ma_signal.py +163 -0
  137. cyqnt_trd/utils/__init__.py +3 -0
  138. cyqnt_trd/utils/set_user.py +33 -0
  139. cyqnt_trd-0.1.2.dist-info/METADATA +148 -0
  140. cyqnt_trd-0.1.2.dist-info/RECORD +147 -0
  141. cyqnt_trd-0.1.2.dist-info/WHEEL +5 -0
  142. cyqnt_trd-0.1.2.dist-info/licenses/LICENSE +21 -0
  143. cyqnt_trd-0.1.2.dist-info/top_level.txt +2 -0
  144. test/real_time_trade.py +746 -0
  145. test/test_example_usage.py +381 -0
  146. test/test_get_data.py +310 -0
  147. test/test_realtime_price_tracker.py +546 -0
@@ -0,0 +1,88 @@
1
+ """
2
+ Alpha#27 因子
3
+
4
+ 公式: ((0.5 < rank((sum(correlation(rank(volume), rank(vwap), 6), 2) / 2.0))) ? (-1 * 1) : 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 alpha27_factor(
25
+ data_slice: pd.DataFrame,
26
+ **kwargs
27
+ ) -> float:
28
+ """
29
+ Alpha#27 因子计算
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
+ alpha = rank((sma(correlation(rank(volume), rank(vwap), 6), 2) / 2.0))
68
+ alpha[alpha > 0.5] = -1
69
+ alpha[alpha <= 0.5]=1
70
+ result = alpha
71
+
72
+ # 返回最后一个值(如果是Series)或直接返回值
73
+ if isinstance(result, pd.Series):
74
+ result_value = result.iloc[-1] if len(result) > 0 else 0.0
75
+ elif isinstance(result, (int, float, np.number)):
76
+ result_value = float(result)
77
+ else:
78
+ result_value = 0.0
79
+
80
+ # 处理NaN和无穷大
81
+ if pd.isna(result_value) or np.isinf(result_value):
82
+ return 0.0
83
+
84
+ return float(result_value)
85
+
86
+ except Exception as e:
87
+ # 如果计算出错,返回0
88
+ return 0.0
@@ -0,0 +1,88 @@
1
+ """
2
+ Alpha#28 因子
3
+
4
+ 公式: scale(((correlation(adv20, low, 5) + ((high + low) / 2)) - close))
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 alpha28_factor(
25
+ data_slice: pd.DataFrame,
26
+ **kwargs
27
+ ) -> float:
28
+ """
29
+ Alpha#28 因子计算
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
+ adv20 = sma(volume, 20)
68
+ df = correlation(adv20, low_price, 5)
69
+ df = df.replace([-np.inf, np.inf], 0).fillna(value=0)
70
+ result = scale(((df + ((high_price + low_price) / 2)) - close_price))
71
+
72
+ # 返回最后一个值(如果是Series)或直接返回值
73
+ if isinstance(result, pd.Series):
74
+ result_value = result.iloc[-1] if len(result) > 0 else 0.0
75
+ elif isinstance(result, (int, float, np.number)):
76
+ result_value = float(result)
77
+ else:
78
+ result_value = 0.0
79
+
80
+ # 处理NaN和无穷大
81
+ if pd.isna(result_value) or np.isinf(result_value):
82
+ return 0.0
83
+
84
+ return float(result_value)
85
+
86
+ except Exception as e:
87
+ # 如果计算出错,返回0
88
+ return 0.0
@@ -0,0 +1,87 @@
1
+ """
2
+ Alpha#29 因子
3
+
4
+ 公式: (min(product(rank(rank(scale(log(sum(ts_min(rank(rank((-1 * rank(delta((close - 1),5))))), 2), 1))))), 1), 5) + ts_rank(delay((-1 * returns), 6), 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 alpha29_factor(
25
+ data_slice: pd.DataFrame,
26
+ **kwargs
27
+ ) -> float:
28
+ """
29
+ Alpha#29 因子计算
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 = (ts_min(rank(rank(scale(log(ts_sum(rank(rank(-1 * rank(delta((close_price - 1), 5)))), 2))))), 5) +
69
+ ts_rank(delay((-1 * returns), 6), 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,86 @@
1
+ """
2
+ Alpha#3 因子
3
+
4
+ 公式: (-1 * correlation(rank(open), rank(volume), 10))
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 alpha3_factor(
25
+ data_slice: pd.DataFrame,
26
+ **kwargs
27
+ ) -> float:
28
+ """
29
+ Alpha#3 因子计算
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
+ df = -1 * correlation(rank(open_price), rank(volume), 10)
68
+ result = df.replace([-np.inf, np.inf], 0).fillna(value=0)
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,87 @@
1
+ """
2
+ Alpha#30 因子
3
+
4
+ 公式: (((1.0 - rank(((sign((close - delay(close, 1))) + sign((delay(close, 1) - delay(close, 2)))) +sign((delay(close, 2) - delay(close, 3)))))) * sum(volume, 5)) / sum(volume, 20))
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 alpha30_factor(
25
+ data_slice: pd.DataFrame,
26
+ **kwargs
27
+ ) -> float:
28
+ """
29
+ Alpha#30 因子计算
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
+ inner = sign(delta_close) + sign(delay(delta_close, 1)) + sign(delay(delta_close, 2))
69
+ result = ((1.0 - rank(inner)) * ts_sum(volume, 5)) / ts_sum(volume, 20)
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#31 因子
3
+
4
+ 公式: ((rank(rank(rank(decay_linear((-1 * rank(rank(delta(close, 10)))), 10)))) + rank((-1 *delta(close, 3)))) + sign(scale(correlation(adv20, low, 12))))
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 alpha31_factor(
25
+ data_slice: pd.DataFrame,
26
+ **kwargs
27
+ ) -> float:
28
+ """
29
+ Alpha#31 因子计算
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
+ adv20 = sma(volume, 20)
68
+ df = correlation(adv20, low_price, 12).replace([-np.inf, np.inf], 0).fillna(value=0)
69
+ p1=rank(rank(rank(decay_linear((-1 * rank(rank(delta(close_price, 10)))), 10))))
70
+ p2=rank((-1 * delta(close_price, 3)))
71
+ p3=sign(scale(df))
72
+ result = p1+p2+p3
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,86 @@
1
+ """
2
+ Alpha#32 因子
3
+
4
+ 公式: (scale(((sum(close, 7) / 7) - close)) + (20 * scale(correlation(vwap, delay(close, 5),230))))
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 alpha32_factor(
25
+ data_slice: pd.DataFrame,
26
+ **kwargs
27
+ ) -> float:
28
+ """
29
+ Alpha#32 因子计算
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 = scale(((sma(close_price, 7) / 7) - close_price)) + (20 * scale(correlation(vwap, delay(close_price, 5),230)))
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#33 因子
3
+
4
+ 公式: rank((-1 * ((1 - (open / 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 alpha33_factor(
25
+ data_slice: pd.DataFrame,
26
+ **kwargs
27
+ ) -> float:
28
+ """
29
+ Alpha#33 因子计算
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(-1 + (open_price / close_price))
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