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,276 @@
|
|
|
1
|
+
# 交易因子和信号策略模块
|
|
2
|
+
|
|
3
|
+
本模块提供了交易因子(factor)和交易信号策略(signal)的框架,支持在信号策略中使用因子。
|
|
4
|
+
|
|
5
|
+
## 目录结构
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
trading_signal/
|
|
9
|
+
├── factor/ # 交易因子模块
|
|
10
|
+
│ ├── __init__.py # 因子模块导出
|
|
11
|
+
│ ├── ma_factor.py # 移动平均线因子
|
|
12
|
+
│ └── rsi_factor.py # RSI因子
|
|
13
|
+
├── signal/ # 交易信号策略模块
|
|
14
|
+
│ ├── __init__.py # 信号模块导出
|
|
15
|
+
│ ├── ma_signal.py # 基于移动平均线的信号策略
|
|
16
|
+
│ └── factor_based_signal.py # 基于因子的信号策略(可在signal中使用factor)
|
|
17
|
+
└── example_usage.py # 使用示例
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 因子(Factor)
|
|
21
|
+
|
|
22
|
+
因子用于预测价格方向,函数签名:
|
|
23
|
+
```python
|
|
24
|
+
factor_func(data: pd.DataFrame, index: int) -> float
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- **返回值**:
|
|
28
|
+
- 正数:看多
|
|
29
|
+
- 负数:看空
|
|
30
|
+
- 0:中性或数据不足
|
|
31
|
+
|
|
32
|
+
### 已实现的因子
|
|
33
|
+
|
|
34
|
+
1. **ma_factor**: 简单移动平均线因子
|
|
35
|
+
```python
|
|
36
|
+
from cyqnt_trd.trading_signal.factor import ma_factor
|
|
37
|
+
|
|
38
|
+
# 使用MA5因子
|
|
39
|
+
factor_value = ma_factor(data, index, period=5)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
2. **ma_cross_factor**: 移动平均线交叉因子
|
|
43
|
+
```python
|
|
44
|
+
from cyqnt_trd.trading_signal.factor import ma_cross_factor
|
|
45
|
+
|
|
46
|
+
# 使用短期5日、长期20日均线交叉因子
|
|
47
|
+
factor_value = ma_cross_factor(data, index, short_period=5, long_period=20)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
3. **rsi_factor**: RSI因子
|
|
51
|
+
```python
|
|
52
|
+
from cyqnt_trd.trading_signal.factor import rsi_factor
|
|
53
|
+
|
|
54
|
+
# 使用RSI因子
|
|
55
|
+
factor_value = rsi_factor(data, index, period=14, oversold=30.0, overbought=70.0)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 信号策略(Signal)
|
|
59
|
+
|
|
60
|
+
信号策略用于生成买卖信号,函数签名:
|
|
61
|
+
```python
|
|
62
|
+
signal_func(
|
|
63
|
+
data: pd.DataFrame,
|
|
64
|
+
index: int,
|
|
65
|
+
position: float,
|
|
66
|
+
entry_price: float,
|
|
67
|
+
entry_index: int,
|
|
68
|
+
take_profit: float,
|
|
69
|
+
stop_loss: float,
|
|
70
|
+
check_periods: int
|
|
71
|
+
) -> str
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
- **参数说明**:
|
|
75
|
+
- `check_periods`: 检查未来多少个周期(**只能为1**,因为实际使用时无法看到今天之后的数据)
|
|
76
|
+
- **返回值**:
|
|
77
|
+
- `'buy'`: 买入信号
|
|
78
|
+
- `'sell'`: 卖出信号
|
|
79
|
+
- `'hold'`: 持有(不操作)
|
|
80
|
+
|
|
81
|
+
### 已实现的信号策略
|
|
82
|
+
|
|
83
|
+
1. **ma_signal**: 基于移动平均线的交易信号
|
|
84
|
+
```python
|
|
85
|
+
from cyqnt_trd.trading_signal.signal import ma_signal
|
|
86
|
+
|
|
87
|
+
# 需要包装成符合框架要求的函数
|
|
88
|
+
def ma_signal_wrapper(data, index, position, entry_price, entry_index,
|
|
89
|
+
take_profit, stop_loss, check_periods):
|
|
90
|
+
return ma_signal(data, index, position, entry_price, entry_index,
|
|
91
|
+
take_profit, stop_loss, check_periods, period=5)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
2. **ma_cross_signal**: 基于移动平均线交叉的交易信号
|
|
95
|
+
```python
|
|
96
|
+
from cyqnt_trd.trading_signal.signal import ma_cross_signal
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
3. **factor_based_signal**: 基于因子的交易信号(可在signal中使用factor)
|
|
100
|
+
```python
|
|
101
|
+
from cyqnt_trd.trading_signal.signal import factor_based_signal
|
|
102
|
+
from cyqnt_trd.trading_signal.factor import ma_factor
|
|
103
|
+
|
|
104
|
+
# 使用factor中的ma_factor
|
|
105
|
+
def factor_signal_wrapper(data, index, position, entry_price, entry_index,
|
|
106
|
+
take_profit, stop_loss, check_periods):
|
|
107
|
+
factor_func = lambda d, i: ma_factor(d, i, period=5)
|
|
108
|
+
return factor_based_signal(
|
|
109
|
+
data, index, position, entry_price, entry_index,
|
|
110
|
+
take_profit, stop_loss, check_periods,
|
|
111
|
+
factor_func=factor_func
|
|
112
|
+
)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
4. **multi_factor_signal**: 多因子组合策略
|
|
116
|
+
```python
|
|
117
|
+
from cyqnt_trd.trading_signal.signal import multi_factor_signal
|
|
118
|
+
from cyqnt_trd.trading_signal.factor import ma_factor, rsi_factor
|
|
119
|
+
|
|
120
|
+
# 组合多个因子
|
|
121
|
+
def multi_factor_wrapper(data, index, position, entry_price, entry_index,
|
|
122
|
+
take_profit, stop_loss, check_periods):
|
|
123
|
+
factor_funcs = [
|
|
124
|
+
lambda d, i: ma_factor(d, i, period=5),
|
|
125
|
+
lambda d, i: rsi_factor(d, i, period=14)
|
|
126
|
+
]
|
|
127
|
+
weights = [0.6, 0.4]
|
|
128
|
+
return multi_factor_signal(
|
|
129
|
+
data, index, position, entry_price, entry_index,
|
|
130
|
+
take_profit, stop_loss, check_periods,
|
|
131
|
+
factor_funcs=factor_funcs,
|
|
132
|
+
weights=weights
|
|
133
|
+
)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## 使用示例
|
|
137
|
+
|
|
138
|
+
### 示例1: 使用因子进行因子测试
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
from cyqnt_trd.backtesting import BacktestFramework
|
|
142
|
+
from cyqnt_trd.trading_signal.factor import ma_factor
|
|
143
|
+
|
|
144
|
+
# 加载数据
|
|
145
|
+
framework = BacktestFramework(data_path='path/to/data.json')
|
|
146
|
+
|
|
147
|
+
# 创建因子包装函数
|
|
148
|
+
def ma_factor_wrapper(data, index):
|
|
149
|
+
return ma_factor(data, index, period=5)
|
|
150
|
+
|
|
151
|
+
# 测试因子
|
|
152
|
+
factor_results = framework.test_factor(
|
|
153
|
+
factor_func=ma_factor_wrapper,
|
|
154
|
+
forward_periods=2,
|
|
155
|
+
min_periods=10,
|
|
156
|
+
factor_name="MA5因子"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
framework.print_factor_results(factor_results, save_dir='result')
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 示例2: 使用信号策略进行回测
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
from cyqnt_trd.backtesting import BacktestFramework
|
|
166
|
+
from cyqnt_trd.trading_signal.signal import ma_signal
|
|
167
|
+
|
|
168
|
+
# 加载数据
|
|
169
|
+
framework = BacktestFramework(data_path='path/to/data.json')
|
|
170
|
+
|
|
171
|
+
# 创建信号包装函数
|
|
172
|
+
def ma_signal_wrapper(data, index, position, entry_price, entry_index,
|
|
173
|
+
take_profit, stop_loss, check_periods):
|
|
174
|
+
return ma_signal(data, index, position, entry_price, entry_index,
|
|
175
|
+
take_profit, stop_loss, check_periods, period=5)
|
|
176
|
+
|
|
177
|
+
# 回测策略
|
|
178
|
+
backtest_results = framework.backtest_strategy(
|
|
179
|
+
signal_func=ma_signal_wrapper,
|
|
180
|
+
min_periods=10,
|
|
181
|
+
position_size=0.2,
|
|
182
|
+
initial_capital=10000.0,
|
|
183
|
+
commission_rate=0.00001,
|
|
184
|
+
take_profit=0.1,
|
|
185
|
+
stop_loss=0.5,
|
|
186
|
+
check_periods=1, # 只能为1,因为实际使用时无法看到未来数据
|
|
187
|
+
strategy_name="MA5策略"
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
framework.print_backtest_results(backtest_results)
|
|
191
|
+
framework.plot_backtest_results(backtest_results, save_dir='result')
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### 示例3: 在信号策略中使用因子
|
|
195
|
+
|
|
196
|
+
```python
|
|
197
|
+
from cyqnt_trd.backtesting import BacktestFramework
|
|
198
|
+
from cyqnt_trd.trading_signal.signal import factor_based_signal
|
|
199
|
+
from cyqnt_trd.trading_signal.factor import ma_factor
|
|
200
|
+
|
|
201
|
+
# 加载数据
|
|
202
|
+
framework = BacktestFramework(data_path='path/to/data.json')
|
|
203
|
+
|
|
204
|
+
# 创建基于因子的信号函数
|
|
205
|
+
def factor_signal_wrapper(data, index, position, entry_price, entry_index,
|
|
206
|
+
take_profit, stop_loss, check_periods):
|
|
207
|
+
factor_func = lambda d, i: ma_factor(d, i, period=5)
|
|
208
|
+
return factor_based_signal(
|
|
209
|
+
data, index, position, entry_price, entry_index,
|
|
210
|
+
take_profit, stop_loss, check_periods,
|
|
211
|
+
factor_func=factor_func
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
# 回测策略
|
|
215
|
+
backtest_results = framework.backtest_strategy(
|
|
216
|
+
signal_func=factor_signal_wrapper,
|
|
217
|
+
min_periods=10,
|
|
218
|
+
position_size=0.2,
|
|
219
|
+
initial_capital=10000.0,
|
|
220
|
+
commission_rate=0.00001,
|
|
221
|
+
take_profit=0.1,
|
|
222
|
+
stop_loss=0.5,
|
|
223
|
+
check_periods=1, # 只能为1,因为实际使用时无法看到未来数据
|
|
224
|
+
strategy_name="基于MA因子的策略"
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
framework.print_backtest_results(backtest_results)
|
|
228
|
+
framework.plot_backtest_results(backtest_results, save_dir='result')
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## 扩展指南
|
|
232
|
+
|
|
233
|
+
### 添加新因子
|
|
234
|
+
|
|
235
|
+
1. 在 `factor/` 目录下创建新的因子文件(如 `macd_factor.py`)
|
|
236
|
+
2. 实现因子函数,符合签名:`factor_func(data: pd.DataFrame, index: int) -> float`
|
|
237
|
+
3. 在 `factor/__init__.py` 中导入并导出新因子
|
|
238
|
+
|
|
239
|
+
### 添加新信号策略
|
|
240
|
+
|
|
241
|
+
1. 在 `signal/` 目录下创建新的信号文件(如 `macd_signal.py`)
|
|
242
|
+
2. 实现信号函数,符合签名:`signal_func(data, index, position, entry_price, entry_index, take_profit, stop_loss, check_periods) -> str`
|
|
243
|
+
3. 如果需要使用factor中的因子,可以从 `cyqnt_trd.trading_signal.factor` 导入
|
|
244
|
+
4. 在 `signal/__init__.py` 中导入并导出新信号
|
|
245
|
+
|
|
246
|
+
### 在信号中使用因子
|
|
247
|
+
|
|
248
|
+
信号策略可以直接导入并使用factor中的因子:
|
|
249
|
+
|
|
250
|
+
```python
|
|
251
|
+
# 在signal模块的文件中
|
|
252
|
+
from ..factor.ma_factor import ma_factor
|
|
253
|
+
from ..factor.rsi_factor import rsi_factor
|
|
254
|
+
|
|
255
|
+
def my_signal(data, index, position, entry_price, entry_index,
|
|
256
|
+
take_profit, stop_loss, check_periods):
|
|
257
|
+
# 使用factor中的因子
|
|
258
|
+
ma_value = ma_factor(data, index, period=5)
|
|
259
|
+
rsi_value = rsi_factor(data, index, period=14)
|
|
260
|
+
|
|
261
|
+
# 基于因子值生成交易信号
|
|
262
|
+
if ma_value > 0 and rsi_value > 0:
|
|
263
|
+
return 'buy'
|
|
264
|
+
elif ma_value < 0 and rsi_value < 0:
|
|
265
|
+
return 'sell'
|
|
266
|
+
else:
|
|
267
|
+
return 'hold'
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## 注意事项
|
|
271
|
+
|
|
272
|
+
1. 因子函数和信号函数都需要处理数据不足的情况(返回0或'hold')
|
|
273
|
+
2. 信号函数需要检查止盈止损条件
|
|
274
|
+
3. 使用因子或信号时,通常需要创建包装函数来适配框架的参数要求
|
|
275
|
+
4. 多因子组合时,注意权重的归一化
|
|
276
|
+
|