Skip to content

Commit 30db5e7

Browse files
committed
Config log for api server
1 parent 10f8ef7 commit 30db5e7

File tree

8 files changed

+134
-27
lines changed

8 files changed

+134
-27
lines changed

src/zvt/factors/algorithm.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ def __init__(self, windows=None, vol_windows=None, kdata_overlap=0) -> None:
234234

235235
def transform(self, input_df) -> pd.DataFrame:
236236
for window in self.windows:
237-
col = "ma{}".format(window)
237+
col = f"ma{window}"
238238
self.indicators.append(col)
239239

240240
ma_df = input_df["close"].groupby(level=0).rolling(window=window, min_periods=window).mean()
@@ -243,7 +243,6 @@ def transform(self, input_df) -> pd.DataFrame:
243243

244244
for vol_window in self.vol_windows:
245245
col = "vol_ma{}".format(vol_window)
246-
self.indicators.append(col)
247246

248247
vol_ma_df = input_df["volume"].groupby(level=0).rolling(window=vol_window, min_periods=vol_window).mean()
249248
vol_ma_df = vol_ma_df.reset_index(level=0, drop=True)

src/zvt/factors/factor_service.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from zvt.api import kdata as kdata_api
55
from zvt.contract import zvt_context
66
from zvt.domain import Stock
7-
from zvt.factors.technical_factor import TechnicalFactor
87
from zvt.factors.factor_models import FactorRequestModel, KdataRequestModel
8+
from zvt.factors.technical_factor import TechnicalFactor
99
from zvt.trader import TradingSignalType
1010
from zvt.utils.pd_utils import pd_is_not_null
1111

