Skip to content

Commit f7fff6f

Browse files
committed
集中更新一些
1 parent 7284e27 commit f7fff6f

30 files changed

+606
-439
lines changed

database/finhack_structure.sql

+1-182
Original file line numberDiff line numberDiff line change
@@ -1,182 +1 @@
1-
-- MySQL dump 10.13 Distrib 8.0.30, for Linux (x86_64)
2-
--
3-
-- Host: localhost Database: finhack
4-
-- ------------------------------------------------------
5-
-- Server version 8.0.30
6-
7-
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8-
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9-
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10-
/*!50503 SET NAMES utf8mb4 */;
11-
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12-
/*!40103 SET TIME_ZONE='+00:00' */;
13-
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14-
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15-
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16-
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17-
18-
--
19-
-- Table structure for table `auto_train`
20-
--
21-
22-
DROP TABLE IF EXISTS `auto_train`;
23-
/*!40101 SET @saved_cs_client = @@character_set_client */;
24-
/*!50503 SET character_set_client = utf8mb4 */;
25-
CREATE TABLE `auto_train` (
26-
`id` int NOT NULL AUTO_INCREMENT,
27-
`start_date` varchar(10) DEFAULT NULL,
28-
`valid_date` varchar(10) DEFAULT NULL,
29-
`end_date` varchar(10) DEFAULT NULL,
30-
`features` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
31-
`label` varchar(255) DEFAULT NULL,
32-
`shift` int DEFAULT NULL,
33-
`param` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
34-
`hash` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
35-
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
36-
`loss` varchar(255) DEFAULT NULL,
37-
`algorithm` varchar(255) DEFAULT NULL,
38-
`filter` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '',
39-
`score` double(10,10) DEFAULT NULL,
40-
PRIMARY KEY (`id`)
41-
) ENGINE=InnoDB AUTO_INCREMENT=13734 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
42-
/*!40101 SET character_set_client = @saved_cs_client */;
43-
44-
--
45-
-- Table structure for table `backtest`
46-
--
47-
48-
DROP TABLE IF EXISTS `backtest`;
49-
/*!40101 SET @saved_cs_client = @@character_set_client */;
50-
/*!50503 SET character_set_client = utf8mb4 */;
51-
CREATE TABLE `backtest` (
52-
`id` int NOT NULL AUTO_INCREMENT,
53-
`instance_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
54-
`features_list` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
55-
`train` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
56-
`model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
57-
`strategy` varchar(255) DEFAULT NULL,
58-
`start_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
59-
`end_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
60-
`init_cash` double(100,5) DEFAULT NULL,
61-
`args` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
62-
`history` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
63-
`returns` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
64-
`logs` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
65-
`total_value` double(100,5) DEFAULT NULL,
66-
`alpha` double(100,5) DEFAULT NULL,
67-
`beta` double(100,5) DEFAULT NULL,
68-
`annual_return` double(100,5) DEFAULT NULL,
69-
`cagr` double(100,5) DEFAULT NULL,
70-
`annual_volatility` double(100,5) DEFAULT NULL,
71-
`info_ratio` double(100,5) DEFAULT NULL,
72-
`downside_risk` double(100,5) DEFAULT NULL,
73-
`R2` double(100,5) DEFAULT NULL,
74-
`sharpe` double(100,5) DEFAULT NULL,
75-
`sortino` double(100,5) DEFAULT NULL,
76-
`calmar` double(100,5) DEFAULT NULL,
77-
`omega` double(100,5) DEFAULT NULL,
78-
`max_down` double(100,5) DEFAULT NULL,
79-
`SQN` double(100,5) DEFAULT NULL,
80-
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
81-
`filter` varchar(255) DEFAULT '',
82-
`win` double(100,5) DEFAULT NULL,
83-
`server` varchar(255) DEFAULT NULL,
84-
`trade_num` int DEFAULT NULL,
85-
`runtime` varchar(255) DEFAULT NULL,
86-
`starttime` varchar(100) DEFAULT NULL,
87-
`endtime` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
88-
`benchReturns` mediumtext,
89-
`roto` double(100,5) DEFAULT NULL,
90-
`simulate` int DEFAULT '0',
91-
`benchmark` varchar(255) DEFAULT NULL,
92-
`strategy_code` text,
93-
PRIMARY KEY (`id`),
94-
UNIQUE KEY `instence_id` (`instance_id`)
95-
) ENGINE=InnoDB AUTO_INCREMENT=390397 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
96-
/*!40101 SET character_set_client = @saved_cs_client */;
97-
98-
--
99-
-- Table structure for table `factors_analysis`
100-
--
101-
102-
DROP TABLE IF EXISTS `factors_analysis`;
103-
/*!40101 SET @saved_cs_client = @@character_set_client */;
104-
/*!50503 SET character_set_client = utf8mb4 */;
105-
CREATE TABLE `factors_analysis` (
106-
`id` int NOT NULL AUTO_INCREMENT,
107-
`factor_name` varchar(255) DEFAULT NULL,
108-
`days` varchar(255) DEFAULT NULL,
109-
`source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
110-
`start_date` varchar(10) DEFAULT NULL,
111-
`end_date` varchar(10) DEFAULT NULL,
112-
`formula` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
113-
`IC` float(10,5) DEFAULT NULL,
114-
`IR` float(10,5) DEFAULT NULL,
115-
`Sharpe` float(10,5) DEFAULT NULL,
116-
`score` float(10,5) DEFAULT NULL,
117-
`max_up_corr` float(10,7) DEFAULT NULL,
118-
`hash` varchar(255) DEFAULT NULL,
119-
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
120-
PRIMARY KEY (`id`)
121-
) ENGINE=InnoDB AUTO_INCREMENT=3035 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
122-
/*!40101 SET character_set_client = @saved_cs_client */;
123-
124-
--
125-
-- Table structure for table `factors_list`
126-
--
127-
128-
DROP TABLE IF EXISTS `factors_list`;
129-
/*!40101 SET @saved_cs_client = @@character_set_client */;
130-
/*!50503 SET character_set_client = utf8mb4 */;
131-
CREATE TABLE `factors_list` (
132-
`id` int NOT NULL AUTO_INCREMENT,
133-
`factor_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
134-
`indicators` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
135-
`func_name` varchar(255) DEFAULT NULL,
136-
`code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
137-
`return_fileds` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
138-
`md5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
139-
`check_type` int DEFAULT '0',
140-
`status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT 'activate',
141-
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
142-
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP,
143-
PRIMARY KEY (`id`)
144-
) ENGINE=InnoDB AUTO_INCREMENT=2491 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
145-
/*!40101 SET character_set_client = @saved_cs_client */;
146-
147-
--
148-
-- Table structure for table `factors_mining`
149-
--
150-
151-
DROP TABLE IF EXISTS `factors_mining`;
152-
/*!40101 SET @saved_cs_client = @@character_set_client */;
153-
/*!50503 SET character_set_client = utf8mb4 */;
154-
CREATE TABLE `factors_mining` (
155-
`id` int NOT NULL AUTO_INCREMENT,
156-
`factor_name` varchar(255) DEFAULT NULL,
157-
`days` varchar(255) DEFAULT NULL,
158-
`source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
159-
`start_date` varchar(10) DEFAULT NULL,
160-
`end_date` varchar(10) DEFAULT NULL,
161-
`formula` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
162-
`IC` float(20,5) DEFAULT NULL,
163-
`IR` float(20,5) DEFAULT NULL,
164-
`Sharpe` float(20,5) DEFAULT NULL,
165-
`score` float(10,5) DEFAULT NULL,
166-
`hash` varchar(255) DEFAULT NULL,
167-
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
168-
PRIMARY KEY (`id`),
169-
UNIQUE KEY `hash` (`hash`(32)) USING BTREE
170-
) ENGINE=InnoDB AUTO_INCREMENT=33135 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
171-
/*!40101 SET character_set_client = @saved_cs_client */;
172-
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
173-
174-
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
175-
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
176-
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
177-
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
178-
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
179-
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
180-
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
181-
182-
-- Dump completed on 2024-03-20 12:52:37
1+
mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: NO) when trying to connect

