agentopia 1.0.0
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.
- package/.claude/settings.local.json +28 -0
- package/dist/app.d.ts +10 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +121 -0
- package/dist/app.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/db/database.d.ts +5 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +39 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +621 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +9 -0
- package/dist/logger.js.map +1 -0
- package/dist/middleware/auth.d.ts +13 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +733 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/routes/agents.d.ts +3 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +1058 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/issues.d.ts +4 -0
- package/dist/routes/issues.d.ts.map +1 -0
- package/dist/routes/issues.js +946 -0
- package/dist/routes/issues.js.map +1 -0
- package/dist/routes/knowledge.d.ts +3 -0
- package/dist/routes/knowledge.d.ts.map +1 -0
- package/dist/routes/knowledge.js +117 -0
- package/dist/routes/knowledge.js.map +1 -0
- package/dist/routes/memories.d.ts +3 -0
- package/dist/routes/memories.d.ts.map +1 -0
- package/dist/routes/memories.js +115 -0
- package/dist/routes/memories.js.map +1 -0
- package/dist/routes/messages.d.ts +3 -0
- package/dist/routes/messages.d.ts.map +1 -0
- package/dist/routes/messages.js +130 -0
- package/dist/routes/messages.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +754 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/templates.d.ts +3 -0
- package/dist/routes/templates.d.ts.map +1 -0
- package/dist/routes/templates.js +117 -0
- package/dist/routes/templates.js.map +1 -0
- package/dist/routes/ui.d.ts +3 -0
- package/dist/routes/ui.d.ts.map +1 -0
- package/dist/routes/ui.js +38 -0
- package/dist/routes/ui.js.map +1 -0
- package/dist/services/agent-hierarchy.d.ts +14 -0
- package/dist/services/agent-hierarchy.d.ts.map +1 -0
- package/dist/services/agent-hierarchy.js +58 -0
- package/dist/services/agent-hierarchy.js.map +1 -0
- package/dist/services/agent-issue-batch.d.ts +17 -0
- package/dist/services/agent-issue-batch.d.ts.map +1 -0
- package/dist/services/agent-issue-batch.js +57 -0
- package/dist/services/agent-issue-batch.js.map +1 -0
- package/dist/services/controller.d.ts +4 -0
- package/dist/services/controller.d.ts.map +1 -0
- package/dist/services/controller.js +237 -0
- package/dist/services/controller.js.map +1 -0
- package/dist/services/langgraph-runner.d.ts +33 -0
- package/dist/services/langgraph-runner.d.ts.map +1 -0
- package/dist/services/langgraph-runner.js +478 -0
- package/dist/services/langgraph-runner.js.map +1 -0
- package/dist/services/orchestrator.d.ts +9 -0
- package/dist/services/orchestrator.d.ts.map +1 -0
- package/dist/services/orchestrator.js +116 -0
- package/dist/services/orchestrator.js.map +1 -0
- package/dist/services/pre-controller.d.ts +7 -0
- package/dist/services/pre-controller.d.ts.map +1 -0
- package/dist/services/pre-controller.js +101 -0
- package/dist/services/pre-controller.js.map +1 -0
- package/dist/services/process-manager.d.ts +67 -0
- package/dist/services/process-manager.d.ts.map +1 -0
- package/dist/services/process-manager.js +938 -0
- package/dist/services/process-manager.js.map +1 -0
- package/dist/services/project-permissions.d.ts +84 -0
- package/dist/services/project-permissions.d.ts.map +1 -0
- package/dist/services/project-permissions.js +129 -0
- package/dist/services/project-permissions.js.map +1 -0
- package/dist/services/scheduler.d.ts +6 -0
- package/dist/services/scheduler.d.ts.map +1 -0
- package/dist/services/scheduler.js +300 -0
- package/dist/services/scheduler.js.map +1 -0
- package/dist/services/system-prompt.d.ts +3 -0
- package/dist/services/system-prompt.d.ts.map +1 -0
- package/dist/services/system-prompt.js +285 -0
- package/dist/services/system-prompt.js.map +1 -0
- package/dist/services/terminal.d.ts +18 -0
- package/dist/services/terminal.d.ts.map +1 -0
- package/dist/services/terminal.js +222 -0
- package/dist/services/terminal.js.map +1 -0
- package/dist/services/websocket.d.ts +15 -0
- package/dist/services/websocket.d.ts.map +1 -0
- package/dist/services/websocket.js +204 -0
- package/dist/services/websocket.js.map +1 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/env.ini +18 -0
- package/package.json +38 -0
- package/project_id +0 -0
- package/public/admin-users.html +188 -0
- package/public/agent.html +199 -0
- package/public/css/issues.css +275 -0
- package/public/css/style.css +1299 -0
- package/public/index.html +166 -0
- package/public/issue.html +76 -0
- package/public/js/agent.js +19 -0
- package/public/js/common.js +735 -0
- package/public/js/dashboard.js +772 -0
- package/public/js/files-panel.js +703 -0
- package/public/js/interactive-terminal.js +201 -0
- package/public/js/issue-renderer.js +559 -0
- package/public/js/issue.js +57 -0
- package/public/js/project.js +2425 -0
- package/public/js/terminal.js +564 -0
- package/public/project.html +430 -0
- package/public/terminal.html +67 -0
- package/public/vendor/marked.js +74 -0
- package/public/vendor/xterm-addon-fit.js +2 -0
- package/public/vendor/xterm.css +209 -0
- package/public/vendor/xterm.js +2 -0
- package/send_message_and_update_issue.js +65 -0
- package/tsconfig.json +19 -0
- package/update_round2_and_create_round3.js +284 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const Database = require('better-sqlite3');
|
|
2
|
+
const { v4: uuidv4 } = require('uuid');
|
|
3
|
+
|
|
4
|
+
const db = new Database('/misc/projdata11/info_fil/zhfu/lin/argus/data/argus.db');
|
|
5
|
+
|
|
6
|
+
const AGENT_ID = 'db9e98bf-91b1-4bdd-97ea-ca56cd3c9f48';
|
|
7
|
+
const PROJECT_ID = 'ebf157ab-5cc9-49d2-9ff2-508652b7632c';
|
|
8
|
+
const ISSUE_NUMBER = 56;
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
// Get the issue
|
|
12
|
+
const issue = db.prepare('SELECT * FROM issues WHERE project_id = ? AND number = ?').get(PROJECT_ID, ISSUE_NUMBER);
|
|
13
|
+
|
|
14
|
+
if (!issue) {
|
|
15
|
+
console.error('Issue #56 not found');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
console.log(`Found issue #${issue.number}: ${issue.title}`);
|
|
20
|
+
console.log(`Current assigned_to: ${issue.assigned_to}`);
|
|
21
|
+
console.log(`Current status: ${issue.status}`);
|
|
22
|
+
|
|
23
|
+
// Update the issue: assign back to 'user' and set status to 'done'
|
|
24
|
+
db.prepare(`
|
|
25
|
+
UPDATE issues
|
|
26
|
+
SET assigned_to = 'user',
|
|
27
|
+
status = 'done',
|
|
28
|
+
updated_at = datetime('now')
|
|
29
|
+
WHERE id = ?
|
|
30
|
+
`).run(issue.id);
|
|
31
|
+
|
|
32
|
+
console.log('\n✓ Issue updated: assigned to user, status set to done');
|
|
33
|
+
|
|
34
|
+
// Add a comment to the issue
|
|
35
|
+
const commentId = uuidv4();
|
|
36
|
+
const commentBody = `已完成学习型因子挖掘,准备了5个基于mywq.db高夏普模式的新因子,等待您批准执行因子提交命令。因子包括:learned_pattern_6d_range_vol、learned_pattern_15d_momentum_liquidity等。`;
|
|
37
|
+
|
|
38
|
+
db.prepare(`
|
|
39
|
+
INSERT INTO issue_comments (id, issue_id, author_id, body, event_type)
|
|
40
|
+
VALUES (?, ?, ?, ?, 'comment')
|
|
41
|
+
`).run(commentId, issue.id, AGENT_ID, commentBody);
|
|
42
|
+
|
|
43
|
+
console.log('✓ Comment added to issue');
|
|
44
|
+
|
|
45
|
+
// Verify the changes
|
|
46
|
+
const updatedIssue = db.prepare('SELECT * FROM issues WHERE id = ?').get(issue.id);
|
|
47
|
+
console.log('\nUpdated issue:');
|
|
48
|
+
console.log(` Status: ${updatedIssue.status}`);
|
|
49
|
+
console.log(` Assigned to: ${updatedIssue.assigned_to}`);
|
|
50
|
+
console.log(` Updated at: ${updatedIssue.updated_at}`);
|
|
51
|
+
|
|
52
|
+
const comments = db.prepare('SELECT * FROM issue_comments WHERE issue_id = ? ORDER BY created_at DESC LIMIT 1').get(issue.id);
|
|
53
|
+
console.log('\nLatest comment:');
|
|
54
|
+
console.log(` Author: ${comments.author_id}`);
|
|
55
|
+
console.log(` Body: ${comments.body}`);
|
|
56
|
+
console.log(` Created: ${comments.created_at}`);
|
|
57
|
+
|
|
58
|
+
console.log('\n✓ All operations completed successfully');
|
|
59
|
+
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error('Error:', error);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
} finally {
|
|
64
|
+
db.close();
|
|
65
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2022"],
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"declaration": true,
|
|
14
|
+
"declarationMap": true,
|
|
15
|
+
"sourceMap": true
|
|
16
|
+
},
|
|
17
|
+
"include": ["src/**/*"],
|
|
18
|
+
"exclude": ["node_modules", "dist"]
|
|
19
|
+
}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
const Database = require('better-sqlite3');
|
|
2
|
+
const { v4: uuidv4 } = require('uuid');
|
|
3
|
+
const db = new Database('data/argus.db');
|
|
4
|
+
|
|
5
|
+
const now = new Date().toISOString();
|
|
6
|
+
|
|
7
|
+
// === Update Round 2 issues ===
|
|
8
|
+
|
|
9
|
+
const round2Results = {
|
|
10
|
+
'931c128d-62a9-4dd8-8bc0-088939c73f1d': {
|
|
11
|
+
title: '[量价] 第58轮',
|
|
12
|
+
comment: `## 第58轮结果 - Agent 1(量价)
|
|
13
|
+
|
|
14
|
+
**结论:0个新因子入库,全部因相似度超标被拒绝**
|
|
15
|
+
|
|
16
|
+
### 测试结果摘要
|
|
17
|
+
| 因子 | Sharpe | Fitness | 结果 | 相似因子 |
|
|
18
|
+
|------|--------|---------|------|---------|
|
|
19
|
+
| lower_shadow × volume × reversal | 1.78 | 1.008 | ❌ REJECTED | custom031 (0.92) |
|
|
20
|
+
| overnight_delta (跳空) × vol × reversal | 1.88 | 1.06 | ❌ REJECTED | custom043 (0.90) |
|
|
21
|
+
| vol_asymmetry_additive | 1.94 | 1.08 | ❌ REJECTED | custom050 (0.96) |
|
|
22
|
+
| volacc_body (volatility加速度+body) | 1.94 | 0.989 | ❌ LOW_QUALITY | - |
|
|
23
|
+
| body_var_triple | 1.94 | 0.989 | ❌ LOW_QUALITY | - |
|
|
24
|
+
| vol_rel_var (相对变异系数) | 1.76 | 0.91 | ❌ LOW_QUALITY | - |
|
|
25
|
+
| asset_turnover_body_var (FMP) | 1.18 | 0.55 | ❌ LOW_QUALITY | - |
|
|
26
|
+
|
|
27
|
+
### 核心发现
|
|
28
|
+
1. **模板饱和**: \`rank(vol/adv20) × rank(decay_linear(-ts_rank(returns,N),M))\` 组合在DB中已被反复使用,任何含此结构的新因子都与custom031-custom050等高度相关
|
|
29
|
+
2. **decay=11 body variability**: 最接近成功的配置(Fitness=1.036)被custom070拒绝(0.876)
|
|
30
|
+
3. 换SIGNAL_A信号无法绕过相似性检测——检测器比较IC时序,而非公式字符串
|
|
31
|
+
|
|
32
|
+
### 第59轮方向
|
|
33
|
+
**禁止使用**: \`rank(volume/adv20)\` + \`rank(decay_linear(-ts_rank(returns,N),M))\` 的配对结构
|
|
34
|
+
**新方向**: ts_corr, ts_skewness, 不含成交量的价格模式, SIC grouping + body_ratio替代reversal`
|
|
35
|
+
},
|
|
36
|
+
'02b52bb4-5252-476e-b0af-830ada855418': {
|
|
37
|
+
title: '[量价+基本面] 第58轮',
|
|
38
|
+
comment: `## 第58轮结果 - Agent 2(量价+基本面)
|
|
39
|
+
|
|
40
|
+
**结论:0个新因子入库,全部因相似度超标被拒绝或质量不足**
|
|
41
|
+
|
|
42
|
+
### 测试结果摘要
|
|
43
|
+
| 因子 | Sharpe | Fitness | 结果 | 备注 |
|
|
44
|
+
|------|--------|---------|------|------|
|
|
45
|
+
| gross_profit_assets v8 | 1.68 | 1.07 | ❌ REJECTED (custom003, 0.933) | - |
|
|
46
|
+
| B7: net_debt_delta × gp_delta × reversal | 1.98 | 1.265 | ❌ REJECTED (custom079, 0.932) | 最好的质量指标 |
|
|
47
|
+
| B8: net_debt × gp × body_ratio | 1.28 | 0.70 | ❌ LOW_QUALITY | 去掉reversal后alpha弱 |
|
|
48
|
+
| B9: net_debt × gp × 2d_reversal | 1.26 | 0.74 | ❌ LOW_QUALITY | 2d反转比4d更弱 |
|
|
49
|
+
| B10: low_leverage × gp_delta | 0.67 | 0.28 | ❌ LOW_QUALITY | - |
|
|
50
|
+
| B11: net_debt × vol × body_tsrank | 1.90 | 0.987 | ❌ LOW_QUALITY (差0.013) | - |
|
|
51
|
+
| B11v2: 同上 ts_mean(5) | 1.76 | 0.938 | ❌ LOW_QUALITY | - |
|
|
52
|
+
|
|
53
|
+
### 核心发现
|
|
54
|
+
1. **B7 (net_debt × gp × reversal)** Sharpe=1.978, Fitness=1.265 — 质量最佳但被custom079(0.932)拒绝。custom079 = income_delta × cashflow_delta × reversal,结构完全相同
|
|
55
|
+
2. **无reversal时**: 基本面信号×body_ratio = Fitness仅0.70,远低于reversal版本
|
|
56
|
+
3. **4d反转是alpha主要来源**: 去掉它后基本面信号大幅弱化,但保留它会导致高相似度
|
|
57
|
+
|
|
58
|
+
### 第59轮方向
|
|
59
|
+
- 仿照custom058 (roe × vol × body_ratio, SIC grouping) — 已成功入库
|
|
60
|
+
- 尝试: fundamental × body_ratio(SIC grouping) — 完全不用returns reversal
|
|
61
|
+
- 尝试: 季报数据的非标准滞后(21天/126天而非63天)`
|
|
62
|
+
},
|
|
63
|
+
'e93793df-c23d-4950-a0b3-bdc6b78a6227': {
|
|
64
|
+
title: '[学习型] 第58轮',
|
|
65
|
+
comment: `## 第58轮结果 - Agent 3(学习型)
|
|
66
|
+
|
|
67
|
+
**结论:0个新因子入库,income_growth因子质量达标但相似度超标**
|
|
68
|
+
|
|
69
|
+
### 测试结果摘要
|
|
70
|
+
| 因子 | Sharpe | Fitness | 结果 | 备注 |
|
|
71
|
+
|------|--------|---------|------|------|
|
|
72
|
+
| vol_acceleration系列 (ts_rank=5) | 1.82-1.94 | 0.96-1.04 | ❌ REJECTED/LOW | custom031/custom043/custom050高相关 |
|
|
73
|
+
| asset_growth_v1 (Cooper 2008) | ~1.0 | <0.5 | ❌ LOW_QUALITY | - |
|
|
74
|
+
| **income_growth_vol_reversal_v1** | **2.007** | **1.135** | **❌ REJECTED (0.912)** | **质量达标!** |
|
|
75
|
+
|
|
76
|
+
### income_growth_vol_reversal_v1 详情(质量最好)
|
|
77
|
+
```
|
|
78
|
+
ts_mean(group_zscore(rank((income - delay(income, 63)) / (assets + 0.0001)) * rank(volume / adv20) * rank(decay_linear(-1 * ts_rank(returns, 4), 11)), industry), 4)
|
|
79
|
+
```
|
|
80
|
+
- Sharpe=2.007, Fitness=1.135, Turnover=30.64%, MaxDD=-6.91%, Return=9.81%
|
|
81
|
+
- 被已有因子拒绝(相似度0.912)— 很可能相似于custom079
|
|
82
|
+
|
|
83
|
+
### 核心发现
|
|
84
|
+
1. 基本面信号(income增速)质量确实更高(Sharpe>2),但standard template下与custom079等高度相关
|
|
85
|
+
2. mywq.db中的波动率加速度信号方向已被前几轮覆盖
|
|
86
|
+
3. **关键**: 相似度检测基于IC时序相关,只要用了\`vol × reversal\`配对就会高度相关
|
|
87
|
+
|
|
88
|
+
### 第59轮方向
|
|
89
|
+
- custom058模板: fundamental × vol/adv20 × body_ratio(SIC) — 无reversal
|
|
90
|
+
- 尝试: income增速 × 纯价格信号(无成交量)
|
|
91
|
+
- 尝试: 完全不同结构 — ts_corr(returns, volume, N) 或 ts_skewness`
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const addComment = db.prepare(`
|
|
96
|
+
INSERT INTO issue_comments (id, issue_id, body, author_id, created_at, updated_at)
|
|
97
|
+
VALUES (?, ?, ?, 'controller', ?, ?)
|
|
98
|
+
`);
|
|
99
|
+
|
|
100
|
+
const updateStatus = db.prepare(`
|
|
101
|
+
UPDATE issues SET status = 'done', updated_at = ? WHERE id = ?
|
|
102
|
+
`);
|
|
103
|
+
|
|
104
|
+
for (const [issueId, data] of Object.entries(round2Results)) {
|
|
105
|
+
addComment.run(uuidv4(), issueId, data.comment, now, now);
|
|
106
|
+
updateStatus.run(now, issueId);
|
|
107
|
+
console.log(`Updated issue ${data.title}: done + comment added`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// === Create Round 3 Issues ===
|
|
111
|
+
|
|
112
|
+
const maxNumber = db.prepare('SELECT MAX(number) as n FROM issues').get().n;
|
|
113
|
+
console.log(`\nCurrent max issue number: ${maxNumber}`);
|
|
114
|
+
|
|
115
|
+
const insertIssue = db.prepare(`
|
|
116
|
+
INSERT INTO issues (id, number, project_id, title, body, status, priority, author_id, created_at, updated_at)
|
|
117
|
+
VALUES (?, ?, ?, ?, ?, 'pending', 'high', 'controller', ?, ?)
|
|
118
|
+
`);
|
|
119
|
+
|
|
120
|
+
const projectId = db.prepare('SELECT id FROM projects LIMIT 1').get().id;
|
|
121
|
+
const nextNum = maxNumber + 1;
|
|
122
|
+
|
|
123
|
+
const round3Issues = [
|
|
124
|
+
{
|
|
125
|
+
id: uuidv4(),
|
|
126
|
+
number: nextNum,
|
|
127
|
+
title: '[量价] 第59轮 - 绕过相似度:ts_corr/ts_skewness/无成交量价格结构',
|
|
128
|
+
body: `## 第59轮 Agent 1:量价信号 - 绕过相似度饱和
|
|
129
|
+
|
|
130
|
+
**背景**: 第58轮所有量价因子均因相似度>0.8被拒绝。根本原因: \`rank(vol/adv20) × rank(decay(-ts_rank(returns,N),M))\`配对已被DB中~40+个因子使用,造成IC时序高度相关。
|
|
131
|
+
|
|
132
|
+
## 禁止结构(会被拒绝)
|
|
133
|
+
- 任何包含 \`rank(volume/adv20) * rank(decay_linear(-1 * ts_rank(returns, N), M))\` 的公式
|
|
134
|
+
- 即使换掉SIGNAL_A也无济于事
|
|
135
|
+
|
|
136
|
+
## 第59轮方向(必须完全不同)
|
|
137
|
+
|
|
138
|
+
### 方向A: ts_corr 量价相关(完全不同结构)
|
|
139
|
+
**理论**: Llorente et al. 2002 - 流动性驱动(informed) vs 非流动性驱动(uninformed)交易
|
|
140
|
+
```python
|
|
141
|
+
# 5天量价相关系数作为信号
|
|
142
|
+
ts_corr(returns, volume, 5) # 负相关=知情买入,正相关=流动性需求
|
|
143
|
+
```
|
|
144
|
+
**参考公式**:
|
|
145
|
+
\`\`\`
|
|
146
|
+
ts_mean(group_zscore(rank(ts_corr(returns, volume, 5)), industry), 4)
|
|
147
|
+
\`\`\`
|
|
148
|
+
|
|
149
|
+
### 方向B: ts_skewness 收益率偏度(彩票偏好)
|
|
150
|
+
**理论**: Bali et al. 2011 - 高期望偏度=彩票因子=被高估=负向alpha
|
|
151
|
+
```python
|
|
152
|
+
ts_skewness(returns, 20) # 20天偏度,负相关于未来收益
|
|
153
|
+
```
|
|
154
|
+
**参考公式**:
|
|
155
|
+
\`\`\`
|
|
156
|
+
ts_mean(group_zscore(-1 * rank(ts_skewness(returns, 20)), industry), 4)
|
|
157
|
+
\`\`\`
|
|
158
|
+
|
|
159
|
+
### 方向C: 纯价格结构(无成交量、无returns reversal)
|
|
160
|
+
**理论**: 开盘-收盘价格模式,不使用成交量
|
|
161
|
+
```python
|
|
162
|
+
# 5天内最大开收差/最大日内范围比率
|
|
163
|
+
ts_max(abs(open/delay(close,1) - 1), 5) / (ts_mean(high/low - 1, 5) + 0.0001)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 方向D: 成交量集中度(不同于已有)
|
|
167
|
+
检查 mywq.db 中 Sharpe>2、未被custom库覆盖的因子,特别是:
|
|
168
|
+
- 查询: \`SELECT code, sharpe FROM alphas WHERE sharpe > 2 ORDER BY sharpe DESC LIMIT 20\`(在mywq.db中)
|
|
169
|
+
- 找出 IC时序与现有66个因子相关度低的
|
|
170
|
+
|
|
171
|
+
## 执行要求
|
|
172
|
+
1. 每个方向先测试无--save版本
|
|
173
|
+
2. 如果 Fitness >= 1.0,再用 --save 入库
|
|
174
|
+
3. 如果被拒绝,记录相似因子,分析为何相关,换方向
|
|
175
|
+
4. **不得使用** ts_rank(returns, N) 作为反转信号
|
|
176
|
+
5. 工作目录: /gds/zhfu/lin/alphamining
|
|
177
|
+
`
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: uuidv4(),
|
|
181
|
+
number: nextNum + 1,
|
|
182
|
+
title: '[基本面] 第59轮 - custom058结构推广:fundamental × vol × body_ratio (SIC)',
|
|
183
|
+
body: `## 第59轮 Agent 2:基本面 - custom058模板推广
|
|
184
|
+
|
|
185
|
+
**背景**: 第58轮发现: 任何 fundamental × vol × reversal(returns) 结构都与custom079等高度相关。
|
|
186
|
+
**突破口**: custom058 = \`roe × vol/adv20 × body_ratio(5d)\` + **SIC** grouping 成功入库。此结构与其他因子差异足够大。
|
|
187
|
+
|
|
188
|
+
## custom058 结构(已成功入库的模板)
|
|
189
|
+
\`\`\`
|
|
190
|
+
ts_mean(group_zscore(rank(FUNDAMENTAL) * rank(volume / adv20) * rank(decay_linear(ts_rank((open - close) / (high - low + 0.0001), 5), 11)), sic), 4)
|
|
191
|
+
\`\`\`
|
|
192
|
+
关键特点:
|
|
193
|
+
- **无 returns reversal**(用body_ratio替代)
|
|
194
|
+
- **SIC** 分组(非industry)
|
|
195
|
+
- FUNDAMENTAL = 截面水平信号(非delta变化量)
|
|
196
|
+
|
|
197
|
+
## 本轮要测试的FUNDAMENTAL信号
|
|
198
|
+
|
|
199
|
+
### 信号1: 净资产收益率增速(ROE改善)
|
|
200
|
+
\`\`\`python
|
|
201
|
+
# 与custom058(ROE水平)不同,这里用ROE的变化量
|
|
202
|
+
FUNDAMENTAL = ts_delta(return_equity, 63) # 季度ROE变化
|
|
203
|
+
\`\`\`
|
|
204
|
+
|
|
205
|
+
### 信号2: 资产效率(资产周转率)
|
|
206
|
+
\`\`\`python
|
|
207
|
+
FUNDAMENTAL = revenue / (assets + 0.0001) # 资产周转率(高=效率高)
|
|
208
|
+
\`\`\`
|
|
209
|
+
|
|
210
|
+
### 信号3: 现金流质量(Cash Flow Quality)
|
|
211
|
+
\`\`\`python
|
|
212
|
+
FUNDAMENTAL = cashflow_op / (abs(income) + 0.0001) # 现金利润比(高=盈利质量好)
|
|
213
|
+
\`\`\`
|
|
214
|
+
|
|
215
|
+
### 信号4: 净债务改善(杠杆降低)
|
|
216
|
+
\`\`\`python
|
|
217
|
+
FUNDAMENTAL = -1 * ts_delta(net_debt / (assets + 0.0001), 63) # 负债率降低=正向信号
|
|
218
|
+
\`\`\`
|
|
219
|
+
|
|
220
|
+
## 测试流程
|
|
221
|
+
1. 对每个FUNDAMENTAL信号,代入custom058模板(SIC grouping,body_ratio,无reversal)
|
|
222
|
+
2. 先测试无--save版本确认质量
|
|
223
|
+
3. Fitness >= 1.0 时,检查相似度,如果 < 0.8 则加 --save 入库
|
|
224
|
+
4. 如果与custom058本身相似度>0.8,换不同的FUNDAMENTAL或调整body_ratio窗口(5→8→3)
|
|
225
|
+
5. 工作目录: /gds/zhfu/lin/alphamining, --source fmp
|
|
226
|
+
|
|
227
|
+
## 回退策略
|
|
228
|
+
如果custom058变体全被拒绝,尝试:
|
|
229
|
+
- 完全不用成交量,只用: \`ts_mean(group_zscore(rank(FUNDAMENTAL_A) * rank(FUNDAMENTAL_B), sic), 4)\`
|
|
230
|
+
- 双基本面相乘(无价量成分)
|
|
231
|
+
`
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
id: uuidv4(),
|
|
235
|
+
number: nextNum + 2,
|
|
236
|
+
title: '[学习+创新] 第59轮 - income_growth改进版(去reversal)+ 纯基本面结构',
|
|
237
|
+
body: `## 第59轮 Agent 3:改进income_growth + 探索纯基本面结构
|
|
238
|
+
|
|
239
|
+
**背景**: income_growth_vol_reversal_v1 (Sharpe=2.007, Fitness=1.135) 质量出色但被拒绝(相似度0.912)。
|
|
240
|
+
**原因**: \`rank(volume/adv20) × rank(decay(-ts_rank(returns,4),11))\` 造成与现有因子高度相关。
|
|
241
|
+
|
|
242
|
+
## 方向A: income_growth × body_ratio × SIC(去除reversal)
|
|
243
|
+
**原公式(已被拒绝)**:
|
|
244
|
+
\`\`\`
|
|
245
|
+
ts_mean(group_zscore(rank((income - delay(income, 63)) / (assets + 0.0001)) * rank(volume / adv20) * rank(decay_linear(-1 * ts_rank(returns, 4), 11)), industry), 4)
|
|
246
|
+
\`\`\`
|
|
247
|
+
|
|
248
|
+
**新公式(仿custom058结构)**:
|
|
249
|
+
\`\`\`
|
|
250
|
+
ts_mean(group_zscore(rank((income - delay(income, 63)) / (assets + 0.0001)) * rank(volume / adv20) * rank(decay_linear(ts_rank((open - close) / (high - low + 0.0001), 5), 11)), sic), 4)
|
|
251
|
+
\`\`\`
|
|
252
|
+
改变: reversal→body_ratio, industry→sic
|
|
253
|
+
|
|
254
|
+
## 方向B: 双基本面结构(参考custom079但用不同字段)
|
|
255
|
+
custom079 = income_delta × cashflow_delta × reversal(已入库)
|
|
256
|
+
尝试: **income_delta × gross_profit_delta × body_ratio(SIC)**
|
|
257
|
+
\`\`\`
|
|
258
|
+
ts_mean(group_zscore(rank((income - delay(income, 63)) / (assets + 0.0001)) * rank((gross_profit - delay(gross_profit, 63)) / (assets + 0.0001)) * rank(decay_linear(ts_rank((open - close) / (high - low + 0.0001), 5), 11)), sic), 4)
|
|
259
|
+
\`\`\`
|
|
260
|
+
|
|
261
|
+
## 方向C: 更激进的结构变化
|
|
262
|
+
完全不同,试验:
|
|
263
|
+
\`\`\`
|
|
264
|
+
# 纯基本面双信号,无量价
|
|
265
|
+
ts_mean(group_zscore(rank((income - delay(income, 63)) / (assets + 0.0001)) * rank(gross_profit / (revenue + 0.0001)), sic), 4)
|
|
266
|
+
\`\`\`
|
|
267
|
+
|
|
268
|
+
## 测试顺序
|
|
269
|
+
1. 方向A: income_growth × body_ratio × SIC(最可能通过相似度)
|
|
270
|
+
2. 方向B: income_delta × gp_delta × body_ratio × SIC
|
|
271
|
+
3. 如果1和2都被拒绝,尝试方向C或完全不同的基本面字段
|
|
272
|
+
4. 记录每次拒绝的相似因子,理解为何相关,快速迭代
|
|
273
|
+
5. 工作目录: /gds/zhfu/lin/alphamining, --source fmp
|
|
274
|
+
`
|
|
275
|
+
}
|
|
276
|
+
];
|
|
277
|
+
|
|
278
|
+
for (const issue of round3Issues) {
|
|
279
|
+
insertIssue.run(issue.id, issue.number, projectId, issue.title, issue.body, now, now);
|
|
280
|
+
console.log(`Created issue #${issue.number}: ${issue.title.substring(0, 50)}...`);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
console.log('\nDone!');
|
|
284
|
+
db.close();
|