@@ -20,13 +20,7 @@ def query_kdata(kdata_request_model: KdataRequestModel):
2020
adjust_type=kdata_request_model.adjust_type,
2121
)
2222
if pd_is_not_null(kdata_df):
23-
# entity_id: str
24-
# code: str
25-
# name: str
26-
# level: IntervalLevel = Field(default=IntervalLevel.LEVEL_1DAY)
27-
# data: List[float]
28-
kdata_df["timestamp"] = pd.to_datetime(kdata_df["timestamp"])
29-
kdata_df["timestamp"] = kdata_df["timestamp"].astype(int) // 10 ** 9
23+
kdata_df["timestamp"] = kdata_df["timestamp"].apply(lambda x: int(x.timestamp()))
3024
kdata_df["data"] = kdata_df.apply(
3125
lambda x: x[
3226
["timestamp", "open", "high", "low", "close", "volume", "turnover", "change_pct", "turnover_rate"]
@@ -40,7 +34,6 @@ def query_kdata(kdata_request_model: KdataRequestModel):
4034
datas=("data", lambda data: list(data)),
4135
)
4236
df = df.reset_index(drop=False)
43-
print(df)
4437
return df.to_dict(orient="records")
4538

4639

src/zvt/factors/ma/ma_factor.py

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,80 @@ def compute_result(self):
228228
filter_result = filter_up & s & filter_turnover
229229

230230
self.result_df = filter_result.to_frame(name="filter_result")
231+
# self.result_df = self.result_df.replace(False, None)
231232

232233

233234
class CrossMaVolumeFactor(VolumeUpMaFactor):
235+
def __init__(
236+
self,
237+
entity_schema: Type[TradableEntity] = Stock,
238+
provider: str = None,
239+
entity_provider: str = None,
240+
entity_ids: List[str] = None,
241+
exchanges: List[str] = None,
242+
codes: List[str] = None,
243+
start_timestamp: Union[str, pd.Timestamp] = None,
244+
end_timestamp: Union[str, pd.Timestamp] = None,
245+
columns: List = None,
246+
filters: List = None,
247+
order: object = None,
248+
limit: int = None,
249+
level: Union[str, IntervalLevel] = IntervalLevel.LEVEL_1DAY,
250+
category_field: str = "entity_id",
251+
time_field: str = "timestamp",
252+
keep_window: int = None,
253+
keep_all_timestamp: bool = False,
254+
fill_method: str = "ffill",
255+
effective_number: int = None,
256+
accumulator: Accumulator = None,
257+
need_persist: bool = False,
258+
only_compute_factor: bool = False,
259+
factor_name: str = None,
260+
clear_state: bool = False,
261+
only_load_factor: bool = False,
262+
adjust_type: Union[AdjustType, str] = None,
263+
windows=[5, 10, 250],
264+
vol_windows=None,
265+
turnover_threshold=300000000,
266+
turnover_rate_threshold=0.02,
267+
up_intervals=40,
268+
over_mode="and",
269+
) -> None:
270+
super().__init__(
271+
entity_schema,
272+
provider,
273+
entity_provider,
274+
entity_ids,
275+
exchanges,
276+
codes,
277+
start_timestamp,
278+
end_timestamp,
279+
columns,
280+
filters,
281+
order,
282+
limit,
283+
level,
284+
category_field,
285+
time_field,
286+
keep_window,
287+
keep_all_timestamp,
288+
fill_method,
289+
effective_number,
290+
accumulator,
291+
need_persist,
292+
only_compute_factor,
293+
factor_name,
294+
clear_state,
295+
only_load_factor,
296+
adjust_type,
297+
windows,
298+
vol_windows,
299+
turnover_threshold,
300+
turnover_rate_threshold,
301+
up_intervals,
302+
over_mode,
303+
)
304+
234305
def compute_result(self):
235306
# 均线多头排列
236307
cols = [f"ma{window}" for window in self.windows]
@@ -241,23 +312,21 @@ def compute_result(self):
241312
current_col = col
242313

243314
filter_se = filter_se & (self.factor_df["turnover"] > self.turnover_threshold)
244-
245-
print(self.factor_df[filter_se])
246315
self.result_df = filter_se.to_frame(name="filter_result")
316+
# self.result_df = self.result_df.replace(False, None)
247317

248318

249319
if __name__ == "__main__":
250320

251-
factor = VolumeUpMaFactor(
321+
factor = CrossMaVolumeFactor(
252322
entity_provider="em",
253323
provider="em",
254324
entity_ids=["stock_sz_000338"],
255325
start_timestamp="2020-01-01",
256326
end_timestamp=now_pd_timestamp(),
257327
need_persist=False,
258328
)
259-
selected = factor.get_targets(timestamp="2021-12-30")
260-
print(selected)
329+
factor.drawer().draw(show=True)
261330

262331

263332
# the __all__ is generated

src/zvt/factors/macd/macd_factor.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def compute_result(self):
2828

2929

3030
class KeepBullFactor(BullFactor):
31-
keep_window = 20
31+
keep_window = 10
3232

3333
def compute_result(self):
3434
super().compute_result()
@@ -61,12 +61,8 @@ def compute_result(self):
6161

6262

6363
if __name__ == "__main__":
64-
f = BullFactor(provider="em", entity_provider="em", entity_ids=["stock_sz_000338"])
65-
print(f.data_df)
66-
f.update_entity_ids(["stock_sz_000338", "stock_sh_600000"])
67-
f.move_on()
68-
print(f.data_df)
69-
64+
f = GoldCrossFactor(provider="em", entity_provider="em", entity_ids=["stock_sz_000338"])
65+
f.drawer().draw(show=True)
7066

7167
# the __all__ is generated
7268
__all__ = ["MacdFactor", "BullFactor", "KeepBullFactor", "LiveOrDeadFactor", "GoldCrossFactor"]

src/zvt/resources/log_conf.yaml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
version: 1
2+
disable_existing_loggers: False
3+
formatters:
4+
default:
5+
# "()": uvicorn.logging.DefaultFormatter
6+
format: '%(asctime)s %(levelname)s %(threadName)s %(message)s'
7+
access:
8+
# "()": uvicorn.logging.AccessFormatter
9+
format: '%(asctime)s %(levelname)s %(threadName)s %(message)s'
10+
handlers:
11+
default:
12+
formatter: default
13+
class: logging.StreamHandler
14+
stream: ext://sys.stderr
15+
file:
16+
class: logging.handlers.RotatingFileHandler
17+
formatter: default
18+
filename: server.log
19+
maxBytes: 524288000
20+
level: INFO
21+
backupCount: 10
22+
access:
23+
formatter: access
24+
class: logging.StreamHandler
25+
stream: ext://sys.stdout
26+
loggers:
27+
uvicorn.error:
28+
level: INFO
29+
handlers:
30+
- default
31+
propagate: no
32+
uvicorn.access:
33+
level: INFO
34+
handlers:
35+
- access
36+
propagate: no
37+
root:
38+
level: INFO
39+
handlers:
40+
- default
41+
- file
42+
propagate: no

src/zvt/server.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
# -*- coding: utf-8 -*-
2+
import os
3+
24
import uvicorn
35
from fastapi import FastAPI
46
from fastapi.middleware.cors import CORSMiddleware
57
from fastapi.responses import ORJSONResponse
68
from fastapi_pagination import add_pagination
79

10+
from zvt import zvt_env
811
from zvt.rest.data import data_router
912
from zvt.rest.factor import factor_router
1013
from zvt.rest.trading import trading_router
@@ -37,4 +40,5 @@ async def root():
3740

3841

3942
if __name__ == "__main__":
40-
uvicorn.run("server:app", host="0.0.0.0", reload=True, port=8090)
43+
log_config = os.path.join(zvt_env["resource_path"], "log_conf.yaml")
44+
uvicorn.run("server:app", host="0.0.0.0", reload=True, port=8090, log_config=log_config)

src/zvt/tag/tag_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ def query_stock_tag_stats(query_stock_tag_stats_model: QueryStockTagStatsModel):
366366
return_type="domain",
367367
)
368368
if not datas:
369-
return None
369+
return []
370370

371371
target_date = datas[0].timestamp
372372

src/zvt/trading/trading_service.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,10 @@ def query_tag_quotes(query_tag_quote_model: QueryTagQuoteModel):
116116
limit=1,
117117
return_type="domain",
118118
)
119-
entity_ids = stock_pools[0].entity_ids
119+
if stock_pools:
120+
entity_ids = stock_pools[0].entity_ids
121+
else:
122+
entity_ids = None
120123

121124
tag_df = StockTags.query_data(
122125
entity_ids=entity_ids,
@@ -237,7 +240,8 @@ def build_query_stock_quote_setting(build_query_stock_quote_setting_model: Build
237240

238241

239242
if __name__ == "__main__":
240-
print(query_tag_quotes(QueryTagQuoteModel(stock_pool_name="main_line", main_tags=["低空经济", "半导体", "化工", "消费电子"])))
243+
print(query_tag_quotes(QueryTagQuoteModel(stock_pool_name="all", main_tags=["低空经济", "半导体", "化工", "消费电子"])))
244+
print(query_stock_quotes(QueryStockQuoteModel(stock_pool_name="all", main_tag="半导体")))
241245

242246
# the __all__ is generated
243247
__all__ = [

0 commit comments

Comments
 (0)