examples/demo-project/backtest/default/default_backtest.py

+21-6
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,22 @@
88
from finhack.library.config import Config
99
import itertools
1010
import json
11+
import psutil
12+
import time
1113
class DefaultBacktest():
1214
def __init__(self):
1315
pass
1416

1517
def run_command_with_semaphore(self, cmd, semaphore):
1618
with semaphore:
1719
try:
20+
available_memory=1
21+
total_memory=100
22+
#如果当前可用内存不足1/10
23+
while available_memory/total_memory<0.1:
24+
time.sleep(10)
25+
total_memory = psutil.virtual_memory().total
26+
available_memory = psutil.virtual_memory().available
1827
os.system(cmd)
1928
except Exception as e:
2029
print(f'An error occurred: {e}')
@@ -23,9 +32,9 @@ def run(self):
2332
Data.init_data(cache=True)
2433
cash_list = self.args.cash.split(',')
2534
strategy_list = self.args.strategy.split(',')
26-
model_list = mydb.selectToDf('select * from auto_train order by score desc', 'finhack')
35+
model_list = mydb.selectToDf('select * from auto_train order by rand()', 'finhack')
2736

28-
semaphore = multiprocessing.Semaphore(int(self.args.p)) # 创建一个信号量,最大允许p个进程同时运行
37+
semaphore = multiprocessing.Semaphore(int(self.args.process)) # 创建一个信号量,最大允许process个进程同时运行
2938
# print(model_list)
3039
# exit()
3140

@@ -68,17 +77,23 @@ def run(self):
6877
args_list = [dict(zip(split_values.keys(), combination)) for combination in product_combinations]
6978
# 打印结果
7079
for args in args_list:
80+
time.sleep(1)
81+
active_processes = len(multiprocessing.active_children())
82+
while active_processes>int(self.args.process):
83+
active_processes = len(multiprocessing.active_children())
84+
time.sleep(1)
85+
7186
cmd = f"finhack trader run --strategy={strategy_name} --log_level=ERROR --model_id={model_hash} --cash={cash} --project_path={BASE_DIR} --args='{json.dumps(args)}'"
7287
# 创建Process对象,传入函数和需要的参数,包括信号量
7388
p = multiprocessing.Process(target=self.run_command_with_semaphore, args=(cmd, semaphore))
7489
processes.append(p)
7590
p.start()
7691

