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,74 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#63 因子
|
|
3
|
+
|
|
4
|
+
公式: Alpha#63 (未在参考文件中找到)
|
|
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 alpha63_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#63 因子计算
|
|
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#63因子
|
|
67
|
+
# 公式: Alpha#63 (未在参考文件中找到)
|
|
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#64 因子
|
|
3
|
+
|
|
4
|
+
公式: ((rank(correlation(sum(((open * 0.178404) + (low * (1 - 0.178404))), 12.7054),sum(adv120, 12.7054), 16.6208)) < rank(delta(((((high + low) / 2) * 0.178404) + (vwap * (1 -0.178404))), 3.69741))) * -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 alpha64_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#64 因子计算
|
|
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
|
+
adv120 = sma(volume, 120)
|
|
68
|
+
result = ((rank(correlation(sma(((open_price * 0.178404) + (low_price * (1 - 0.178404))), 13),sma(adv120, 13), 17)) < rank(delta(((((high_price + low_price) / 2) * 0.178404) + (vwap * (1 -0.178404))), 3.69741))) * -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
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#65 因子
|
|
3
|
+
|
|
4
|
+
公式: ((rank(correlation(((open * 0.00817205) + (vwap * (1 - 0.00817205))), sum(adv60,8.6911), 6.40374)) < rank((open - ts_min(open, 13.635)))) * -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 alpha65_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#65 因子计算
|
|
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
|
+
adv60 = sma(volume, 60)
|
|
68
|
+
result = ((rank(correlation(((open_price * 0.00817205) + (vwap * (1 - 0.00817205))), sma(adv60,9), 6)) < rank((open_price - ts_min(open_price, 14)))) * -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
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#66 因子
|
|
3
|
+
|
|
4
|
+
公式: ((rank(decay_linear(delta(vwap, 3.51013), 7.23052)) + Ts_Rank(decay_linear(((((low* 0.96633) + (low * (1 - 0.96633))) - vwap) / (open - ((high + low) / 2))), 11.4157), 6.72611)) * -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 alpha66_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#66 因子计算
|
|
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(decay_linear(delta(vwap, 4), 7)) + ts_rank(decay_linear(((((low_price* 0.96633) + (low_price * (1 - 0.96633))) - vwap) / (open_price - ((high_price + low_price) / 2))), 11), 7)) * -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
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#67 因子
|
|
3
|
+
|
|
4
|
+
公式: Alpha#67 (未在参考文件中找到)
|
|
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 alpha67_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#67 因子计算
|
|
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#67因子
|
|
67
|
+
# 公式: Alpha#67 (未在参考文件中找到)
|
|
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#68 因子
|
|
3
|
+
|
|
4
|
+
公式: ((Ts_Rank(correlation(rank(high), rank(adv15), 8.91644), 13.9333) <rank(delta(((close * 0.518371) + (low * (1 - 0.518371))), 1.06157))) * -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 alpha68_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#68 因子计算
|
|
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
|
+
adv15 = sma(volume, 15)
|
|
68
|
+
result = ((ts_rank(correlation(rank(high_price), rank(adv15), 9), 14) <rank(delta(((close_price * 0.518371) + (low_price * (1 - 0.518371))), 1.06157))) * -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
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#69 因子
|
|
3
|
+
|
|
4
|
+
公式: Alpha#69 (未在参考文件中找到)
|
|
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 alpha69_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#69 因子计算
|
|
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#69因子
|
|
67
|
+
# 公式: Alpha#69 (未在参考文件中找到)
|
|
68
|
+
# 注意:此alpha在参考文件中未找到实现,需要手动实现
|
|
69
|
+
|
|
70
|
+
return 0.0
|
|
71
|
+
|
|
72
|
+
except Exception as e:
|
|
73
|
+
# 如果计算出错,返回0
|
|
74
|
+
return 0.0
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alpha#7 因子
|
|
3
|
+
|
|
4
|
+
公式: ((adv20 < volume) ? ((-1 * ts_rank(abs(delta(close, 7)), 60)) * sign(delta(close, 7))) : (-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 alpha7_factor(
|
|
25
|
+
data_slice: pd.DataFrame,
|
|
26
|
+
**kwargs
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Alpha#7 因子计算
|
|
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
|
+
alpha = -1 * ts_rank(abs(delta(close_price, 7)), 60) * sign(delta(close_price, 7))
|
|
69
|
+
alpha[adv20 >= volume] = -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
|