Skip to content

Commit 5351207

Browse files
committed
Support refresh entities
1 parent 5dffad4 commit 5351207

38 files changed

+1536
-514
lines changed

examples/factors/tech_factor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def __init__(
2929
level: Union[str, IntervalLevel] = IntervalLevel.LEVEL_1DAY,
3030
category_field: str = "entity_id",
3131
time_field: str = "timestamp",
32-
computing_window: int = None,
32+
keep_window: int = None,
3333
keep_all_timestamp: bool = False,
3434
fill_method: str = "ffill",
3535
effective_number: int = None,
@@ -63,7 +63,7 @@ def __init__(
6363
level,
6464
category_field,
6565
time_field,
66-
computing_window,
66+
keep_window,
6767
keep_all_timestamp,
6868
fill_method,
6969
effective_number,

examples/report_utils.py

Lines changed: 15 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55

66
from examples.utils import add_to_eastmoney
77
from zvt import zvt_config
8-
from zvt.api import get_top_volume_entities, get_top_performance_entities, TopType
8+
from zvt.api import get_top_volume_entities, TopType
99
from zvt.api.kdata import get_latest_kdata_date, get_kdata_schema, default_adjust_type
10-
from zvt.api.selector import get_entity_ids_by_filter
10+
from zvt.api.stats import get_top_performance_entities_by_periods
1111
from zvt.contract import IntervalLevel
1212
from zvt.contract.api import get_entities, get_entity_schema
13-
from zvt.contract.factor import Factor
14-
from zvt.factors import TargetSelector, SelectMode
13+
from zvt.contract.factor import Factor, TargetType
1514
from zvt.informer import EmailInformer
1615
from zvt.utils import next_date
1716

@@ -109,9 +108,6 @@ def report_targets(
109108
current_entity_pool = set(factor_kv.pop("entity_ids"))
110109

111110
# add the factor
112-
my_selector = TargetSelector(
113-
start_timestamp=start_timestamp, end_timestamp=target_date, select_mode=SelectMode.condition_or
114-
)
115111
entity_schema = get_entity_schema(entity_type=entity_type)
116112
tech_factor = factor_cls(
117113
entity_schema=entity_schema,
@@ -123,11 +119,8 @@ def report_targets(
123119
adjust_type=adjust_type,
124120
**factor_kv,
125121
)
126-
my_selector.add_factor(tech_factor)
127-
128-
my_selector.run()
129122

130-
long_stocks = my_selector.get_open_long_targets(timestamp=target_date)
123+
long_stocks = tech_factor.get_targets(timestamp=target_date, target_type=TargetType.positive)
131124

132125
inform(
133126
informer,
@@ -174,79 +167,25 @@ def report_top_entities(
174167

175168
while error_count <= 10:
176169
try:
177-
if periods is None:
178-
periods = [7, 30, 365]
179-
if not adjust_type:
180-
adjust_type = default_adjust_type(entity_type=entity_type)
181-
kdata_schema = get_kdata_schema(entity_type=entity_type, adjust_type=adjust_type)
182-
entity_schema = get_entity_schema(entity_type=entity_type)
183-
184170
target_date = get_latest_kdata_date(
185171
provider=data_provider, entity_type=entity_type, adjust_type=adjust_type
186172
)
187173

188-
filter_entity_ids = get_entity_ids_by_filter(
189-
provider=entity_provider,
190-
ignore_st=ignore_st,
174+
selected = get_top_performance_entities_by_periods(
175+
entity_provider=entity_provider,
176+
data_provider=data_provider,
177+
periods=periods,
191178
ignore_new_stock=ignore_new_stock,
192-
entity_schema=entity_schema,
193-
target_date=target_date,
179+
ignore_st=ignore_st,
194180
entity_ids=entity_ids,
181+
entity_type=entity_type,
182+
adjust_type=adjust_type,
183+
top_count=top_count,
184+
turnover_threshold=turnover_threshold,
185+
turnover_rate_threshold=turnover_rate_threshold,
186+
return_type=return_type,
195187
)
196188

197-
if not filter_entity_ids:
198-
msg = f"{entity_type} no entity_ids selected"
199-
logger.error(msg)
200-
informer.send_message(zvt_config["email_username"], "report_top_stats error", msg)
201-
return
202-
203-
filter_turnover_df = kdata_schema.query_data(
204-
filters=[
205-
kdata_schema.turnover >= turnover_threshold,
206-
kdata_schema.turnover_rate >= turnover_rate_threshold,
207-
],
208-
provider=data_provider,
209-
start_timestamp=target_date,
210-
index="entity_id",
211-
columns=["entity_id", "code"],
212-
)
213-
if filter_entity_ids:
214-
filter_entity_ids = set(filter_entity_ids) & set(filter_turnover_df.index.tolist())
215-
else:
216-
filter_entity_ids = filter_turnover_df.index.tolist()
217-
218-
if not filter_entity_ids:
219-
msg = f"{entity_type} no entity_ids selected"
220-
logger.error(msg)
221-
informer.send_message(zvt_config["email_username"], "report_top_stats error", msg)
222-
return
223-
224-
logger.info(f"{entity_type} filter_entity_ids size: {len(filter_entity_ids)}")
225-
filters = [kdata_schema.entity_id.in_(filter_entity_ids)]
226-
selected = []
227-
for i, period in enumerate(periods):
228-
interval = period
229-
if target_date.weekday() + 1 < interval:
230-
interval = interval + 2
231-
start = next_date(target_date, -interval)
232-
positive_df, negative_df = get_top_performance_entities(
233-
entity_type=entity_type,
234-
start_timestamp=start,
235-
kdata_filters=filters,
236-
pct=1,
237-
show_name=True,
238-
entity_provider=entity_provider,
239-
data_provider=data_provider,
240-
return_type=return_type,
241-
)
242-
243-
if return_type == TopType.positive:
244-
df = positive_df
245-
else:
246-
df = negative_df
247-
selected = selected + df.index[:top_count].tolist()
248-
selected = list(dict.fromkeys(selected))
249-
250189
inform(
251190
informer,
252191
entity_ids=selected,

examples/research/top_dragon_tiger.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def __init__(
5151
level: Union[str, IntervalLevel] = IntervalLevel.LEVEL_1DAY,
5252
category_field: str = "entity_id",
5353
time_field: str = "timestamp",
54-
computing_window: int = None,
54+
keep_window: int = None,
5555
keep_all_timestamp: bool = False,
5656
fill_method: str = "ffill",
5757
effective_number: int = None,
@@ -80,7 +80,7 @@ def __init__(
8080
level,
8181
category_field,
8282
time_field,
83-
computing_window,
83+
keep_window,
8484
keep_all_timestamp,
8585
fill_method,
8686
effective_number,

examples/trader/dragon_and_tiger_trader.py

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from zvt.contract import IntervalLevel
77
from zvt.contract.factor import Factor, Transformer, Accumulator
88
from zvt.domain import Stock, DragonAndTiger
9-
from zvt.factors import TargetSelector
109
from zvt.trader import StockTrader
1110

1211

@@ -27,7 +26,7 @@ def __init__(
2726
level: Union[str, IntervalLevel] = IntervalLevel.LEVEL_1DAY,
2827
category_field: str = "entity_id",
2928
time_field: str = "timestamp",
30-
computing_window: int = None,
29+
keep_window: int = None,
3130
keep_all_timestamp: bool = False,
3231
fill_method: str = "ffill",
3332
effective_number: int = None,
@@ -56,7 +55,7 @@ def __init__(
5655
level,
5756
category_field,
5857
time_field,
59-
computing_window,
58+
keep_window,
6059
keep_all_timestamp,
6160
fill_method,
6261
effective_number,
@@ -75,30 +74,18 @@ def compute_result(self):
7574

7675

7776
class MyTrader(StockTrader):
78-
def init_selectors(
77+
def init_factors(
7978
self, entity_ids, entity_schema, exchanges, codes, start_timestamp, end_timestamp, adjust_type=None
8079
):
81-
myselector = TargetSelector(
82-
entity_ids=entity_ids,
83-
entity_schema=entity_schema,
84-
exchanges=exchanges,
85-
codes=codes,
86-
start_timestamp=start_timestamp,
87-
end_timestamp=end_timestamp,
88-
provider="em",
89-
)
90-
91-
myselector.add_factor(
80+
return [
9281
DragonTigerFactor(
9382
entity_ids=entity_ids,
9483
exchanges=exchanges,
9584
codes=codes,
9685
start_timestamp=start_timestamp,
9786
end_timestamp=end_timestamp,
9887
)
99-
)
100-
101-
self.selectors.append(myselector)
88+
]
10289

10390

10491
if __name__ == "__main__":

examples/trader/keep_run_trader.py

Lines changed: 24 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -5,70 +5,41 @@
55
from zvt.api.stats import get_top_fund_holding_stocks
66
from zvt.api.trader_info_api import clear_trader
77
from zvt.contract import IntervalLevel
8-
from zvt.factors import TargetSelector, GoldCrossFactor, BullFactor
8+
from zvt.factors import GoldCrossFactor, BullFactor
99
from zvt.trader import StockTrader
1010
from zvt.utils.time_utils import split_time_interval, next_date
1111

1212
logger = logging.getLogger(__name__)
1313

1414

1515
class MultipleLevelTrader(StockTrader):
16-
def init_selectors(
16+
def init_factors(
1717
self, entity_ids, entity_schema, exchanges, codes, start_timestamp, end_timestamp, adjust_type=None
1818
):
1919
start_timestamp = next_date(start_timestamp, -50)
2020

21-
# 周线策略
22-
week_selector = TargetSelector(
23-
entity_ids=entity_ids,
24-
entity_schema=entity_schema,
25-
exchanges=exchanges,
26-
codes=codes,
27-
start_timestamp=next_date(start_timestamp, -200),
28-
end_timestamp=end_timestamp,
29-
long_threshold=0.7,
30-
level=IntervalLevel.LEVEL_1WEEK,
31-
provider="joinquant",
32-
)
33-
week_bull_factor = BullFactor(
34-
entity_ids=entity_ids,
35-
entity_schema=entity_schema,
36-
exchanges=exchanges,
37-
codes=codes,
38-
start_timestamp=next_date(start_timestamp, -200),
39-
end_timestamp=end_timestamp,
40-
provider="joinquant",
41-
level=IntervalLevel.LEVEL_1WEEK,
42-
)
43-
week_selector.add_factor(week_bull_factor)
44-
45-
# 日线策略
46-
day_selector = TargetSelector(
47-
entity_ids=entity_ids,
48-
entity_schema=entity_schema,
49-
exchanges=exchanges,
50-
codes=codes,
51-
start_timestamp=start_timestamp,
52-
end_timestamp=end_timestamp,
53-
long_threshold=0.7,
54-
level=IntervalLevel.LEVEL_1DAY,
55-
provider="joinquant",
56-
)
57-
day_gold_cross_factor = GoldCrossFactor(
58-
entity_ids=entity_ids,
59-
entity_schema=entity_schema,
60-
exchanges=exchanges,
61-
codes=codes,
62-
start_timestamp=start_timestamp,
63-
end_timestamp=end_timestamp,
64-
provider="joinquant",
65-
level=IntervalLevel.LEVEL_1DAY,
66-
)
67-
day_selector.add_factor(day_gold_cross_factor)
68-
69-
# 同时使用日线,周线级别
70-
self.selectors.append(day_selector)
71-
self.selectors.append(week_selector)
21+
return [
22+
BullFactor(
23+
entity_ids=entity_ids,
24+
entity_schema=entity_schema,
25+
exchanges=exchanges,
26+
codes=codes,
27+
start_timestamp=next_date(start_timestamp, -200),
28+
end_timestamp=end_timestamp,
29+
provider="joinquant",
30+
level=IntervalLevel.LEVEL_1WEEK,
31+
),
32+
GoldCrossFactor(
33+
entity_ids=entity_ids,
34+
entity_schema=entity_schema,
35+
exchanges=exchanges,
36+
codes=codes,
37+
start_timestamp=start_timestamp,
38+
end_timestamp=end_timestamp,
39+
provider="joinquant",
40+
level=IntervalLevel.LEVEL_1DAY,
41+
),
42+
]
7243

7344

7445
if __name__ == "__main__":

examples/trader/ma_trader.py

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,16 @@
11
# -*- coding: utf-8 -*-
22
from zvt.contract import IntervalLevel
33
from zvt.factors import CrossMaFactor
4-
from zvt.factors.target_selector import TargetSelector
54
from zvt.factors.macd import BullFactor
65

76
from zvt.trader.trader import StockTrader
87

98

109
class MyMaTrader(StockTrader):
11-
def init_selectors(
10+
def init_factors(
1211
self, entity_ids, entity_schema, exchanges, codes, start_timestamp, end_timestamp, adjust_type=None
1312
):
14-
myselector = TargetSelector(
15-
entity_ids=entity_ids,
16-
entity_schema=entity_schema,
17-
exchanges=exchanges,
18-
codes=codes,
19-
start_timestamp=start_timestamp,
20-
end_timestamp=end_timestamp,
21-
provider="joinquant",
22-
)
23-
24-
myselector.add_factor(
13+
return [
2514
CrossMaFactor(
2615
entity_ids=entity_ids,
2716
entity_schema=entity_schema,
@@ -32,26 +21,14 @@ def init_selectors(
3221
windows=[5, 10],
3322
need_persist=False,
3423
)
35-
)
36-
37-
self.selectors.append(myselector)
24+
]
3825

3926

4027
class MyBullTrader(StockTrader):
41-
def init_selectors(
28+
def init_factors(
4229
self, entity_ids, entity_schema, exchanges, codes, start_timestamp, end_timestamp, adjust_type=None
4330
):
44-
myselector = TargetSelector(
45-
entity_ids=entity_ids,
46-
entity_schema=entity_schema,
47-
exchanges=exchanges,
48-
codes=codes,
49-
start_timestamp=start_timestamp,
50-
end_timestamp=end_timestamp,
51-
provider="joinquant",
52-
)
53-
54-
myselector.add_factor(
31+
return [
5532
BullFactor(
5633
entity_ids=entity_ids,
5734
entity_schema=entity_schema,
@@ -61,9 +38,7 @@ def init_selectors(
6138
end_timestamp=end_timestamp,
6239
adjust_type="hfq",
6340
)
64-
)
65-
66-
self.selectors.append(myselector)
41+
]
6742

6843

6944
if __name__ == "__main__":

0 commit comments

Comments
 (0)