77-
# 等待当前model的所有进程完成
78-
for p in processes:
79-
p.join()
92+
# # 等待当前model的所有进程完成
93+
# for p in processes:
94+
# p.join()
8095

8196
# 当前model的所有进程执行完毕,可以进行下一个model的处理
82-
delete_preds_data(model_hash)
97+
# delete_preds_data(model_hash)
8398

8499

examples/demo-project/strategy/AITopNStrategy.py

+14-6
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,22 @@ def initialize(context):
3131
g.days = 0
3232
# 调仓频率
3333
g.refresh_rate = int(context.get('args', {}).get('refresh_rate', 10))
34-
35-
run_daily(trade, time="09:30")
36-
model_id=context.trade.model_id
3734

35+
model_id=context.trade.model_id
3836
preds_data=load_preds_data(model_id)
3937
clsLgbTrainer=LightgbmTrainer()
4038
preds=clsLgbTrainer.pred(preds_data,md5=model_id,save=False)
41-
4239
g.preds=preds
4340

41+
run_daily(trade, time="19:30")
42+
43+
44+
4445

4546

4647
## 交易函数
4748
def trade(context):
49+
sync(context)
4850
if g.days%g.refresh_rate == 0:
4951
#print(context.portfolio.cash)
5052
sell_list = list(context.portfolio.positions.keys())
@@ -66,15 +68,21 @@ def trade(context):
6668
#print(stock_list)
6769
## 买入股票
6870
for stock in stock_list:
69-
if len(context.portfolio.positions.keys()) < g.stocknum:
71+
n=0
72+
# if len(context.portfolio.positions.keys()) < g.stocknum:
73+
if True:
7074
i=len(context.portfolio.positions.keys())+1
7175
N=g.stocknum
7276
a1=N
7377
ai=N-(i-1)*(N/i)
7478
Sn=N*N/2
7579
wi=ai/Sn
76-
order_value(stock, Cash*wi*10)
80+
o=order_value(stock, Cash*wi*10)
7781
#order_value(stock, Cash/(N-i+1))
82+
if o==True:
83+
n=n+1
84+
if n==g.stocknum:
85+
break
7886

7987
# 天计数加一
8088
g.days = 1

examples/demo-project/strategy/AITopNStrategy2.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,25 @@ def trade(context):
6868
num_stocks_to_buy = min(g.stocknum - len(current_holdings), len(potential_buys))
6969

7070
# 如果有股票需要买入
71+
n=0
7172
if num_stocks_to_buy > 0:
7273
# 计算每只股票的买入资金
74+
sync(context)
7375
cash_per_stock = context.portfolio.cash / num_stocks_to_buy
7476
# 买入股票
75-
for i, row in potential_buys.head(num_stocks_to_buy).iterrows():
77+
for i, row in potential_buys.iterrows():
7678
stock_to_buy = row['ts_code']
7779
# 如果股票不在当前持仓中,则买入
7880
if stock_to_buy not in current_holdings:
79-
order_value(stock_to_buy, cash_per_stock)
81+
o=order_value(stock_to_buy, cash_per_stock)
82+
if o==True:
83+
n=n+1
84+
if n==num_stocks_to_buy:
85+
break
8086

8187
# 更新交易日计数器
8288
g.days = 1
8389
else:
8490
# 如果不是调仓日,交易日计数器累加
8591
g.days += 1
86-
92+

examples/demo-project/trader/qmt/context.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44

55

6-
g=DictObj()
6+
g=DictObj({
7+
'preds':None
8+
})
79

810

911
context_attr= {
@@ -26,7 +28,7 @@
2628
'sliptype':'pricerelated',
2729
'rule_list':''
2830
}),
29-
'g':{},
31+
'g':g,
3032
'account':DictObj({
3133
'username':'',
3234
'password':'',

examples/demo-project/trader/qmt/dictobj.py

+19
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,25 @@ def __init__(self, attr=None):
88
attr[key] = DictObj(value)
99
self._attributes = attr
1010

11+
12+
def __getstate__(self):
13+
# 在序列化时调用,返回对象的状态
14+
# 将所有 DictObj 实例转换为普通字典
15+
state = self._attributes.copy()
16+
for key, value in state.items():
17+
if isinstance(value, DictObj):
18+
state[key] = value.__getstate__() # 递归调用以处理嵌套的 DictObj
19+
return state
20+
21+
def __setstate__(self, state):
22+
# 在反序列化时调用,使用保存的状态重新构建对象
23+
# 将所有普通字典转换回 DictObj 实例
24+
for key, value in state.items():
25+
if isinstance(value, dict):
26+
state[key] = DictObj(value) # 递归调用以处理嵌套的字典
27+
self._attributes = state
28+
29+
1130
def get(self, key, default=None):
1231
return self._attributes.get(key, default)
1332

0 commit comments

Comments
 (0)