cnhkmcp 2.0.3__py3-none-any.whl → 2.1.0__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.
Files changed (39) hide show
  1. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/README.md +38 -0
  2. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/config.json +6 -0
  3. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/ace_lib.py +1510 -0
  4. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/fetch_all_datasets.py +157 -0
  5. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/fetch_all_documentation.py +132 -0
  6. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/fetch_all_operators.py +99 -0
  7. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/helpful_functions.py +180 -0
  8. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/icon.ico +0 -0
  9. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/icon.png +0 -0
  10. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/test.txt +1 -0
  11. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/main.py +581 -0
  12. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/process_knowledge_base.py +280 -0
  13. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/rag_engine.py +265 -0
  14. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/requirements.txt +12 -0
  15. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/run.bat +3 -0
  16. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/vector_db/chroma.sqlite3 +0 -0
  17. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242//321/211/320/266/320/246/321/206/320/274/320/261/321/210/342/224/220/320/240/321/210/320/261/320/234/321/206/320/231/320/243/321/205/342/225/235/320/220/321/206/320/230/320/241.py +265 -0
  18. cnhkmcp/untracked/APP/Tranformer/Transformer.py +2804 -11
  19. cnhkmcp/untracked/APP/Tranformer/output/Alpha_candidates.json +1524 -889
  20. cnhkmcp/untracked/APP/Tranformer/output/Alpha_generated_expressions_error.json +884 -111
  21. cnhkmcp/untracked/APP/Tranformer/output/Alpha_generated_expressions_success.json +442 -168
  22. cnhkmcp/untracked/APP/Tranformer/template_summary.txt +2775 -1
  23. cnhkmcp/untracked/APP/ace.log +2 -0
  24. cnhkmcp/untracked/APP/give_me_idea/fetch_all_datasets.py +157 -0
  25. cnhkmcp/untracked/APP/give_me_idea/fetch_all_operators.py +99 -0
  26. cnhkmcp/untracked/APP/simulator/simulator_wqb.py +16 -16
  27. cnhkmcp/untracked/APP/static/brain.js +61 -0
  28. cnhkmcp/untracked/APP/static/script.js +140 -0
  29. cnhkmcp/untracked/APP/templates/index.html +25 -4
  30. cnhkmcp/untracked/APP//321/210/342/224/220/320/240/321/210/320/261/320/234/321/206/320/231/320/243/321/205/342/225/235/320/220/321/206/320/230/320/241.py +70 -8
  31. {cnhkmcp-2.0.3.dist-info → cnhkmcp-2.1.0.dist-info}/METADATA +1 -1
  32. {cnhkmcp-2.0.3.dist-info → cnhkmcp-2.1.0.dist-info}/RECORD +36 -20
  33. cnhkmcp/untracked/APP/hkSimulator/ace.log +0 -0
  34. cnhkmcp/untracked/APP/hkSimulator/autosim_20251205_145240.log +0 -0
  35. cnhkmcp/untracked/APP/hkSimulator/autosim_20251215_030103.log +0 -0
  36. {cnhkmcp-2.0.3.dist-info → cnhkmcp-2.1.0.dist-info}/WHEEL +0 -0
  37. {cnhkmcp-2.0.3.dist-info → cnhkmcp-2.1.0.dist-info}/entry_points.txt +0 -0
  38. {cnhkmcp-2.0.3.dist-info → cnhkmcp-2.1.0.dist-info}/licenses/LICENSE +0 -0
  39. {cnhkmcp-2.0.3.dist-info → cnhkmcp-2.1.0.dist-info}/top_level.txt +0 -0
@@ -491,10 +491,2784 @@ template_summary = """# BRAIN论坛Alpha模板精华总结
491
491
 
492
492
  ### 9. 分紅/現金流組間殘差(簡版)
493
493
  * **表達式**: `alpha = ts_zscore(ts_backfill(<cf_or_div_field>,90)); g = group_mean(alpha, <group>, <weight_opt>); resid = alpha - g; group_zscore(resid, <group>)`。
494
- * **核心思想**: 先回填平滑,再對組均值做殘差,捕捉組內相對高/低分紅或現金流質量。
494
+ * **核心思想**: 先回填平滑,再对組均值做殘差,捕捉組內相對高/低分紅或現金流質量。
495
495
  * **適用場景**: fnd8/fnd6/topdiv等分紅現金流字段;行業/國家分組。
496
496
  * **優化**: 權重可用log(cap)或vol逆;對resid再做`ts_mean`平滑。
497
497
 
498
+ ---
499
+
500
+ ## 模板格式说明
501
+
502
+ 每个模板使用以下占位符格式:
503
+ - `<ts_op/>` - 时间序列操作符,如 `ts_rank`, `ts_mean`, `ts_delta`, `ts_ir`, `ts_stddev`, `ts_zscore`
504
+ - `<group_op/>` - 分组操作符,如 `group_rank`, `group_neutralize`, `group_zscore`
505
+ - `<vec_op/>` - 向量操作符,如 `vec_avg`, `vec_sum`, `vec_max`, `vec_min`, `vec_stddev`
506
+ - `<field/>` - 数据字段占位符
507
+ - `<d/>` - 时间窗口参数,常用值: `{5, 22, 66, 126, 252, 504}`
508
+ - `<group/>` - 分组字段,如 `industry`, `sector`, `subindustry`, `market`
509
+
510
+ ---
511
+
512
+ ## 第一部分:基础结构模板 (TPL-001 ~ TPL-010)
513
+
514
+ ### TPL-001: 基本面时序排名
515
+ ```
516
+ 模板: <group_op/>(<ts_op/>(<field/>, <d/>), <group/>)
517
+ ```
518
+ | 占位符 | 可选值 | 说明 |
519
+ |--------|--------|------|
520
+ | `<ts_op/>` | `ts_rank`, `ts_zscore`, `ts_delta`, `ts_ir` | 时序比较操作 |
521
+ | `<group_op/>` | `group_rank`, `group_zscore`, `group_neutralize` | 截面比较操作 |
522
+ | `<field/>` | 基本面字段: `eps`, `sales`, `assets`, `roe`, `roa` | 公司财务数据 |
523
+ | `<d/>` | `66`, `126`, `252` | 季度/半年/年 |
524
+ | `<group/>` | `industry`, `sector` | 行业分组 |
525
+
526
+ **示例**:
527
+ ```
528
+ group_rank(ts_rank(eps, 252), industry)
529
+ group_zscore(ts_ir(sales, 126), sector)
530
+ ```
531
+
532
+ ---
533
+
534
+ ### TPL-002: 利润/规模比率模板
535
+ ```
536
+ 模板: <ts_op/>(<profit_field/>/<size_field/>, <d/>)
537
+ ```
538
+ | 占位符 | 可选值 | 说明 |
539
+ |--------|--------|------|
540
+ | `<ts_op/>` | `ts_rank`, `ts_zscore`, `ts_mean`, `ts_delta` | 时序操作 |
541
+ | `<profit_field/>` | `net_income`, `ebitda`, `operating_income`, `gross_profit` | 利润类字段 |
542
+ | `<size_field/>` | `assets`, `cap`, `sales`, `equity` | 规模类字段 |
543
+ | `<d/>` | `66`, `126`, `252` | 中长期窗口 |
544
+
545
+ **示例**:
546
+ ```
547
+ ts_rank(net_income/assets, 252)
548
+ ts_zscore(ebitda/cap, 126)
549
+ ts_rank(operating_income/cap, 252)^2
550
+ ```
551
+
552
+ ---
553
+
554
+ ### TPL-003: 向量数据处理模板 (VECTOR字段必用)
555
+ ```
556
+ 模板: <ts_op/>(<vec_op/>(<vector_field/>), <d/>)
557
+ ```
558
+ | 占位符 | 可选值 | 说明 |
559
+ |--------|--------|------|
560
+ | `<ts_op/>` | `ts_rank`, `ts_mean`, `ts_delta`, `ts_ir`, `ts_zscore` | 时序操作 |
561
+ | `<vec_op/>` | `vec_avg`, `vec_sum`, `vec_max`, `vec_min`, `vec_stddev` | 向量聚合 |
562
+ | `<vector_field/>` | 分析师数据: `anl4_*`, `analyst_*`, `oth41_*` | VECTOR类型字段 |
563
+ | `<d/>` | `22`, `66`, `126` | 短中期窗口 |
564
+
565
+ **示例**:
566
+ ```
567
+ ts_delta(vec_avg(anl4_eps_mean), 22)
568
+ ts_rank(vec_sum(analyst_estimate), 66)
569
+ ts_ir(vec_avg(oth41_s_west_eps_ftm_chg_3m), 126)
570
+ ```
571
+
572
+ ---
573
+
574
+ ### TPL-004: 双重中性化模板
575
+ ```
576
+ 模板:
577
+ a = <ts_op/>(<field/>, <d/>);
578
+ a1 = group_neutralize(a, bucket(rank(cap), range="<range/>"));
579
+ group_neutralize(a1, <group/>)
580
+ ```
581
+ | 占位符 | 可选值 | 说明 |
582
+ |--------|--------|------|
583
+ | `<ts_op/>` | `ts_zscore`, `ts_rank`, `ts_ir` | 时序操作 |
584
+ | `<field/>` | 任意数据字段 | 主信号 |
585
+ | `<d/>` | `66`, `126`, `252` | 时间窗口 |
586
+ | `<range/>` | `"0.1,1,0.1"`, `"0,1,0.1"` | 市值分组范围 |
587
+ | `<group/>` | `industry`, `sector`, `subindustry` | 行业分组 |
588
+
589
+ **示例**:
590
+ ```
591
+ a = ts_zscore(fnd72_s_pit_or_is_q_spe_si, 252);
592
+ a1 = group_neutralize(a, bucket(rank(cap), range="0.1,1,0.1"));
593
+ group_neutralize(a1, subindustry)
594
+ ```
595
+
596
+ ---
597
+
598
+ ### TPL-005: 回归中性化模板
599
+ ```
600
+ 模板:
601
+ a = <ts_op/>(<field/>, <d/>);
602
+ a1 = group_neutralize(a, bucket(rank(cap), range="<range/>"));
603
+ a2 = group_neutralize(a1, <group/>);
604
+ b = ts_zscore(cap, <d/>);
605
+ b1 = group_neutralize(b, <group/>);
606
+ regression_neut(a2, b1)
607
+ ```
608
+ | 占位符 | 可选值 | 说明 |
609
+ |--------|--------|------|
610
+ | `<ts_op/>` | `ts_zscore`, `ts_rank` | 时序操作 |
611
+ | `<field/>` | 基本面或其他字段 | 主信号 |
612
+ | `<d/>` | `252`, `504` | 长期窗口 |
613
+ | `<range/>` | `"0.1,1,0.1"` | 市值分组 |
614
+ | `<group/>` | `subindustry`, `sector` | 行业分组 |
615
+
616
+ ---
617
+
618
+ ### TPL-006: 基本面动量模板
619
+ ```
620
+ 模板: log(ts_mean(<field/>, <d_short/>)) - log(ts_mean(<field/>, <d_long/>))
621
+ ```
622
+ | 占位符 | 可选值 | 说明 |
623
+ |--------|--------|------|
624
+ | `<field/>` | `anl4_{data}_{stats}`, 基本面字段 | 数据字段 |
625
+ | `<d_short/>` | `20`, `44` | 短期窗口 |
626
+ | `<d_long/>` | `44`, `126` | 长期窗口 |
627
+
628
+ **示例**:
629
+ ```
630
+ log(ts_mean(anl4_eps_mean, 44)) - log(ts_mean(anl4_eps_mean, 20))
631
+ ```
632
+
633
+ ---
634
+
635
+ ### TPL-007: 财报事件驱动模板
636
+ ```
637
+ 模板:
638
+ event = ts_delta(<fundamental_field/>, -1);
639
+ if_else(event != 0, <alpha/>, nan)
640
+ ```
641
+ | 占位符 | 可选值 | 说明 |
642
+ |--------|--------|------|
643
+ | `<fundamental_field/>` | `assets`, `sales`, `eps` | 基本面字段 |
644
+ | `<alpha/>` | 主信号表达式 | 事件发生时的Alpha |
645
+
646
+ **扩展版**:
647
+ ```
648
+ change = if_else(days_from_last_change(<field/>) == <days/>, ts_delta(close, <d/>), nan)
649
+ ```
650
+
651
+ ---
652
+
653
+ ### TPL-008: 标准化回填模板
654
+ ```
655
+ 模板: <ts_op/>(winsorize(ts_backfill(<field/>, <d_backfill/>), std=<std/>), <d/>)
656
+ ```
657
+ | 占位符 | 可选值 | 说明 |
658
+ |--------|--------|------|
659
+ | `<ts_op/>` | `ts_rank`, `ts_decay_linear`, `ts_zscore` | 时序操作 |
660
+ | `<field/>` | 低频数据字段 | 需要回填的字段 |
661
+ | `<d_backfill/>` | `115`, `120`, `180` | 回填窗口 |
662
+ | `<std/>` | `4`, `3`, `5` | winsorize标准差 |
663
+ | `<d/>` | `10`, `22`, `60` | 操作窗口 |
664
+
665
+ **示例**:
666
+ ```
667
+ ts_decay_linear(-densify(zscore(winsorize(ts_backfill(anl4_adjusted_netincome_ft, 115), std=4))), 10)
668
+ ts_rank(winsorize(ts_backfill(<data>, 120), std=4), 60)
669
+ ```
670
+
671
+ ---
672
+
673
+ ### TPL-009: 信号质量分组模板
674
+ ```
675
+ 模板:
676
+ signal = <ts_op/>(<field/>, <d/>);
677
+ credit_quality = bucket(rank(ts_delay(signal, 1), rate=0), range="<range/>");
678
+ group_neutralize(<decay_op/>(signal, k=<k/>), credit_quality)
679
+ ```
680
+ | 占位符 | 可选值 | 说明 |
681
+ |--------|--------|------|
682
+ | `<ts_op/>` | `ts_rank`, `ts_zscore` | 信号计算 |
683
+ | `<field/>` | 任意数据字段 | 主字段 |
684
+ | `<d/>` | `60`, `120` | 窗口 |
685
+ | `<range/>` | `"0.2,1,0.2"` | 分组范围 |
686
+ | `<decay_op/>` | `ts_weighted_decay` | 衰减操作 |
687
+ | `<k/>` | `0.5`, `0.3` | 衰减系数 |
688
+
689
+ ---
690
+
691
+ ### TPL-010: 复合分组中性化
692
+ ```
693
+ 模板: group_neutralize(<alpha/>, densify(<group1/>)*1000 + densify(<group2/>))
694
+ ```
695
+ | 占位符 | 可选值 | 说明 |
696
+ |--------|--------|------|
697
+ | `<alpha/>` | 主信号 | 原始Alpha |
698
+ | `<group1/>` | `subindustry`, `sector` | 主分组 |
699
+ | `<group2/>` | `country`, `exchange` | 次分组 |
700
+
701
+ ---
702
+
703
+ ## 第二部分:量价类模板 (TPL-101 ~ TPL-120)
704
+
705
+ ### TPL-101: 换手率反转
706
+ ```
707
+ 模板: -<ts_op/>(volume/sharesout, <d/>)
708
+ ```
709
+ | 占位符 | 可选值 | 说明 |
710
+ |--------|--------|------|
711
+ | `<ts_op/>` | `ts_mean`, `ts_rank`, `ts_std_dev` | 时序统计 |
712
+ | `<d/>` | `5`, `22`, `66` | 短中期窗口 |
713
+
714
+ **示例**:
715
+ ```
716
+ -ts_mean(volume/sharesout, 22)
717
+ -ts_std_dev(volume/sharesout, 22)
718
+ ```
719
+
720
+ ---
721
+
722
+ ### TPL-102: 量稳换手率 (STR)
723
+ ```
724
+ 模板: -ts_std_dev(volume/sharesout, <d1/>)/ts_mean(volume/sharesout, <d2/>)
725
+ ```
726
+ | 占位符 | 可选值 | 说明 |
727
+ |--------|--------|------|
728
+ | `<d1/>` | `20`, `22` | 波动计算窗口 |
729
+ | `<d2/>` | `20`, `22` | 均值计算窗口 |
730
+
731
+ **优化版**:
732
+ ```
733
+ 模板: -group_neutralize(ts_std_dev(volume/sharesout, <d/>)/ts_mean(volume/sharesout, <d/>), bucket(rank(cap), range="0.1,1,0.1"))
734
+ ```
735
+
736
+ ---
737
+
738
+ ### TPL-103: 价格反转模板
739
+ ```
740
+ 模板: -<ts_op/>(<price_field/>, <d/>)
741
+ ```
742
+ | 占位符 | 可选值 | 说明 |
743
+ |--------|--------|------|
744
+ | `<ts_op/>` | `ts_delta`, `ts_mean`, `ts_rank` | 时序操作 |
745
+ | `<price_field/>` | `close`, `returns`, `close/open-1`, `open/ts_delay(close,1)-1` | 价格/收益字段 |
746
+ | `<d/>` | `3`, `5`, `22` | 短期窗口 |
747
+
748
+ **示例**:
749
+ ```
750
+ -ts_delta(close, 5) # 价格变化反转
751
+ -ts_mean(returns, 22) # 收益均值反转
752
+ -ts_mean(close/open-1, 22) # 日内收益反转
753
+ -(open/ts_delay(close,1)-1) # 隔夜收益反转
754
+ ```
755
+
756
+ ---
757
+
758
+ ### TPL-104: 价格乖离率
759
+ ```
760
+ 模板: -(close - ts_mean(close, <d/>))/ts_mean(close, <d/>)
761
+ ```
762
+ | 占位符 | 可选值 | 说明 |
763
+ |--------|--------|------|
764
+ | `<d/>` | `5`, `22`, `66` | MA周期 |
765
+
766
+ ---
767
+
768
+ ### TPL-105: 量价相关性
769
+ ```
770
+ 模板: -ts_corr(<price_field/>, <volume_field/>, <d/>)
771
+ ```
772
+ | 占位符 | 可选值 | 说明 |
773
+ |--------|--------|------|
774
+ | `<price_field/>` | `close`, `returns`, `abs(returns)` | 价格类 |
775
+ | `<volume_field/>` | `volume`, `volume/sharesout`, `adv20` | 成交量类 |
776
+ | `<d/>` | `22`, `66`, `126` | 相关性窗口 |
777
+
778
+ ---
779
+
780
+ ### TPL-106: 跳跃因子
781
+ ```
782
+ 模板: -group_neutralize(ts_mean((close/open-1) - log(close/open), <d/>), bucket(rank(cap), range="0.1,1,0.1"))
783
+ ```
784
+ | 占位符 | 可选值 | 说明 |
785
+ |--------|--------|------|
786
+ | `<d/>` | `22`, `30`, `66` | 平均窗口 |
787
+
788
+ **带成交量增强版**:
789
+ ```
790
+ 模板: -group_neutralize(ts_mean((close/open-1) - log(close/open), <d/>) * ts_rank(volume, 5), bucket(rank(cap), range="0.1,1,0.1"))
791
+ ```
792
+
793
+ ---
794
+
795
+ ### TPL-107: 指数衰减动量
796
+ ```
797
+ 模板: -ts_decay_exp_window(<field/>, <d/>, factor=<f/>)
798
+ ```
799
+ | 占位符 | 可选值 | 说明 |
800
+ |--------|--------|------|
801
+ | `<field/>` | `returns`, `returns*(volume/sharesout)`, `close/open-1` | 收益类字段 |
802
+ | `<d/>` | `22`, `66`, `126` | 衰减窗口 |
803
+ | `<f/>` | `0.04`, `0.1`, `0.5`, `0.9` | 衰减因子,越小衰减越快 |
804
+
805
+ ---
806
+
807
+ ### TPL-108: 成交量周期函数 (VOC)
808
+ ```
809
+ 模板:
810
+ m_minus = ts_mean(volume, <d_long/>) - ts_mean(volume, <d_short/>);
811
+ delta = (ts_max(m_minus, <d_short/>) - m_minus)/(ts_max(m_minus, <d_short/>) - ts_min(m_minus, <d_short/>));
812
+ <weight1/>*delta + <weight2/>*ts_delay(delta, 1)
813
+ ```
814
+ | 占位符 | 可选值 | 说明 |
815
+ |--------|--------|------|
816
+ | `<d_long/>` | `30`, `66` | 长期均值窗口 |
817
+ | `<d_short/>` | `10`, `22` | 短期均值窗口 |
818
+ | `<weight1/>` | `0.33`, `0.5` | 当日权重 |
819
+ | `<weight2/>` | `0.67`, `0.5` | 前日权重 |
820
+
821
+ ---
822
+
823
+ ### TPL-109: 市场相关性因子
824
+ ```
825
+ 模板:
826
+ mkt_ret = group_mean(returns, 1, market);
827
+ pt = ts_corr(returns, mkt_ret, <d/>);
828
+ rank(1/(2*(1-pt)))
829
+ ```
830
+ | 占位符 | 可选值 | 说明 |
831
+ |--------|--------|------|
832
+ | `<d/>` | `10`, `22`, `66` | 相关性窗口 |
833
+
834
+ ---
835
+
836
+ ### TPL-110: 成交量趋势模板
837
+ ```
838
+ 模板: ts_decay_linear(volume/ts_sum(volume, <d_long/>), <d_short/>)
839
+ ```
840
+ | 占位符 | 可选值 | 说明 |
841
+ |--------|--------|------|
842
+ | `<d_long/>` | `252`, `504` | 长期总量窗口 |
843
+ | `<d_short/>` | `10`, `22` | 衰减窗口 |
844
+
845
+ ---
846
+
847
+ ### TPL-111: VWAP收益相关
848
+ ```
849
+ 模板:
850
+ returns > -<threshold/> ? (ts_ir(ts_corr(ts_returns(vwap, 1), ts_delay(group_neutralize(<field/>, market), <d1/>), <d2/>), <d2/>)) : -1
851
+ ```
852
+ | 占位符 | 可选值 | 说明 |
853
+ |--------|--------|------|
854
+ | `<threshold/>` | `0.1`, `0.05` | 收益阈值 |
855
+ | `<field/>` | 任意数据字段 | 信号字段 |
856
+ | `<d1/>` | `30`, `60` | 延迟窗口 |
857
+ | `<d2/>` | `90`, `120` | 相关性窗口 |
858
+
859
+ ---
860
+
861
+ ### TPL-112: 动量因子创建
862
+ ```
863
+ 模板: ts_sum(winsorize(ts_backfill(<data/>, <day/>), std=4.0), <n/>*21) - ts_sum(winsorize(ts_backfill(<data/>, <day/>), std=4.0), <m/>*21)
864
+ ```
865
+ | 占位符 | 可选值 | 说明 |
866
+ |--------|--------|------|
867
+ | `<data/>` | `returns`, 基本面字段 | 数据字段 |
868
+ | `<day/>` | `120`, `180` | 回填窗口 |
869
+ | `<n/>` | `6`, `12` | 长期月数 |
870
+ | `<m/>` | `1`, `0.1*n` | 短期月数 |
871
+
872
+ ---
873
+
874
+ ### TPL-113: 线性衰减排名
875
+ ```
876
+ 模板: -ts_rank(ts_decay_linear(<field/>, <d1/>), <d2/>)
877
+ ```
878
+ | 占位符 | 可选值 | 说明 |
879
+ |--------|--------|------|
880
+ | `<field/>` | `percent`, 任意时序信号 | 输入信号 |
881
+ | `<d1/>` | `10`, `22`, `150` | 衰减窗口 |
882
+ | `<d2/>` | `50`, `126` | 排名窗口 |
883
+
884
+ ---
885
+
886
+ ## 第三部分:情绪/新闻类模板 (TPL-201 ~ TPL-220)
887
+
888
+ ### TPL-201: 情绪差值模板
889
+ ```
890
+ 模板: <ts_op/>(rank(ts_backfill(<positive_sentiment/>, <d/>)) - rank(ts_backfill(<negative_sentiment/>, <d/>)), <d2/>)
891
+ ```
892
+ | 占位符 | 可选值 | 说明 |
893
+ |--------|--------|------|
894
+ | `<ts_op/>` | `ts_mean`, `ts_rank`, `ts_zscore` | 时序操作 |
895
+ | `<positive_sentiment/>` | 正面情绪字段 | 积极信号 |
896
+ | `<negative_sentiment/>` | 负面情绪字段 | 消极信号 |
897
+ | `<d/>` | `20`, `30` | 回填窗口 |
898
+ | `<d2/>` | `5`, `22` | 比较窗口 |
899
+
900
+ ---
901
+
902
+ ### TPL-202: 新闻情绪回归残差
903
+ ```
904
+ 模板:
905
+ sentiment = ts_backfill(ts_delay(<vec_op/>(<sentiment_field/>), 1), <d1/>);
906
+ vhat = ts_regression(volume, sentiment, <d2/>);
907
+ ehat = -ts_regression(returns, vhat, <d3/>);
908
+ group_rank(ehat, bucket(rank(cap), range="0,1,0.1"))
909
+ ```
910
+ | 占位符 | 可选值 | 说明 |
911
+ |--------|--------|------|
912
+ | `<vec_op/>` | `vec_avg`, `vec_sum` | 情绪聚合方式 |
913
+ | `<sentiment_field/>` | `scl12_sentiment`, `snt_buzz_ret`, `nws18_relevance` | 情绪数据 |
914
+ | `<d1/>` | `20`, `30` | 回填窗口 |
915
+ | `<d2/>` | `120`, `250` | 成交量回归窗口 |
916
+ | `<d3/>` | `250`, `750` | 收益回归窗口 |
917
+
918
+ ---
919
+
920
+ ### TPL-203: 社交媒体情绪
921
+ ```
922
+ 模板: rank(<vec_op/>(scl12_alltype_buzzvec) * <vec_op/>(scl12_sentiment))
923
+ ```
924
+ | 占位符 | 可选值 | 说明 |
925
+ |--------|--------|------|
926
+ | `<vec_op/>` | `vec_sum`, `vec_avg` | 向量聚合 |
927
+
928
+ **带条件版**:
929
+ ```
930
+ 模板:
931
+ sent_vol = vec_sum(scl12_alltype_buzzvec);
932
+ trade_when(rank(sent_vol) > 0.95, -zscore(scl12_buzz)*sent_vol, -1)
933
+ ```
934
+
935
+ ---
936
+
937
+ ### TPL-204: 条件情绪过滤
938
+ ```
939
+ 模板:
940
+ group_rank(
941
+ sigmoid(if_else(ts_zscore(<sentiment_field/>, <d/>) > <threshold/>, ts_zscore(<sentiment_field/>, <d/>), 0)),
942
+ <group/>
943
+ )
944
+ ```
945
+ | 占位符 | 可选值 | 说明 |
946
+ |--------|--------|------|
947
+ | `<sentiment_field/>` | 情绪字段 | 情绪数据 |
948
+ | `<d/>` | `22`, `30`, `66` | zscore窗口 |
949
+ | `<threshold/>` | `1`, `1.5`, `2` | z-score阈值 |
950
+ | `<group/>` | `industry`, `sector` | 分组字段 |
951
+
952
+ ---
953
+
954
+ ### TPL-205: 情绪+波动率复合
955
+ ```
956
+ 模板: log(1 + sigmoid(ts_zscore(<sentiment_field/>, <d1/>)) * sigmoid(ts_zscore(<volatility_field/>, <d2/>)))
957
+ ```
958
+ | 占位符 | 可选值 | 说明 |
959
+ |--------|--------|------|
960
+ | `<sentiment_field/>` | 情绪字段 | 情绪数据 |
961
+ | `<volatility_field/>` | `option8_*`, 波动率字段 | 波动率数据 |
962
+ | `<d1/>` | `30`, `66` | 情绪窗口 |
963
+ | `<d2/>` | `30`, `66` | 波动率窗口 |
964
+
965
+ ---
966
+
967
+ ### TPL-206: 指数衰减情绪
968
+ ```
969
+ 模板: ts_decay_exp_window(vec_avg(<sentiment_field/>), <d/>, <factor/>)
970
+ ```
971
+ | 占位符 | 可选值 | 说明 |
972
+ |--------|--------|------|
973
+ | `<sentiment_field/>` | `mws85_sentiment`, `nws18_ber` | 情绪向量字段 |
974
+ | `<d/>` | `10`, `22` | 衰减窗口 |
975
+ | `<factor/>` | `0.9`, `0.7` | 衰减因子 |
976
+
977
+ **双情绪组合**:
978
+ ```
979
+ decayed_sentiment_1 = ts_decay_exp_window(vec_avg(mws85_sentiment), 10, 0.9);
980
+ decayed_sentiment_2 = ts_decay_exp_window(vec_avg(nws18_ber), 10, 0.9);
981
+ decayed_sentiment_1 + decayed_sentiment_2
982
+ ```
983
+
984
+ ---
985
+
986
+ ### TPL-207: 新闻结果排名
987
+ ```
988
+ 模板:
989
+ percent = ts_rank(vec_stddev(<news_field/>), <d1/>);
990
+ -ts_rank(ts_decay_linear(percent, <d2/>), <d1/>)
991
+ ```
992
+ | 占位符 | 可选值 | 说明 |
993
+ |--------|--------|------|
994
+ | `<news_field/>` | `nws12_prez_result2` | 新闻数据 |
995
+ | `<d1/>` | `50`, `66` | 排名窗口 |
996
+ | `<d2/>` | `150`, `252` | 衰减窗口 |
997
+
998
+ ---
999
+
1000
+ ### TPL-208: 分组行业提取情绪
1001
+ ```
1002
+ 模板: scale(group_extra(ts_sum(sigmoid(ts_backfill(<data/>, <d1/>)), <d2/>) - ts_sum(sigmoid(ts_backfill(<data/>, <d1/>)), <d2/>), 0.5, densify(industry)))
1003
+ ```
1004
+ | 占位符 | 可选值 | 说明 |
1005
+ |--------|--------|------|
1006
+ | `<data/>` | 情绪或基本面字段 | 数据字段 |
1007
+ | `<d1/>` | `180`, `252` | 回填窗口 |
1008
+ | `<d2/>` | `3`, `5` | 求和窗口 |
1009
+
1010
+ ---
1011
+
1012
+ ## 第四部分:期权类模板 (TPL-301 ~ TPL-320)
1013
+
1014
+ ### TPL-301: 期权希腊字母差值
1015
+ ```
1016
+ 模板: <group_op/>(<put_greek/> - <call_greek/>, <group/>)
1017
+ ```
1018
+ | 占位符 | 可选值 | 说明 |
1019
+ |--------|--------|------|
1020
+ | `<group_op/>` | `group_rank`, `group_neutralize`, `group_zscore` | 分组操作 |
1021
+ | `<put_greek/>` | `put_delta`, `put_gamma`, `put_theta`, `put_vega` | Put希腊字母 |
1022
+ | `<call_greek/>` | `call_delta`, `call_gamma`, `call_theta`, `call_vega` | Call希腊字母 |
1023
+ | `<group/>` | `industry`, `sector` | 分组字段 |
1024
+
1025
+ ---
1026
+
1027
+ ### TPL-302: 期权价格信号
1028
+ ```
1029
+ 模板: group_rank(<ts_op/>(<vec_op/>(<option_price_field/>)/close, <d/>), <group/>)
1030
+ ```
1031
+ | 占位符 | 可选值 | 说明 |
1032
+ |--------|--------|------|
1033
+ | `<ts_op/>` | `ts_scale`, `ts_rank`, `ts_zscore` | 时序操作 |
1034
+ | `<vec_op/>` | `vec_max`, `vec_avg` | 向量操作 |
1035
+ | `<option_price_field/>` | 期权价格字段 | 期权数据 |
1036
+ | `<d/>` | `66`, `120`, `252` | 时间窗口 |
1037
+ | `<group/>` | `industry`, `sector` | 分组字段 |
1038
+
1039
+ ---
1040
+
1041
+ ### TPL-303: 期权波动率信号
1042
+ ```
1043
+ 模板: sigmoid(<ts_op/>(<opt_high/> - <opt_close/>, <d/>))
1044
+ ```
1045
+ | 占位符 | 可选值 | 说明 |
1046
+ |--------|--------|------|
1047
+ | `<ts_op/>` | `ts_ir`, `ts_stddev`, `ts_zscore`, `ts_mean` | 波动性操作 |
1048
+ | `<opt_high/>` | 期权高价字段 | 期权最高价 |
1049
+ | `<opt_close/>` | 期权收盘价字段 | 期权收盘价 |
1050
+ | `<d/>` | `120`, `250`, `504` | 长期窗口 |
1051
+
1052
+ **说明**: 期权波动类因子通常需要较长窗口(120-504天)来捕捉稳定信号
1053
+
1054
+ ---
1055
+
1056
+ ### TPL-304: 隐含波动率比率
1057
+ ```
1058
+ 模板: <ts_op/>(implied_volatility_call_<tenor/>/parkinson_volatility_<tenor/>, <d/>)
1059
+ ```
1060
+ | 占位符 | 可选值 | 说明 |
1061
+ |--------|--------|------|
1062
+ | `<ts_op/>` | `ts_rank`, `ts_zscore`, `ts_delta` | 时序操作 |
1063
+ | `<tenor/>` | `120`, `270` | 期权期限 |
1064
+ | `<d/>` | `66`, `126`, `252` | 窗口 |
1065
+
1066
+ ---
1067
+
1068
+ ### TPL-305: Put-Call成交量比
1069
+ ```
1070
+ 模板: <ts_op/>(pcr_vol_<tenor/>, <d/>)
1071
+ ```
1072
+ | 占位符 | 可选值 | 说明 |
1073
+ |--------|--------|------|
1074
+ | `<ts_op/>` | `ts_rank`, `ts_delta`, `ts_zscore` | 时序操作 |
1075
+ | `<tenor/>` | `10`, `30`, `60` | 期限 |
1076
+ | `<d/>` | `22`, `66`, `126` | 窗口 |
1077
+
1078
+ ---
1079
+
1080
+ ### TPL-306: 期权盈亏平衡点
1081
+ ```
1082
+ 模板: group_rank(ts_zscore(<breakeven_field/>/close, <d/>), <group/>)
1083
+ ```
1084
+ | 占位符 | 可选值 | 说明 |
1085
+ |--------|--------|------|
1086
+ | `<breakeven_field/>` | `call_breakeven_10`, `put_breakeven_10` | 盈亏平衡字段 |
1087
+ | `<d/>` | `66`, `126`, `252` | 窗口 |
1088
+ | `<group/>` | `sector`, `industry` | 分组 |
1089
+
1090
+ ---
1091
+
1092
+ ## 第五部分:分析师类模板 (TPL-401 ~ TPL-420)
1093
+
1094
+ ### TPL-401: 分析师预期变化
1095
+ ```
1096
+ 模板: <vec_op/>(tail(tail(<analyst_change_field/>, lower=<low/>, upper=<high/>, newval=<low/>), lower=-<high/>, upper=-<low/>, newval=-<low/>))
1097
+ ```
1098
+ | 占位符 | 可选值 | 说明 |
1099
+ |--------|--------|------|
1100
+ | `<vec_op/>` | `vec_avg`, `vec_sum` | 向量聚合 |
1101
+ | `<analyst_change_field/>` | `oth41_s_west_eps_ftm_chg_3m`, `anl4_eps_chg` | 预期变化字段 |
1102
+ | `<low/>` | `0.25`, `0.1` | 下截断值 |
1103
+ | `<high/>` | `1000`, `100` | 上截断值 |
1104
+
1105
+ ---
1106
+
1107
+ ### TPL-402: 剥离动量的分析师因子
1108
+ ```
1109
+ 模板:
1110
+ afr = <vec_op/>(<analyst_field/>);
1111
+ short_mom = ts_mean(returns - group_mean(returns, 1, market), <d_short/>);
1112
+ long_mom = ts_delay(ts_mean(returns - group_mean(returns, 1, market), <d_long/>), <d_long/>);
1113
+ regression_neut(regression_neut(afr, short_mom), long_mom)
1114
+ ```
1115
+ | 占位符 | 可选值 | 说明 |
1116
+ |--------|--------|------|
1117
+ | `<vec_op/>` | `vec_avg`, `vec_sum` | 向量聚合 |
1118
+ | `<analyst_field/>` | 分析师数据字段 | 一致预期等 |
1119
+ | `<d_short/>` | `5`, `10` | 短期动量窗口 |
1120
+ | `<d_long/>` | `20`, `22` | 长期动量窗口 |
1121
+
1122
+ ---
1123
+
1124
+ ### TPL-403: 分析师覆盖度过滤
1125
+ ```
1126
+ 模板:
1127
+ coverage_filter = ts_sum(<vec_op/>(<analyst_field/>), <d/>) > <min_count/>;
1128
+ if_else(coverage_filter, <alpha/>, nan)
1129
+ ```
1130
+ | 占位符 | 可选值 | 说明 |
1131
+ |--------|--------|------|
1132
+ | `<vec_op/>` | `vec_count` | 统计分析师数量 |
1133
+ | `<analyst_field/>` | 分析师向量字段 | 分析师数据 |
1134
+ | `<d/>` | `66`, `90`, `126` | 统计窗口 |
1135
+ | `<min_count/>` | `2`, `3`, `5` | 最小覆盖数量 |
1136
+ | `<alpha/>` | 主信号表达式 | 待过滤的Alpha |
1137
+
1138
+ ---
1139
+
1140
+ ### TPL-404: 老虎哥回归模板
1141
+ ```
1142
+ 模板: group_rank(ts_regression(ts_zscore(<field1/>, <d/>), ts_zscore(vec_sum(<field2/>), <d/>), <d/>), densify(sector))
1143
+ ```
1144
+ | 占位符 | 可选值 | 说明 |
1145
+ |--------|--------|------|
1146
+ | `<field1/>` | 任意MATRIX字段 | Y变量 |
1147
+ | `<field2/>` | 任意VECTOR字段 | X变量 |
1148
+ | `<d/>` | `252`, `504` | 回归窗口 |
1149
+
1150
+ **说明**: 经典回归模板,适用于基本面与分析师数据组合
1151
+
1152
+ ---
1153
+
1154
+ ### TPL-405: 分析师预期时序变化
1155
+ ```
1156
+ 模板: ts_mean(vec_avg(<analyst_field/>), <d_short/>) - ts_mean(vec_avg(<analyst_field/>), <d_long/>)
1157
+ ```
1158
+ | 占位符 | 可选值 | 说明 |
1159
+ |--------|--------|------|
1160
+ | `<analyst_field/>` | `anl4_eps_mean`, `anl4_revenue_mean` | 分析师预测 |
1161
+ | `<d_short/>` | `22`, `44` | 短期窗口 |
1162
+ | `<d_long/>` | `66`, `126` | 长期窗口 |
1163
+
1164
+ ---
1165
+
1166
+ ### TPL-406: 三因子组合模板
1167
+ ```
1168
+ 模板:
1169
+ my_group = market;
1170
+ rank(
1171
+ group_rank(ts_decay_linear(volume/ts_sum(volume, 252), 10), my_group) *
1172
+ group_rank(ts_rank(vec_avg(<fundamental/>), <d/>), my_group) *
1173
+ group_rank(-ts_delta(close, 5), my_group)
1174
+ )
1175
+ ```
1176
+ | 占位符 | 可选值 | 说明 |
1177
+ |--------|--------|------|
1178
+ | `<fundamental/>` | 基本面VECTOR字段 | 基本面数据 |
1179
+ | `<d/>` | `252`, `504` | 排名窗口 |
1180
+
1181
+ ---
1182
+
1183
+ ### TPL-407: 分析师FCF比率
1184
+ ```
1185
+ 模板: ts_rank(vec_avg(<fcf_field/>) / vec_avg(<profit_field/>), <d/>)
1186
+ ```
1187
+ | 占位符 | 可选值 | 说明 |
1188
+ |--------|--------|------|
1189
+ | `<fcf_field/>` | `anl4_fcf_value` | 自由现金流预测 |
1190
+ | `<profit_field/>` | `anl4_netprofit_low`, `anl4_netprofit_mean` | 利润预测 |
1191
+ | `<d/>` | `66`, `126`, `252` | 排名窗口 |
1192
+
1193
+ ---
1194
+
1195
+ ## 第六部分:中性化技术模板 (TPL-501 ~ TPL-515)
1196
+
1197
+ ### TPL-501: 市值分组中性化
1198
+ ```
1199
+ 模板: group_neutralize(<alpha/>, bucket(rank(cap), range="<range/>"))
1200
+ ```
1201
+ | 占位符 | 可选值 | 说明 |
1202
+ |--------|--------|------|
1203
+ | `<alpha/>` | 主信号表达式 | 待中性化的Alpha |
1204
+ | `<range/>` | `"0.1,1,0.1"`, `"0,1,0.1"` | 分组范围 |
1205
+
1206
+ ---
1207
+
1208
+ ### TPL-502: 双重中性化 (行业+市值)
1209
+ ```
1210
+ 模板:
1211
+ a1 = group_neutralize(<alpha/>, bucket(rank(cap), range="<range/>"));
1212
+ group_neutralize(a1, <group/>)
1213
+ ```
1214
+ | 占位符 | 可选值 | 说明 |
1215
+ |--------|--------|------|
1216
+ | `<alpha/>` | 主信号 | 原始Alpha |
1217
+ | `<range/>` | `"0.1,1,0.1"` | 市值分组 |
1218
+ | `<group/>` | `industry`, `sector`, `subindustry` | 行业分组 |
1219
+
1220
+ ---
1221
+
1222
+ ### TPL-503: 回归中性化
1223
+ ```
1224
+ 模板: regression_neut(<alpha/>, <factor/>)
1225
+ ```
1226
+ | 占位符 | 可选值 | 说明 |
1227
+ |--------|--------|------|
1228
+ | `<alpha/>` | 主信号 | 原始Alpha |
1229
+ | `<factor/>` | `log(cap)`, `ts_ir(returns, 126)`, `ts_std_dev(returns, 22)` | 待剥离因子 |
1230
+
1231
+ **多层回归中性化**:
1232
+ ```
1233
+ 模板: regression_neut(regression_neut(<alpha/>, <factor1/>), <factor2/>)
1234
+ ```
1235
+
1236
+ ---
1237
+
1238
+ ### TPL-504: 中性化顺序优化
1239
+ ```
1240
+ 模板:
1241
+ a = ts_zscore(<field/>, <d/>);
1242
+ a1 = group_neutralize(a, <group/>);
1243
+ a2 = group_neutralize(a1, bucket(rank(cap), range="<range/>"))
1244
+ ```
1245
+ | 占位符 | 可选值 | 说明 |
1246
+ |--------|--------|------|
1247
+ | `<field/>` | 任意数据字段 | 主信号 |
1248
+ | `<d/>` | `252` | zscore窗口 |
1249
+ | `<group/>` | `industry`, `subindustry` | 行业分组 |
1250
+ | `<range/>` | `"0.1,1,0.1"` | 市值分组 |
1251
+
1252
+ **说明**: 先行业中性化再市值中性化,与反向顺序效果可能不同
1253
+
1254
+ ---
1255
+
1256
+ ### TPL-505: sta1分组中性化
1257
+ ```
1258
+ 模板: group_neutralize(<alpha/>, sta1_top3000c20)
1259
+ ```
1260
+ **说明**: 使用预定义的sta1分组进行中性化
1261
+
1262
+ ---
1263
+
1264
+ ## 第七部分:条件交易模板 (TPL-601 ~ TPL-620)
1265
+
1266
+ ### TPL-601: 流动性过滤
1267
+ ```
1268
+ 模板: trade_when(volume > adv20 * <threshold/>, <alpha/>, -1)
1269
+ ```
1270
+ | 占位符 | 可选值 | 说明 |
1271
+ |--------|--------|------|
1272
+ | `<threshold/>` | `0.618`, `0.5`, `1` | 流动性阈值 |
1273
+ | `<alpha/>` | 主信号 | 原始Alpha |
1274
+
1275
+ **反向流动性**:
1276
+ ```
1277
+ trade_when(volume < adv20, <alpha/>, -1)
1278
+ ```
1279
+
1280
+ ---
1281
+
1282
+ ### TPL-602: 波动率过滤
1283
+ ```
1284
+ 模板: trade_when(ts_rank(ts_std_dev(returns, <d1/>), <d2/>) < <threshold/>, <alpha/>, -1)
1285
+ ```
1286
+ | 占位符 | 可选值 | 说明 |
1287
+ |--------|--------|------|
1288
+ | `<d1/>` | `5`, `10`, `22` | 波动计算窗口 |
1289
+ | `<d2/>` | `126`, `180`, `252` | 排名窗口 |
1290
+ | `<threshold/>` | `0.8`, `0.9` | 波动率阈值 |
1291
+ | `<alpha/>` | 主信号 | 原始Alpha |
1292
+
1293
+ ---
1294
+
1295
+ ### TPL-603: 极端收益过滤
1296
+ ```
1297
+ 模板: trade_when(abs(returns) < <entry/>, <alpha/>, abs(returns) > <exit/>)
1298
+ ```
1299
+ | 占位符 | 可选值 | 说明 |
1300
+ |--------|--------|------|
1301
+ | `<entry/>` | `0.075`, `0.05` | 入场阈值 |
1302
+ | `<exit/>` | `0.1`, `0.095` | 出场阈值 |
1303
+ | `<alpha/>` | 主信号 | 原始Alpha |
1304
+
1305
+ ---
1306
+
1307
+ ### TPL-604: 市值过滤
1308
+ ```
1309
+ 模板: trade_when(rank(cap) > <threshold/>, <alpha/>, -1)
1310
+ ```
1311
+ | 占位符 | 可选值 | 说明 |
1312
+ |--------|--------|------|
1313
+ | `<threshold/>` | `0.3`, `0.5` | 市值排名阈值 |
1314
+ | `<alpha/>` | 主信号 | 原始Alpha |
1315
+
1316
+ ---
1317
+
1318
+ ### TPL-605: 触发条件交易
1319
+ ```
1320
+ 模板:
1321
+ triggerTradeexp = (ts_arg_max(volume, <d/>) < 1) && (volume > ts_sum(volume, <d/>)/<d/>);
1322
+ triggerExitexp = -1;
1323
+ trade_when(triggerTradeexp, <alpha/>, triggerExitexp)
1324
+ ```
1325
+ | 占位符 | 可选值 | 说明 |
1326
+ |--------|--------|------|
1327
+ | `<d/>` | `5`, `10` | 判断窗口 |
1328
+ | `<alpha/>` | `-rank(ts_delta(close, 2))` | 主信号 |
1329
+
1330
+ ---
1331
+
1332
+ ### TPL-606: 组合条件交易
1333
+ ```
1334
+ 模板:
1335
+ my_group2 = bucket(rank(cap), range="0,1,0.1");
1336
+ trade_when(volume > adv20, group_neutralize(<alpha/>, my_group2), -1)
1337
+ ```
1338
+ | 占位符 | 可选值 | 说明 |
1339
+ |--------|--------|------|
1340
+ | `<alpha/>` | 复合信号 | 主信号 |
1341
+
1342
+ ---
1343
+
1344
+ ### TPL-607: 条件排名交易
1345
+ ```
1346
+ 模板:
1347
+ a = <ts_op/>(<field/>, <d/>);
1348
+ trade_when(rank(a) > <threshold_low/>, -zscore(<field2/>)*a, <threshold_high/>-rank(a))
1349
+ ```
1350
+ | 占位符 | 可选值 | 说明 |
1351
+ |--------|--------|------|
1352
+ | `<ts_op/>` | `ts_rank`, `ts_zscore` | 时序操作 |
1353
+ | `<field/>` | 任意字段 | 条件字段 |
1354
+ | `<field2/>` | 任意字段 | 信号字段 |
1355
+ | `<d/>` | `25`, `66` | 窗口 |
1356
+ | `<threshold_low/>` | `0.03`, `0.1` | 下阈值 |
1357
+ | `<threshold_high/>` | `0.25`, `0.5` | 上阈值 |
1358
+
1359
+ ---
1360
+
1361
+ ## 第八部分:复合多因子模板 (TPL-701 ~ TPL-720)
1362
+
1363
+ ### TPL-701: 三因子乘积
1364
+ ```
1365
+ 模板:
1366
+ my_group = market;
1367
+ rank(
1368
+ group_rank(<ts_op1/>(<field1/>, <d1/>), my_group) *
1369
+ group_rank(<ts_op2/>(<field2/>, <d2/>), my_group) *
1370
+ group_rank(<ts_op3/>(<field3/>, <d3/>), my_group)
1371
+ )
1372
+ ```
1373
+ | 占位符 | 可选值 | 说明 |
1374
+ |--------|--------|------|
1375
+ | `<ts_op1/>` | `ts_decay_linear`, `ts_rank` | 第一因子操作 |
1376
+ | `<ts_op2/>` | `ts_rank`, `ts_zscore` | 第二因子操作 |
1377
+ | `<ts_op3/>` | `-ts_delta` | 第三因子操作(反转) |
1378
+ | `<field1/>` | `volume/ts_sum(volume, 252)` | 成交量趋势 |
1379
+ | `<field2/>` | `vec_avg({Fundamental})` | 基本面信号 |
1380
+ | `<field3/>` | `close` | 价格信号 |
1381
+ | `<d1/>`, `<d2/>`, `<d3/>` | 各因子窗口 | 时间参数 |
1382
+
1383
+ ---
1384
+
1385
+ ### TPL-702: 波动率条件反转
1386
+ ```
1387
+ 模板:
1388
+ vol = ts_std_dev(<ret_field/>, <d/>);
1389
+ vol_mean = group_mean(vol, 1, market);
1390
+ flip_ret = if_else(vol < vol_mean, -<ret_field/>, <ret_field/>);
1391
+ -ts_mean(flip_ret, <d/>)
1392
+ ```
1393
+ | 占位符 | 可选值 | 说明 |
1394
+ |--------|--------|------|
1395
+ | `<ret_field/>` | `returns`, `close/open-1` | 收益字段 |
1396
+ | `<d/>` | `20`, `22` | 窗口参数 |
1397
+
1398
+ **说明**: 低波动环境做反转,高波动环境做动量
1399
+
1400
+ ---
1401
+
1402
+ ### TPL-703: 恐惧指标组合
1403
+ ```
1404
+ 模板:
1405
+ fear = ts_mean(
1406
+ abs(returns - group_mean(returns, 1, market)) /
1407
+ (abs(returns) + abs(group_mean(returns, 1, market)) + 0.1),
1408
+ <d/>
1409
+ );
1410
+ -group_neutralize(fear * <signal/>, bucket(rank(cap), range="0.1,1,0.1"))
1411
+ ```
1412
+ | 占位符 | 可选值 | 说明 |
1413
+ |--------|--------|------|
1414
+ | `<d/>` | `20`, `22` | 恐惧指标窗口 |
1415
+ | `<signal/>` | 主信号表达式 | 待组合信号 |
1416
+
1417
+ ---
1418
+
1419
+ ### TPL-704: 债务杠杆相关性
1420
+ ```
1421
+ 模板: group_neutralize(ts_zscore(<leverage_field/>, <d1/>) * ts_corr(<leverage_field/>, returns, <d2/>), sector)
1422
+ ```
1423
+ | 占位符 | 可选值 | 说明 |
1424
+ |--------|--------|------|
1425
+ | `<leverage_field/>` | `debt_to_equity`, `debt/assets` | 杠杆字段 |
1426
+ | `<d1/>` | `60`, `126` | zscore窗口 |
1427
+ | `<d2/>` | `20`, `66` | 相关性窗口 |
1428
+
1429
+ ---
1430
+
1431
+ ### TPL-705: 模型数据信号
1432
+ ```
1433
+ 模板: -<model_field/>
1434
+ ```
1435
+ | 占位符 | 可选值 | 说明 |
1436
+ |--------|--------|------|
1437
+ | `<model_field/>` | `mdl175_01dtsv`, `mdl175_01icc` | 模型字段 |
1438
+
1439
+ **带排名版**:
1440
+ ```
1441
+ rank(group_rank(ts_rank(ts_backfill(<model_field/>, 5), 5), sta1_top3000c20))
1442
+ ```
1443
+
1444
+ ---
1445
+
1446
+ ### TPL-706: 回归zscore模板
1447
+ ```
1448
+ 模板: ts_regression(ts_zscore(<field1/>, <d/>), ts_zscore(<field2/>, <d/>), <d/>)
1449
+ ```
1450
+ | 占位符 | 可选值 | 说明 |
1451
+ |--------|--------|------|
1452
+ | `<field1/>` | MATRIX字段 | Y变量 |
1453
+ | `<field2/>` | MATRIX字段或vec_sum(VECTOR) | X变量 |
1454
+ | `<d/>` | `252`, `500`, `504` | 回归窗口 |
1455
+
1456
+ ---
1457
+
1458
+ ### TPL-707: 分组Delta模板
1459
+ ```
1460
+ 模板: group_neutralize(ts_delta(<field/>, <d/>), sector)
1461
+ ```
1462
+ | 占位符 | 可选值 | 说明 |
1463
+ |--------|--------|------|
1464
+ | `<field/>` | 任意数据字段 | 主字段 |
1465
+ | `<d/>` | `22`, `66`, `126` | 差分窗口 |
1466
+
1467
+ ---
1468
+
1469
+ ## 第九部分:数据预处理模板 (TPL-801 ~ TPL-815)
1470
+
1471
+ ### TPL-801: Winsorize截断
1472
+ ```
1473
+ 模板: winsorize(<field/>, std=<std/>)
1474
+ ```
1475
+ | 占位符 | 可选值 | 说明 |
1476
+ |--------|--------|------|
1477
+ | `<field/>` | 任意字段 | 原始数据 |
1478
+ | `<std/>` | `3`, `4`, `5` | 截断标准差 |
1479
+
1480
+ ---
1481
+
1482
+ ### TPL-802: Sigmoid归一化
1483
+ ```
1484
+ 模板: sigmoid(<ts_op/>(<field/>, <d/>))
1485
+ ```
1486
+ | 占位符 | 可选值 | 说明 |
1487
+ |--------|--------|------|
1488
+ | `<ts_op/>` | `ts_zscore`, `ts_ir`, `ts_rank` | 时序操作 |
1489
+ | `<field/>` | 任意字段 | 原始数据 |
1490
+ | `<d/>` | `22`, `66`, `252` | 窗口 |
1491
+
1492
+ ---
1493
+
1494
+ ### TPL-803: 数据回填
1495
+ ```
1496
+ 模板: ts_backfill(<field/>, <d/>)
1497
+ ```
1498
+ | 占位符 | 可选值 | 说明 |
1499
+ |--------|--------|------|
1500
+ | `<field/>` | 低频数据字段 | 需要回填的字段 |
1501
+ | `<d/>` | `115`, `120`, `180`, `252` | 回填窗口 |
1502
+
1503
+ ---
1504
+
1505
+ ### TPL-804: 条件替换
1506
+ ```
1507
+ 模板: if_else(is_not_nan(<field/>), <field/>, <alternative/>)
1508
+ ```
1509
+ | 占位符 | 可选值 | 说明 |
1510
+ |--------|--------|------|
1511
+ | `<field/>` | 主字段 | 可能有NaN的字段 |
1512
+ | `<alternative/>` | 替代字段或值 | NaN时的替代 |
1513
+
1514
+ ---
1515
+
1516
+ ### TPL-805: 极端值替换
1517
+ ```
1518
+ 模板: tail(tail(<field/>, lower=<low/>, upper=<high/>, newval=<low/>), lower=-<high/>, upper=-<low/>, newval=-<low/>)
1519
+ ```
1520
+ | 占位符 | 可选值 | 说明 |
1521
+ |--------|--------|------|
1522
+ | `<field/>` | 任意字段 | 原始数据 |
1523
+ | `<low/>` | `0.25`, `0.1` | 下界 |
1524
+ | `<high/>` | `100`, `1000` | 上界 |
1525
+
1526
+ ---
1527
+
1528
+ ### TPL-806: 组合预处理
1529
+ ```
1530
+ 模板: <ts_op/>(winsorize(ts_backfill(<field/>, <d_backfill/>), std=<std/>), <d/>)
1531
+ ```
1532
+ | 占位符 | 可选值 | 说明 |
1533
+ |--------|--------|------|
1534
+ | `<ts_op/>` | `ts_rank`, `ts_zscore`, `ts_mean` | 时序操作 |
1535
+ | `<field/>` | 低频字段 | 需要处理的字段 |
1536
+ | `<d_backfill/>` | `120`, `180` | 回填窗口 |
1537
+ | `<std/>` | `4` | winsorize参数 |
1538
+ | `<d/>` | `22`, `66` | 操作窗口 |
1539
+
1540
+ ---
1541
+
1542
+ ### TPL-807: ts_min/ts_max替代
1543
+ ```
1544
+ 模板: ts_backfill(if_else(ts_arg_min(<field/>, <d/>) == 0, <field/>, nan), 120)
1545
+ ```
1546
+ | 占位符 | 可选值 | 说明 |
1547
+ |--------|--------|------|
1548
+ | `<field/>` | 任意字段 | 原始数据 |
1549
+ | `<d/>` | `22`, `66`, `126` | 窗口 |
1550
+
1551
+ **说明**: 当ts_min/ts_max不可用时的替代方案
1552
+
1553
+ ---
1554
+
1555
+ ## 第十部分:高级统计模板 (TPL-901 ~ TPL-920)
1556
+
1557
+ ### TPL-901: 高阶矩模板 (ts_moment)
1558
+ ```
1559
+ 模板: <ts_op/>(<group_op/>(ts_moment(<field/>, <d/>, k=<k/>), <group/>))
1560
+ ```
1561
+ | 占位符 | 可选值 | 说明 |
1562
+ |--------|--------|------|
1563
+ | `<ts_op/>` | `rank`, `zscore`, `sigmoid` | 标准化操作 |
1564
+ | `<group_op/>` | `group_rank`, `group_zscore` | 分组操作 |
1565
+ | `<field/>` | 任意MATRIX字段 | 数据字段 |
1566
+ | `<d/>` | `22`, `66`, `126` | 窗口 |
1567
+ | `<k/>` | `2`, `3`, `4` | k=2方差, k=3偏度, k=4峰度 |
1568
+
1569
+ **说明**: ts_moment(x, d, k)计算k阶中心矩
1570
+
1571
+ ---
1572
+
1573
+ ### TPL-902: 协偏度/协峰度模板
1574
+ ```
1575
+ 模板: <group_op/>(ts_co_skewness(<field1/>, <field2/>, <d/>), <group/>)
1576
+ ```
1577
+ | 占位符 | 可选值 | 说明 |
1578
+ |--------|--------|------|
1579
+ | `<group_op/>` | `group_rank`, `group_zscore` | 分组操作 |
1580
+ | `<field1/>` | `returns`, `close` | 第一变量 |
1581
+ | `<field2/>` | `volume`, `vwap` | 第二变量 |
1582
+ | `<d/>` | `66`, `126`, `252` | 窗口 |
1583
+
1584
+ **协峰度版**:
1585
+ ```
1586
+ 模板: <group_op/>(ts_co_kurtosis(<field1/>, <field2/>, <d/>), <group/>)
1587
+ ```
1588
+
1589
+ ---
1590
+
1591
+ ### TPL-903: 偏相关模板 (ts_partial_corr)
1592
+ ```
1593
+ 模板: group_rank(ts_partial_corr(<field1/>, <field2/>, <control/>, <d/>), <group/>)
1594
+ ```
1595
+ | 占位符 | 可选值 | 说明 |
1596
+ |--------|--------|------|
1597
+ | `<field1/>` | `returns`, 收益相关 | Y变量 |
1598
+ | `<field2/>` | 任意字段 | X变量 |
1599
+ | `<control/>` | `group_mean(returns, 1, market)` | 控制变量(市场收益) |
1600
+ | `<d/>` | `60`, `126`, `252` | 窗口 |
1601
+ | `<group/>` | `sector`, `industry` | 分组 |
1602
+
1603
+ **说明**: 计算两变量偏相关,控制第三变量影响
1604
+
1605
+ ---
1606
+
1607
+ ### TPL-904: 三元相关模板 (ts_triple_corr)
1608
+ ```
1609
+ 模板: group_rank(ts_triple_corr(<field1/>, <field2/>, <field3/>, <d/>), <group/>)
1610
+ ```
1611
+ | 占位符 | 可选值 | 说明 |
1612
+ |--------|--------|------|
1613
+ | `<field1/>` | `returns` | 第一变量 |
1614
+ | `<field2/>` | `volume` | 第二变量 |
1615
+ | `<field3/>` | 基本面字段 | 第三变量 |
1616
+ | `<d/>` | `60`, `126` | 窗口 |
1617
+ | `<group/>` | `sector`, `industry` | 分组 |
1618
+
1619
+ ---
1620
+
1621
+ ### TPL-905: Theil-Sen回归模板
1622
+ ```
1623
+ 模板: group_rank(ts_theilsen(<field1/>, <field2/>, <d/>), <group/>)
1624
+ ```
1625
+ | 占位符 | 可选值 | 说明 |
1626
+ |--------|--------|------|
1627
+ | `<field1/>` | 任意MATRIX字段 | Y变量 |
1628
+ | `<field2/>` | 任意MATRIX字段或`ts_step(1)` | X变量 |
1629
+ | `<d/>` | `126`, `252`, `500` | 窗口 |
1630
+ | `<group/>` | `sector`, `industry` | 分组 |
1631
+
1632
+ **说明**: Theil-Sen回归比普通回归更鲁棒
1633
+
1634
+ ---
1635
+
1636
+ ### TPL-906: 多项式回归残差
1637
+ ```
1638
+ 模板: ts_poly_regression(<field1/>, <field2/>, <d/>, k=<k/>)
1639
+ ```
1640
+ | 占位符 | 可选值 | 说明 |
1641
+ |--------|--------|------|
1642
+ | `<field1/>` | Y变量 | 被解释变量 |
1643
+ | `<field2/>` | X变量 | 解释变量 |
1644
+ | `<d/>` | `126`, `252` | 窗口 |
1645
+ | `<k/>` | `1`, `2`, `3` | 多项式阶数, k=2为二次回归 |
1646
+
1647
+ **说明**: 返回 y - Ey (残差)
1648
+
1649
+ ---
1650
+
1651
+ ### TPL-907: 向量中性化模板
1652
+ ```
1653
+ 模板: ts_vector_neut(<alpha/>, <risk_factor/>, <d/>)
1654
+ ```
1655
+ | 占位符 | 可选值 | 说明 |
1656
+ |--------|--------|------|
1657
+ | `<alpha/>` | 主信号 | 待中性化Alpha |
1658
+ | `<risk_factor/>` | `returns`, `cap` | 风险因子 |
1659
+ | `<d/>` | `22`, `66`, `126` | 窗口(不宜过长,计算慢) |
1660
+
1661
+ **分组向量中性化**:
1662
+ ```
1663
+ 模板: group_vector_neut(<alpha/>, <risk_factor/>, <group/>)
1664
+ ```
1665
+
1666
+ ---
1667
+
1668
+ ### TPL-908: 加权衰减模板
1669
+ ```
1670
+ 模板: group_neutralize(ts_weighted_decay(<alpha/>, k=<k/>), <group/>)
1671
+ ```
1672
+ | 占位符 | 可选值 | 说明 |
1673
+ |--------|--------|------|
1674
+ | `<alpha/>` | 主信号 | 待衰减Alpha |
1675
+ | `<k/>` | `0.3`, `0.5`, `0.7` | 衰减系数 |
1676
+ | `<group/>` | `bucket(rank(cap), range="0.1,1,0.1")` | 分组 |
1677
+
1678
+ ---
1679
+
1680
+ ### TPL-909: 回归斜率模板
1681
+ ```
1682
+ 模板: ts_regression(ts_zscore(<field/>, <d/>), ts_step(1), <d/>, rettype=2)
1683
+ ```
1684
+ | 占位符 | 可选值 | 说明 |
1685
+ |--------|--------|------|
1686
+ | `<field/>` | 任意MATRIX字段 | 数据字段 |
1687
+ | `<d/>` | `252`, `500` | 窗口 |
1688
+
1689
+ **说明**: rettype=2返回斜率,用于检测趋势
1690
+
1691
+ ---
1692
+
1693
+ ### TPL-910: 最小最大压缩模板
1694
+ ```
1695
+ 模板: ts_min_max_cps(<field/>, <d/>, f=<f/>)
1696
+ ```
1697
+ | 占位符 | 可选值 | 说明 |
1698
+ |--------|--------|------|
1699
+ | `<field/>` | 任意字段 | 数据字段 |
1700
+ | `<d/>` | `22`, `66`, `126` | 窗口 |
1701
+ | `<f/>` | `2`, `0.5` | 压缩因子 |
1702
+
1703
+ **等价公式**: `x - f * (ts_min(x, d) + ts_max(x, d))`
1704
+
1705
+ ---
1706
+
1707
+ ## 第十一部分:事件驱动模板 (TPL-1001 ~ TPL-1020)
1708
+
1709
+ ### TPL-1001: 数据变化天数模板
1710
+ ```
1711
+ 模板: if_else(days_from_last_change(<field/>) == <days/>, <alpha/>, nan)
1712
+ ```
1713
+ | 占位符 | 可选值 | 说明 |
1714
+ |--------|--------|------|
1715
+ | `<field/>` | 基本面字段 | 监测变化的字段 |
1716
+ | `<days/>` | `1`, `2`, `5` | 距离变化的天数 |
1717
+ | `<alpha/>` | `ts_delta(close, 5)`, 主信号 | 事件触发时的Alpha |
1718
+
1719
+ **动态衰减版**:
1720
+ ```
1721
+ 模板: <alpha/> / (1 + days_from_last_change(<field/>))
1722
+ ```
1723
+
1724
+ ---
1725
+
1726
+ ### TPL-1002: 最近差值模板
1727
+ ```
1728
+ 模板: <ts_op/>(last_diff_value(<field/>, <d/>), <d2/>)
1729
+ ```
1730
+ | 占位符 | 可选值 | 说明 |
1731
+ |--------|--------|------|
1732
+ | `<ts_op/>` | `ts_rank`, `ts_zscore` | 时序操作 |
1733
+ | `<field/>` | 任意字段 | 数据字段 |
1734
+ | `<d/>` | `60`, `90`, `120` | 回溯窗口 |
1735
+ | `<d2/>` | `22`, `66` | 操作窗口 |
1736
+
1737
+ **说明**: 返回过去d天内最近一次不同于当前值的历史值
1738
+
1739
+ ---
1740
+
1741
+ ### TPL-1003: 缺失值计数模板
1742
+ ```
1743
+ 模板: -ts_count_nans(ts_backfill(<field/>, <d1/>), <d2/>)
1744
+ ```
1745
+ | 占位符 | 可选值 | 说明 |
1746
+ |--------|--------|------|
1747
+ | `<field/>` | 分析师数据等 | 可能有缺失的字段 |
1748
+ | `<d1/>` | `5`, `10` | 回填窗口 |
1749
+ | `<d2/>` | `20`, `30` | 计数窗口 |
1750
+
1751
+ **应用**: 分析师覆盖度信号,缺失越少覆盖越好
1752
+
1753
+ ---
1754
+
1755
+ ### TPL-1004: 位置最大/最小模板
1756
+ ```
1757
+ 模板: if_else(ts_arg_max(<field/>, <d/>) == <position/>, <alpha/>, nan)
1758
+ ```
1759
+ | 占位符 | 可选值 | 说明 |
1760
+ |--------|--------|------|
1761
+ | `<field/>` | `volume`, 任意字段 | 监测字段 |
1762
+ | `<d/>` | `5`, `10` | 窗口 |
1763
+ | `<position/>` | `0`, `1` | 0表示今天是最大值 |
1764
+ | `<alpha/>` | 主信号 | 条件满足时的Alpha |
1765
+
1766
+ **组合条件**:
1767
+ ```
1768
+ 模板: (ts_arg_max(<field1/>, <d/>) == ts_arg_max(<field2/>, <d/>)) * (<alpha1/> + <alpha2/>)
1769
+ ```
1770
+
1771
+ ---
1772
+
1773
+ ### TPL-1005: 财报发布事件模板
1774
+ ```
1775
+ 模板:
1776
+ event_signal = if_else(ts_delta(<fundamental_field/>, 1) != 0, <alpha/>, nan);
1777
+ ts_decay_linear(event_signal, <decay_d/>)
1778
+ ```
1779
+ | 占位符 | 可选值 | 说明 |
1780
+ |--------|--------|------|
1781
+ | `<fundamental_field/>` | `assets`, `sales`, `eps` | 基本面字段 |
1782
+ | `<alpha/>` | `ts_delta(close, 5)`, 主信号 | 事件Alpha |
1783
+ | `<decay_d/>` | `10`, `22` | 衰减窗口 |
1784
+
1785
+ ---
1786
+
1787
+ ### TPL-1006: 动态Decay事件驱动
1788
+ ```
1789
+ 模板:
1790
+ decay_weight = 1 / (1 + days_from_last_change(<event_field/>));
1791
+ <alpha/> * decay_weight
1792
+ ```
1793
+ | 占位符 | 可选值 | 说明 |
1794
+ |--------|--------|------|
1795
+ | `<event_field/>` | 任意字段 | 事件触发字段 |
1796
+ | `<alpha/>` | 主信号 | 原始Alpha |
1797
+
1798
+ ---
1799
+
1800
+ ### TPL-1007: 盈利公告模板
1801
+ ```
1802
+ 模板:
1803
+ surprise = <actual_field/> - <estimate_field/>;
1804
+ if_else(days_from_last_change(<actual_field/>) < <window/>, surprise, nan)
1805
+ ```
1806
+ | 占位符 | 可选值 | 说明 |
1807
+ |--------|--------|------|
1808
+ | `<actual_field/>` | `eps` | 实际值 |
1809
+ | `<estimate_field/>` | `vec_avg(anl4_eps_mean)` | 预测值 |
1810
+ | `<window/>` | `5`, `10` | 事件有效窗口 |
1811
+
1812
+ ---
1813
+
1814
+ ## 第十二部分:信号处理模板 (TPL-1101 ~ TPL-1120)
1815
+
1816
+ ### TPL-1101: 黄金比例幂变换
1817
+ ```
1818
+ 模板: signed_power(<alpha/>, 0.618)
1819
+ ```
1820
+ | 占位符 | 可选值 | 说明 |
1821
+ |--------|--------|------|
1822
+ | `<alpha/>` | 主信号表达式 | 原始Alpha |
1823
+
1824
+ **其他幂次**:
1825
+ ```
1826
+ signed_power(<alpha/>, 0.5) # 平方根
1827
+ signed_power(<alpha/>, 2) # 平方增强
1828
+ ```
1829
+
1830
+ ---
1831
+
1832
+ ### TPL-1102: 尾部截断模板
1833
+ ```
1834
+ 模板: right_tail(<alpha/>, minimum=<min/>)
1835
+ ```
1836
+ | 占位符 | 可选值 | 说明 |
1837
+ |--------|--------|------|
1838
+ | `<alpha/>` | 主信号 | 原始Alpha |
1839
+ | `<min/>` | `0`, `0.1` | 最小阈值 |
1840
+
1841
+ **左尾版**:
1842
+ ```
1843
+ 模板: left_tail(<alpha/>, maximum=<max/>)
1844
+ ```
1845
+
1846
+ ---
1847
+
1848
+ ### TPL-1103: Clamp边界限制
1849
+ ```
1850
+ 模板: clamp(<alpha/>, lower=<low/>, upper=<high/>)
1851
+ ```
1852
+ | 占位符 | 可选值 | 说明 |
1853
+ |--------|--------|------|
1854
+ | `<alpha/>` | 主信号 | 原始Alpha |
1855
+ | `<low/>` | `-1`, `-0.5` | 下界 |
1856
+ | `<high/>` | `1`, `0.5` | 上界 |
1857
+
1858
+ ---
1859
+
1860
+ ### TPL-1104: 分数映射模板
1861
+ ```
1862
+ 模板: fraction(<alpha/>)
1863
+ ```
1864
+ | 占位符 | 可选值 | 说明 |
1865
+ |--------|--------|------|
1866
+ | `<alpha/>` | 主信号 | 原始Alpha |
1867
+
1868
+ **说明**: 将连续变量映射到分布内的相对位置
1869
+
1870
+ ---
1871
+
1872
+ ### TPL-1105: NaN外推模板
1873
+ ```
1874
+ 模板: nan_out(<field/>, lower=<low/>, upper=<high/>)
1875
+ ```
1876
+ | 占位符 | 可选值 | 说明 |
1877
+ |--------|--------|------|
1878
+ | `<field/>` | 任意字段 | 数据字段 |
1879
+ | `<low/>` | `-3`, `-5` | 下界 |
1880
+ | `<high/>` | `3`, `5` | 上界 |
1881
+
1882
+ **说明**: 将超出范围的值替换为NaN
1883
+
1884
+ ---
1885
+
1886
+ ### TPL-1106: Purify数据清洗
1887
+ ```
1888
+ 模板: purify(<field/>)
1889
+ ```
1890
+ | 占位符 | 可选值 | 说明 |
1891
+ |--------|--------|------|
1892
+ | `<field/>` | 任意字段 | 需要清洗的数据 |
1893
+
1894
+ **说明**: 自动化数据清洗,减少噪声和异常值
1895
+
1896
+ ---
1897
+
1898
+ ### TPL-1107: 条件保留模板
1899
+ ```
1900
+ 模板: keep(<field/>, <condition/>, period=<d/>)
1901
+ ```
1902
+ | 占位符 | 可选值 | 说明 |
1903
+ |--------|--------|------|
1904
+ | `<field/>` | 任意字段 | 数据字段 |
1905
+ | `<condition/>` | `<field/> > 0` | 保留条件 |
1906
+ | `<d/>` | `3`, `5`, `10` | 滚动窗口 |
1907
+
1908
+ **示例**:
1909
+ ```
1910
+ keep(returns, returns > 0, period=3) # 只保留正收益
1911
+ ```
1912
+
1913
+ ---
1914
+
1915
+ ### TPL-1108: 缩放降维模板
1916
+ ```
1917
+ 模板: -scale_down(<ts_op/>(<field/>, <d1/>), constant=<c/>)
1918
+ ```
1919
+ | 占位符 | 可选值 | 说明 |
1920
+ |--------|--------|------|
1921
+ | `<ts_op/>` | `ts_mean`, `ts_rank` | 时序操作 |
1922
+ | `<field/>` | `returns`, 任意字段 | 数据字段 |
1923
+ | `<d1/>` | `2`, `5` | 窗口 |
1924
+ | `<c/>` | `0.1`, `0.05` | 缩放常数 |
1925
+
1926
+ ---
1927
+
1928
+ ### TPL-1109: Truncate截断模板
1929
+ ```
1930
+ 模板: truncate(<alpha/>, maxPercent=<percent/>)
1931
+ ```
1932
+ | 占位符 | 可选值 | 说明 |
1933
+ |--------|--------|------|
1934
+ | `<alpha/>` | 主信号 | 原始Alpha |
1935
+ | `<percent/>` | `0.01`, `0.05` | 截断百分比 |
1936
+
1937
+ ---
1938
+
1939
+ ### TPL-1110: 组合Normalize模板
1940
+ ```
1941
+ 模板: group_normalize(<alpha/>, <group/>)
1942
+ ```
1943
+ | 占位符 | 可选值 | 说明 |
1944
+ |--------|--------|------|
1945
+ | `<alpha/>` | 主信号 | 原始Alpha |
1946
+ | `<group/>` | `sector`, `industry` | 分组 |
1947
+
1948
+ **等价公式**: `alpha / group_sum(abs(alpha), group)`
1949
+
1950
+ ---
1951
+
1952
+ ## 第十三部分:Turnover控制模板 (TPL-1201 ~ TPL-1215)
1953
+
1954
+ ### TPL-1201: 目标换手率Hump
1955
+ ```
1956
+ 模板: ts_target_tvr_hump(<alpha/>, lambda_min=0, lambda_max=1, target_tvr=<target/>)
1957
+ ```
1958
+ | 占位符 | 可选值 | 说明 |
1959
+ |--------|--------|------|
1960
+ | `<alpha/>` | 主信号 | 原始Alpha |
1961
+ | `<target/>` | `0.1`, `0.15`, `0.2` | 目标换手率 |
1962
+
1963
+ ---
1964
+
1965
+ ### TPL-1202: Delta限制换手率
1966
+ ```
1967
+ 模板: ts_target_tvr_delta_limit(<alpha/>, <factor/>, lambda_min=0, lambda_max=1, target_tvr=<target/>)
1968
+ ```
1969
+ | 占位符 | 可选值 | 说明 |
1970
+ |--------|--------|------|
1971
+ | `<alpha/>` | 主信号 | 原始Alpha |
1972
+ | `<factor/>` | 辅助因子 | 限制因子 |
1973
+ | `<target/>` | `0.1`, `0.15` | 目标换手率 |
1974
+
1975
+ ---
1976
+
1977
+ ### TPL-1203: Hump衰减组合
1978
+ ```
1979
+ 模板: hump_decay(<alpha/>, hump=<h/>)
1980
+ ```
1981
+ | 占位符 | 可选值 | 说明 |
1982
+ |--------|--------|------|
1983
+ | `<alpha/>` | 主信号 | 原始Alpha |
1984
+ | `<h/>` | `0.001`, `0.01` | Hump参数 |
1985
+
1986
+ **嵌套版**:
1987
+ ```
1988
+ hump(hump_decay(<alpha/>, hump=0.001))
1989
+ ```
1990
+
1991
+ ---
1992
+
1993
+ ### TPL-1204: 平均+Hump模板
1994
+ ```
1995
+ 模板: -ts_mean(ts_target_tvr_hump(group_rank(<field/>, country), lambda_min=0, lambda_max=1, target_tvr=<target/>), <d/>)
1996
+ ```
1997
+ | 占位符 | 可选值 | 说明 |
1998
+ |--------|--------|------|
1999
+ | `<field/>` | 任意字段 | 数据字段 |
2000
+ | `<target/>` | `0.1` | 目标换手率 |
2001
+ | `<d/>` | `5`, `10` | 平均窗口 |
2002
+
2003
+ ---
2004
+
2005
+ ### TPL-1205: 简单Hump模板
2006
+ ```
2007
+ 模板: hump(<alpha/>, hump=<h/>)
2008
+ ```
2009
+ | 占位符 | 可选值 | 说明 |
2010
+ |--------|--------|------|
2011
+ | `<alpha/>` | 主信号 | 原始Alpha |
2012
+ | `<h/>` | `0.01`, `0.001`, `0.0001` | Hump参数 |
2013
+
2014
+ **示例**:
2015
+ ```
2016
+ hump(-ts_delta(close, 5), hump=0.01)
2017
+ ```
2018
+
2019
+ ---
2020
+
2021
+ ## 第十四部分:回填与覆盖模板 (TPL-1301 ~ TPL-1315)
2022
+
2023
+ ### TPL-1301: 分组回填模板
2024
+ ```
2025
+ 模板: group_backfill(<field/>, <group/>)
2026
+ ```
2027
+ | 占位符 | 可选值 | 说明 |
2028
+ |--------|--------|------|
2029
+ | `<field/>` | 任意字段 | 需要回填的字段 |
2030
+ | `<group/>` | `sector`, `industry`, `market` | 分组字段 |
2031
+
2032
+ **说明**: 使用组内最近值填充NaN
2033
+
2034
+ ---
2035
+
2036
+ ### TPL-1302: 嵌套回填排名
2037
+ ```
2038
+ 模板: rank(group_backfill(<field/>, <group/>))
2039
+ ```
2040
+ | 占位符 | 可选值 | 说明 |
2041
+ |--------|--------|------|
2042
+ | `<field/>` | 任意字段 | 数据字段 |
2043
+ | `<group/>` | `sector`, `industry` | 分组 |
2044
+
2045
+ ---
2046
+
2047
+ ### TPL-1303: 覆盖度过滤
2048
+ ```
2049
+ 模板: group_count(is_nan(<field/>), market) > <threshold/> ? <alpha/> : nan
2050
+ ```
2051
+ | 占位符 | 可选值 | 说明 |
2052
+ |--------|--------|------|
2053
+ | `<field/>` | 任意字段 | 检测字段 |
2054
+ | `<threshold/>` | `40`, `50` | 最小覆盖数 |
2055
+ | `<alpha/>` | 主信号 | 原始Alpha |
2056
+
2057
+ ---
2058
+
2059
+ ### TPL-1304: NaN替换模板
2060
+ ```
2061
+ 模板: if_else(is_not_nan(<field/>), <field/>, <default/>)
2062
+ ```
2063
+ | 占位符 | 可选值 | 说明 |
2064
+ |--------|--------|------|
2065
+ | `<field/>` | 任意字段 | 数据字段 |
2066
+ | `<default/>` | `0`, `0.5`, `nan` | 默认值 |
2067
+
2068
+ ---
2069
+
2070
+ ### TPL-1305: 综合数据清洗
2071
+ ```
2072
+ 模板: <ts_op/>(winsorize(group_backfill(ts_backfill(<field/>, <d1/>), <group/>), std=<std/>), <d2/>)
2073
+ ```
2074
+ | 占位符 | 可选值 | 说明 |
2075
+ |--------|--------|------|
2076
+ | `<ts_op/>` | `ts_rank`, `ts_zscore` | 时序操作 |
2077
+ | `<field/>` | 低频字段 | 数据字段 |
2078
+ | `<d1/>` | `120`, `180` | 时序回填窗口 |
2079
+ | `<group/>` | `sector`, `industry` | 分组回填 |
2080
+ | `<std/>` | `4` | winsorize参数 |
2081
+ | `<d2/>` | `66`, `126` | 操作窗口 |
2082
+
2083
+ ---
2084
+
2085
+ ## 第十五部分:组合提取模板 (TPL-1401 ~ TPL-1415)
2086
+
2087
+ ### TPL-1401: group_extra填补模板
2088
+ ```
2089
+ 模板: group_extra(<field/>, <weight/>, <group/>)
2090
+ ```
2091
+ | 占位符 | 可选值 | 说明 |
2092
+ |--------|--------|------|
2093
+ | `<field/>` | 任意字段 | 数据字段 |
2094
+ | `<weight/>` | `0.5`, `1` | 权重 |
2095
+ | `<group/>` | `densify(industry)`, `sector` | 分组 |
2096
+
2097
+ **说明**: 用组均值填补缺失值
2098
+
2099
+ ---
2100
+
2101
+ ### TPL-1402: 组合提取sigmoid
2102
+ ```
2103
+ 模板: scale(group_extra(ts_sum(sigmoid(ts_backfill(<field/>, <d1/>)), <d2/>) - ts_sum(sigmoid(ts_backfill(<field/>, <d1/>)), <d2/>), 0.5, densify(industry)))
2104
+ ```
2105
+ | 占位符 | 可选值 | 说明 |
2106
+ |--------|--------|------|
2107
+ | `<field/>` | 任意字段 | 数据字段 |
2108
+ | `<d1/>` | `180` | 回填窗口 |
2109
+ | `<d2/>` | `3` | 求和窗口 |
2110
+
2111
+ ---
2112
+
2113
+ ### TPL-1403: PnL反馈模板
2114
+ ```
2115
+ 模板: if_else(inst_pnl(<alpha/>) > <threshold/>, <alpha/>, nan)
2116
+ ```
2117
+ | 占位符 | 可选值 | 说明 |
2118
+ |--------|--------|------|
2119
+ | `<alpha/>` | 主信号 | 原始Alpha |
2120
+ | `<threshold/>` | `0`, `-0.05` | PnL阈值 |
2121
+
2122
+ **说明**: 基于单标的PnL进行条件交易
2123
+
2124
+ ---
2125
+
2126
+ ### TPL-1404: 流动性加权模板
2127
+ ```
2128
+ 模板: <alpha/> * log(volume)
2129
+ ```
2130
+ | 占位符 | 可选值 | 说明 |
2131
+ |--------|--------|------|
2132
+ | `<alpha/>` | 主信号 | 原始Alpha |
2133
+
2134
+ **说明**: 将仓位偏向高流动性股票
2135
+
2136
+ ---
2137
+
2138
+ ### TPL-1405: 市值回归中性化
2139
+ ```
2140
+ 模板: regression_neut(<alpha/>, log(cap))
2141
+ ```
2142
+ | 占位符 | 可选值 | 说明 |
2143
+ |--------|--------|------|
2144
+ | `<alpha/>` | 主信号 | 原始Alpha |
2145
+
2146
+ **说明**: 剥离市值因子影响
2147
+
2148
+ ---
2149
+
2150
+ ## 第十六部分:百分位与分位数模板 (TPL-1501 ~ TPL-1510)
2151
+
2152
+ ### TPL-1501: 时序百分位模板
2153
+ ```
2154
+ 模板: ts_percentage(<field/>, <d/>, percentage=<p/>)
2155
+ ```
2156
+ | 占位符 | 可选值 | 说明 |
2157
+ |--------|--------|------|
2158
+ | `<field/>` | 任意字段 | 数据字段 |
2159
+ | `<d/>` | `22`, `66`, `126` | 窗口 |
2160
+ | `<p/>` | `0.5`, `0.25`, `0.75` | 百分位 |
2161
+
2162
+ ---
2163
+
2164
+ ### TPL-1502: 分位数模板
2165
+ ```
2166
+ 模板: <ts_op/>(ts_quantile(<field/>, <d/>, <q/>), <d2/>)
2167
+ ```
2168
+ | 占位符 | 可选值 | 说明 |
2169
+ |--------|--------|------|
2170
+ | `<ts_op/>` | `rank`, `zscore` | 标准化 |
2171
+ | `<field/>` | 任意字段 | 数据字段 |
2172
+ | `<d/>` | `66`, `126` | 窗口 |
2173
+ | `<q/>` | `0.25`, `0.5`, `0.75` | 分位数 |
2174
+ | `<d2/>` | `22` | 操作窗口 |
2175
+
2176
+ ---
2177
+
2178
+ ### TPL-1503: Max-Min比率模板
2179
+ ```
2180
+ 模板: ts_max_diff(<field/>, <d/>) / ts_av_diff(<field/>, <d/>)
2181
+ ```
2182
+ | 占位符 | 可选值 | 说明 |
2183
+ |--------|--------|------|
2184
+ | `<field/>` | 任意字段 | 数据字段 |
2185
+ | `<d/>` | `22`, `66` | 窗口 |
2186
+
2187
+ ---
2188
+
2189
+ ### TPL-1504: 中位数模板
2190
+ ```
2191
+ 模板: <field/> - ts_median(<field/>, <d/>)
2192
+ ```
2193
+ | 占位符 | 可选值 | 说明 |
2194
+ |--------|--------|------|
2195
+ | `<field/>` | 任意字段 | 数据字段 |
2196
+ | `<d/>` | `22`, `66`, `252` | 窗口 |
2197
+
2198
+ ---
2199
+
2200
+ ### TPL-1505: 累积乘积模板
2201
+ ```
2202
+ 模板: ts_product(1 + <ret_field/>, <d/>)
2203
+ ```
2204
+ | 占位符 | 可选值 | 说明 |
2205
+ |--------|--------|------|
2206
+ | `<ret_field/>` | `returns`, 收益率字段 | 收益字段 |
2207
+ | `<d/>` | `5`, `22`, `66` | 窗口 |
2208
+
2209
+ **说明**: 计算累积收益
2210
+
2211
+ ---
2212
+
2213
+ ## 第十七部分:实战表达式模板 (TPL-1601 ~ TPL-1700)
2214
+
2215
+ **说明**: 以下模板从社区高票帖子中提取,为实际验证过的表达式格式。
2216
+
2217
+ ### TPL-1601: ts_max/ts_min替代公式
2218
+ ```
2219
+ 模板: {data} - ts_max_diff({data}, {d}) # 等效于 ts_max
2220
+ 模板: (({data} - ts_max_diff({data}, {d})) * ts_scale({data}, {d}) - {data}) / (ts_scale({data}, {d}) - 1) # 等效于 ts_min
2221
+ ```
2222
+ | 占位符 | 可选值 | 说明 |
2223
+ |--------|--------|------|
2224
+ | `{data}` | 任意MATRIX字段 | 数据字段 |
2225
+ | `{d}` | `22`, `66`, `126` | 窗口 |
2226
+
2227
+ **应用**: 当平台不支持ts_max/ts_min时的替代方案
2228
+
2229
+ ---
2230
+
2231
+ ### TPL-1602: 线性衰减权重公式
2232
+ ```
2233
+ 模板: weight = {d} + ts_step(0); ts_sum({data} * weight, {d}) / ts_sum(weight, {d}) # 等效于 ts_decay_linear
2234
+ ```
2235
+ | 占位符 | 可选值 | 说明 |
2236
+ |--------|--------|------|
2237
+ | `{data}` | 任意字段 | 数据字段 |
2238
+ | `{d}` | `10`, `22`, `66` | 衰减窗口 |
2239
+
2240
+ ---
2241
+
2242
+ ### TPL-1603: 组归一化公式
2243
+ ```
2244
+ 模板: {data} / group_sum(abs({data}), {group}) # 等效于 group_normalize
2245
+ ```
2246
+ | 占位符 | 可选值 | 说明 |
2247
+ |--------|--------|------|
2248
+ | `{data}` | 任意字段 | 数据字段 |
2249
+ | `{group}` | `industry`, `sector` | 分组字段 |
2250
+
2251
+ ---
2252
+
2253
+ ### TPL-1604: IR+峰度组合模板
2254
+ ```
2255
+ 模板:
2256
+ rank_data = rank({field});
2257
+ ts_ir(rank_data, {d}) + ts_kurtosis(rank_data, {d})
2258
+ ```
2259
+ | 占位符 | 可选值 | 说明 |
2260
+ |--------|--------|------|
2261
+ | `{field}` | `volume`, `returns`, 任意字段 | 数据字段 |
2262
+ | `{d}` | `22`, `66` | 窗口 |
2263
+
2264
+ **说明**: IR和峰度组合捕捉信号强度和分布特征
2265
+
2266
+ ---
2267
+
2268
+ ### TPL-1605: VWAP相关性信号
2269
+ ```
2270
+ 模板: returns > -{threshold} ? (ts_ir(ts_corr(ts_returns(vwap, 1), ts_delay(group_neutralize({field}, market), {d1}), {d2}), {d2})) : -1
2271
+ ```
2272
+ | 占位符 | 可选值 | 说明 |
2273
+ |--------|--------|------|
2274
+ | `{field}` | 任意数据字段 | 信号字段 |
2275
+ | `{threshold}` | `0.1`, `0.05` | 收益过滤阈值 |
2276
+ | `{d1}` | `30`, `60` | 延迟窗口 |
2277
+ | `{d2}` | `90`, `120` | 相关性窗口 |
2278
+
2279
+ ---
2280
+
2281
+ ### TPL-1606: 球队硬币因子 (ballteam_coin)
2282
+ ```
2283
+ 模板:
2284
+ # 基础版
2285
+ rank(ballteam_coin)
2286
+
2287
+ # 市值中性化版
2288
+ group_neutralize(rank(ballteam_coin), bucket(rank(assets), range='0.1,1,0.1'))
2289
+ ```
2290
+ **说明**: 经典球队vs硬币因子,用于捕捉收益持续性
2291
+
2292
+ ---
2293
+
2294
+ ### TPL-1607: 偏度因子模板
2295
+ ```
2296
+ 模板: -group_rank(ts_skewness(returns, {d}), {group})
2297
+ ```
2298
+ | 占位符 | 可选值 | 说明 |
2299
+ |--------|--------|------|
2300
+ | `{d}` | `22`, `66`, `126` | 偏度计算窗口 |
2301
+ | `{group}` | `sector`, `industry` | 分组 |
2302
+
2303
+ **说明**: 负偏度股票往往表现更好
2304
+
2305
+ ---
2306
+
2307
+ ### TPL-1608: 熵信号模板
2308
+ ```
2309
+ 模板: ts_zscore({field}, {d1}) * ts_entropy({field}, {d2})
2310
+ ```
2311
+ | 占位符 | 可选值 | 说明 |
2312
+ |--------|--------|------|
2313
+ | `{field}` | `returns`, 任意字段 | 信号字段 |
2314
+ | `{d1}` | `14`, `22` | zscore窗口 |
2315
+ | `{d2}` | `14`, `22` | 熵窗口 |
2316
+
2317
+ **说明**: 结合标准化和不确定性度量
2318
+
2319
+ ---
2320
+
2321
+ ### TPL-1609: 分析师动量短长差模板
2322
+ ```
2323
+ 模板: log(ts_mean(anl4_{data}_{stats}, {d_short})) - log(ts_mean(anl4_{data}_{stats}, {d_long}))
2324
+ ```
2325
+ | 占位符 | 可选值 | 说明 |
2326
+ |--------|--------|------|
2327
+ | `{data}` | `eps`, `revenue`, `netprofit` | 分析师预测类型 |
2328
+ | `{stats}` | `mean`, `low`, `high` | 统计量类型 |
2329
+ | `{d_short}` | `20`, `44` | 短期窗口 |
2330
+ | `{d_long}` | `44`, `126` | 长期窗口 |
2331
+
2332
+ ---
2333
+
2334
+ ### TPL-1610: 目标换手率分组排名
2335
+ ```
2336
+ 模板: -ts_mean(ts_target_tvr_hump(group_rank({field}, country), lambda_min=0, lambda_max=1, target_tvr={target}), {d})
2337
+ ```
2338
+ | 占位符 | 可选值 | 说明 |
2339
+ |--------|--------|------|
2340
+ | `{field}` | 任意字段 | 数据字段 |
2341
+ | `{target}` | `0.1`, `0.15` | 目标换手率 |
2342
+ | `{d}` | `5`, `10` | 平均窗口 |
2343
+
2344
+ ---
2345
+
2346
+ ### TPL-1611: 最大差/均值差比率
2347
+ ```
2348
+ 模板: ts_max_diff({field}, {d}) / ts_av_diff({field}, {d})
2349
+ ```
2350
+ | 占位符 | 可选值 | 说明 |
2351
+ |--------|--------|------|
2352
+ | `{field}` | 任意字段 | 数据字段 |
2353
+ | `{d}` | `22`, `66` | 窗口 |
2354
+
2355
+ **说明**: 捕捉极端值相对于平均变化的幅度
2356
+
2357
+ ---
2358
+
2359
+ ### TPL-1612: 模型数据三层嵌套
2360
+ ```
2361
+ 模板:
2362
+ a = rank(group_rank(ts_rank(ts_backfill({model_field}, 5), 5), sta1_top3000c20));
2363
+ trade_when(rank(a) > 0.03, -zscore(ts_zscore({model_field}, 25)) * a, 0.25 - rank(a))
2364
+ ```
2365
+ | 占位符 | 可选值 | 说明 |
2366
+ |--------|--------|------|
2367
+ | `{model_field}` | `mdl175_01icc`, `mdl175_01dtsv` | 模型字段 |
2368
+
2369
+ ---
2370
+
2371
+ ### TPL-1613: 量价触发条件交易
2372
+ ```
2373
+ 模板:
2374
+ triggerTradeexp = (ts_arg_max(volume, {d}) < 1) && (volume > ts_sum(volume, {d}) / {d});
2375
+ triggerExitexp = -1;
2376
+ alphaexp = -rank(ts_delta(close, 2));
2377
+ trade_when(triggerTradeexp, alphaexp, triggerExitexp)
2378
+ ```
2379
+ | 占位符 | 可选值 | 说明 |
2380
+ |--------|--------|------|
2381
+ | `{d}` | `5`, `10` | 窗口 |
2382
+
2383
+ **说明**: 今日成交量为近期最大且高于均值时交易
2384
+
2385
+ ---
2386
+
2387
+ ### TPL-1614: 情绪成交量交易
2388
+ ```
2389
+ 模板:
2390
+ sent_vol = vec_sum(scl12_alltype_buzzvec);
2391
+ trade_when(rank(sent_vol) > 0.95, -zscore(scl12_buzz) * sent_vol, -1)
2392
+ ```
2393
+ **说明**: 高情绪量时反向交易情绪
2394
+
2395
+ ---
2396
+
2397
+ ### TPL-1615: 双层中性化模板
2398
+ ```
2399
+ 模板:
2400
+ a = ts_zscore({field}, 252);
2401
+ a1 = group_neutralize(a, industry);
2402
+ a2 = group_neutralize(a1, bucket(rank(cap), range='0.1,1,0.1'))
2403
+ ```
2404
+ | 占位符 | 可选值 | 说明 |
2405
+ |--------|--------|------|
2406
+ | `{field}` | 任意字段 | 数据字段 |
2407
+
2408
+ **说明**: 先行业后市值的双重中性化
2409
+
2410
+ ---
2411
+
2412
+ ### TPL-1616: 相关性计算公式
2413
+ ```
2414
+ 模板:
2415
+ a = {field1};
2416
+ b = {field2};
2417
+ p = {d};
2418
+ c = ts_mean(ts_av_diff(a, p) * ts_av_diff(b, p), p);
2419
+ c / ts_std_dev(a, p) / ts_std_dev(b, p) # 近似 ts_corr
2420
+ ```
2421
+ | 占位符 | 可选值 | 说明 |
2422
+ |--------|--------|------|
2423
+ | `{field1}` | `close`, `returns` | 第一字段 |
2424
+ | `{field2}` | `volume`, `open` | 第二字段 |
2425
+ | `{d}` | `5`, `22` | 窗口 |
2426
+
2427
+ ---
2428
+
2429
+ ### TPL-1617: 回归中性化双因子
2430
+ ```
2431
+ 模板:
2432
+ afr = vec_avg({analyst_field});
2433
+ short_mom = ts_mean(returns - group_mean(returns, 1, market), {d_short});
2434
+ long_mom = ts_delay(ts_mean(returns - group_mean(returns, 1, market), {d_long}), {d_long});
2435
+ regression_neut(regression_neut(afr, short_mom), long_mom)
2436
+ ```
2437
+ | 占位符 | 可选值 | 说明 |
2438
+ |--------|--------|------|
2439
+ | `{analyst_field}` | 分析师VECTOR字段 | 分析师数据 |
2440
+ | `{d_short}` | `5`, `10` | 短期动量窗口 |
2441
+ | `{d_long}` | `20`, `22` | 长期动量窗口 |
2442
+
2443
+ **说明**: 剥离短期和长期动量后的分析师因子
2444
+
2445
+ ---
2446
+
2447
+ ### TPL-1618: 回归斜率趋势检测
2448
+ ```
2449
+ 模板: ts_regression(ts_zscore({field}, {d}), ts_step(1), {d}, rettype=2)
2450
+ ```
2451
+ | 占位符 | 可选值 | 说明 |
2452
+ |--------|--------|------|
2453
+ | `{field}` | 任意MATRIX字段 | 数据字段 |
2454
+ | `{d}` | `252`, `500` | 窗口 |
2455
+
2456
+ **说明**: rettype=2返回回归斜率,检测长期趋势
2457
+
2458
+ ---
2459
+
2460
+ ### TPL-1619: 三因子乘积组合
2461
+ ```
2462
+ 模板:
2463
+ my_group = market;
2464
+ rank(
2465
+ group_rank(ts_decay_linear(volume / ts_sum(volume, 252), 10), my_group) *
2466
+ group_rank(ts_rank(vec_avg({fundamental}), {d}), my_group) *
2467
+ group_rank(-ts_delta(close, 5), my_group)
2468
+ )
2469
+ ```
2470
+ | 占位符 | 可选值 | 说明 |
2471
+ |--------|--------|------|
2472
+ | `{fundamental}` | 基本面VECTOR字段 | 基本面数据 |
2473
+ | `{d}` | `252`, `504` | 排名窗口 |
2474
+
2475
+ **说明**: 成交量趋势 × 基本面排名 × 价格反转
2476
+
2477
+ ---
2478
+
2479
+ ### TPL-1620: 波动率条件反转
2480
+ ```
2481
+ 模板:
2482
+ vol = ts_std_dev(returns, {d});
2483
+ vol_mean = group_mean(vol, 1, market);
2484
+ flip_ret = if_else(vol < vol_mean, -returns, returns);
2485
+ -ts_mean(flip_ret, {d})
2486
+ ```
2487
+ | 占位符 | 可选值 | 说明 |
2488
+ |--------|--------|------|
2489
+ | `{d}` | `20`, `22` | 窗口 |
2490
+
2491
+ **说明**: 低波动做反转,高波动做动量
2492
+
2493
+ ---
2494
+
2495
+ ### TPL-1621: 恐惧指标复合
2496
+ ```
2497
+ 模板:
2498
+ fear = ts_mean(
2499
+ abs(returns - group_mean(returns, 1, market)) /
2500
+ (abs(returns) + abs(group_mean(returns, 1, market)) + 0.1),
2501
+ {d}
2502
+ );
2503
+ -group_neutralize(fear * {signal}, bucket(rank(cap), range='0.1,1,0.1'))
2504
+ ```
2505
+ | 占位符 | 可选值 | 说明 |
2506
+ |--------|--------|------|
2507
+ | `{d}` | `20`, `22` | 窗口 |
2508
+ | `{signal}` | 主信号 | 待组合信号 |
2509
+
2510
+ ---
2511
+
2512
+ ### TPL-1622: 财务质量单因子
2513
+ ```
2514
+ 模板: group_neutralize(rank({fundamental_field}), bucket(rank(cap), range='0,1,0.1'))
2515
+ ```
2516
+ | 占位符 | 可选值 | 说明 |
2517
+ |--------|--------|------|
2518
+ | `{fundamental_field}` | `roe`, `roa`, `net_income/assets` | 财务质量指标 |
2519
+
2520
+ ---
2521
+
2522
+ ### TPL-1623: 老虎哥回归模板
2523
+ ```
2524
+ 模板: group_rank(ts_regression(ts_zscore({field1}, {d}), ts_zscore(vec_sum({field2}), {d}), {d}), densify(sector))
2525
+ ```
2526
+ | 占位符 | 可选值 | 说明 |
2527
+ |--------|--------|------|
2528
+ | `{field1}` | 任意MATRIX字段 | Y变量 |
2529
+ | `{field2}` | 任意VECTOR字段 | X变量 |
2530
+ | `{d}` | `252`, `504` | 回归窗口 |
2531
+
2532
+ ---
2533
+
2534
+ ### TPL-1624: 综合数据清洗模板
2535
+ ```
2536
+ 模板: ts_decay_linear(-densify(zscore(winsorize(ts_backfill({field}, 115), std=4))), 10)
2537
+ ```
2538
+ | 占位符 | 可选值 | 说明 |
2539
+ |--------|--------|------|
2540
+ | `{field}` | 低频字段如 `anl4_adjusted_netincome_ft` | 需要处理的字段 |
2541
+
2542
+ ---
2543
+
2544
+ ### TPL-1625: 延迟最大值位置模板
2545
+ ```
2546
+ 模板: ts_max({field}, {d}) = ts_delay({field}, ts_arg_max({field}, {d})) # 等效公式
2547
+ ```
2548
+ | 占位符 | 可选值 | 说明 |
2549
+ |--------|--------|------|
2550
+ | `{field}` | 任意字段 | 数据字段 |
2551
+ | `{d}` | `22`, `66` | 窗口 |
2552
+
2553
+ ---
2554
+
2555
+ ### TPL-1626: 数据探索通用模板
2556
+ ```
2557
+ 模板: zscore(ts_delta(rank(ts_zscore({field}, {d1})), {d2}))
2558
+ ```
2559
+ | 占位符 | 可选值 | 说明 |
2560
+ |--------|--------|------|
2561
+ | `{field}` | 任意MATRIX字段 | 待探索数据字段 |
2562
+ | `{d1}` | `60`, `126`, `252` | zscore窗口 |
2563
+ | `{d2}` | `5`, `10`, `22` | delta窗口 |
2564
+
2565
+ **说明**: 顾问推荐的新数据探索模板,可替换op和时间参数
2566
+
2567
+ ---
2568
+
2569
+ ### TPL-1627: 自定义衰减权重模板
2570
+ ```
2571
+ 模板:
2572
+ weight = {d} + ts_step(0); # 线性递增权重
2573
+ ts_sum({data} * weight, {d}) / ts_sum(weight, {d}) # 加权平均
2574
+
2575
+ # 替代版 (ts_step递减)
2576
+ ts_sum({alpha} * ts_step(1), {d}) / ts_sum(ts_step(1), {d})
2577
+ ```
2578
+ | 占位符 | 可选值 | 说明 |
2579
+ |--------|--------|------|
2580
+ | `{data}` | 任意字段 | 数据字段 |
2581
+ | `{alpha}` | 主信号 | 原始Alpha |
2582
+ | `{d}` | `10`, `22`, `66` | 衰减窗口 |
2583
+
2584
+ **说明**: 当没有ts_decay_linear权限时的替代方案
2585
+
2586
+ ---
2587
+
2588
+ ### TPL-1628: log_diff相对增长模板
2589
+ ```
2590
+ 模板: group_rank(log_diff({field}), {group})
2591
+ ```
2592
+ | 占位符 | 可选值 | 说明 |
2593
+ |--------|--------|------|
2594
+ | `{field}` | 财务指标如 `sales`, `eps`, `assets` | 数据字段 |
2595
+ | `{group}` | `sector`, `industry` | 分组 |
2596
+
2597
+ **说明**: 检测相对增长率,对乘性变化更敏感
2598
+
2599
+ ---
2600
+
2601
+ ### TPL-1629: ts_product累积收益模板
2602
+ ```
2603
+ 模板: group_rank(ts_product(1 + {ret_field}, {d}), {group})
2604
+ ```
2605
+ | 占位符 | 可选值 | 说明 |
2606
+ |--------|--------|------|
2607
+ | `{ret_field}` | `returns`, 收益率字段 | 收益字段 |
2608
+ | `{d}` | `22`, `66`, `126` | 窗口 |
2609
+ | `{group}` | `sector`, `industry` | 分组 |
2610
+
2611
+ **说明**: 计算累积收益排名
2612
+
2613
+ ---
2614
+
2615
+ ### TPL-1630: ts_percentage阈值模板
2616
+ ```
2617
+ 模板:
2618
+ high_threshold = ts_percentage({field}, {d}, percentage=0.5);
2619
+ low_threshold = ts_percentage({field}, {d}, percentage=0.5);
2620
+ {signal}
2621
+ ```
2622
+ | 占位符 | 可选值 | 说明 |
2623
+ |--------|--------|------|
2624
+ | `{field}` | `close`, 价格字段 | 阈值计算字段 |
2625
+ | `{d}` | `22`, `66` | 窗口 |
2626
+ | `{signal}` | 主信号 | 条件信号 |
2627
+
2628
+ **说明**: 用于震荡带突破策略的阈值构建
2629
+
2630
+ ---
2631
+
2632
+ ### TPL-1631: 动量反转切换模板
2633
+ ```
2634
+ 模板:
2635
+ mom = ts_sum(returns, {d_long}) - ts_sum(returns, {d_short});
2636
+ reversal = -ts_delta(close, {d_short});
2637
+ if_else(ts_rank(ts_std_dev(returns, {d_short}), {d_long}) > 0.5, mom, reversal)
2638
+ ```
2639
+ | 占位符 | 可选值 | 说明 |
2640
+ |--------|--------|------|
2641
+ | `{d_short}` | `5`, `10` | 短期窗口 |
2642
+ | `{d_long}` | `22`, `66` | 长期窗口 |
2643
+
2644
+ **说明**: 高波动环境用动量,低波动环境用反转
2645
+
2646
+ ---
2647
+
2648
+ ### TPL-1632: 市场收益率近似模板 (CHN)
2649
+ ```
2650
+ 模板:
2651
+ value = rank(cap) > 0.9 ? cap : 0;
2652
+ market_return = group_sum(returns * value, country) / group_sum(value, country);
2653
+ market_return
2654
+ ```
2655
+ **说明**: 用市值加权近似沪深300指数收益率,设置neutralization=NONE, decay=0
2656
+
2657
+ ---
2658
+
2659
+ ### TPL-1633: Beta回归中性化模板
2660
+ ```
2661
+ 模板:
2662
+ market_return = group_mean(returns, 1, market);
2663
+ ts_regression({field}, market_return, {d}) # 返回残差(Y - E[Y])
2664
+ ```
2665
+ | 占位符 | 可选值 | 说明 |
2666
+ |--------|--------|------|
2667
+ | `{field}` | 任意MATRIX字段 | 待中性化字段 |
2668
+ | `{d}` | `126`, `252` | 回归窗口 |
2669
+
2670
+ **说明**: 使用一元线性回归剥离市场因子
2671
+
2672
+ ---
2673
+
2674
+ ### TPL-1634: ts_moment高阶矩k值模板
2675
+ ```
2676
+ 模板: ts_moment({field}, {d}, k={k})
2677
+
2678
+ k=2: 方差 (等价于 ts_std_dev^2)
2679
+ k=3: 偏度 (等价于 ts_skewness)
2680
+ k=4: 峰度 (等价于 ts_kurtosis)
2681
+ ```
2682
+ | 占位符 | 可选值 | 说明 |
2683
+ |--------|--------|------|
2684
+ | `{field}` | 任意MATRIX字段 | 数据字段 |
2685
+ | `{d}` | `22`, `66`, `126` | 窗口 |
2686
+ | `{k}` | `2`, `3`, `4` | 阶数 |
2687
+
2688
+ ---
2689
+
2690
+ ### TPL-1635: 龙头股因子增强模板
2691
+ ```
2692
+ 模板: sigmoid(rank(star_pm_global_rank))
2693
+ ```
2694
+ **说明**: 对龙头股因子进行sigmoid增强
2695
+
2696
+ ---
2697
+
2698
+ ### TPL-1636: purify数据清洗嵌套模板
2699
+ ```
2700
+ 模板: group_rank(ts_rank(purify({field}), {d}), {group})
2701
+ ```
2702
+ | 占位符 | 可选值 | 说明 |
2703
+ |--------|--------|------|
2704
+ | `{field}` | 任意字段 | 待清洗数据 |
2705
+ | `{d}` | `22`, `66` | 排名窗口 |
2706
+ | `{group}` | `sector`, `industry` | 分组 |
2707
+
2708
+ **说明**: purify自动化清洗异常值和噪声
2709
+
2710
+ ---
2711
+
2712
+ ### TPL-1637: 理想振幅因子模板
2713
+ ```
2714
+ 模板:
2715
+ amplitude = (high - low) / close;
2716
+ ideal_amp = ts_percentage(amplitude, {d}, percentage=0.5);
2717
+ group_rank(amplitude - ideal_amp, {group})
2718
+ ```
2719
+ | 占位符 | 可选值 | 说明 |
2720
+ |--------|--------|------|
2721
+ | `{d}` | `22`, `66` | 百分位窗口 |
2722
+ | `{group}` | `sector`, `industry` | 分组 |
2723
+
2724
+ **说明**: 实际振幅偏离理想振幅的程度
2725
+
2726
+ ---
2727
+
2728
+ ### TPL-1638: 异同离差乖离率因子 (MACD风格)
2729
+ ```
2730
+ 模板:
2731
+ ema_short = ts_decay_exp_window({field}, {d_short}, 0.9);
2732
+ ema_long = ts_decay_exp_window({field}, {d_long}, 0.9);
2733
+ dif = ema_short - ema_long;
2734
+ ts_zscore(dif, {d_signal})
2735
+ ```
2736
+ | 占位符 | 可选值 | 说明 |
2737
+ |--------|--------|------|
2738
+ | `{field}` | `close`, 价格字段 | 数据字段 |
2739
+ | `{d_short}` | `12`, `22` | 短期EMA窗口 |
2740
+ | `{d_long}` | `26`, `66` | 长期EMA窗口 |
2741
+ | `{d_signal}` | `9`, `22` | 信号线窗口 |
2742
+
2743
+ ---
2744
+
2745
+ ### TPL-1639: 收益率条件筛选反转
2746
+ ```
2747
+ 模板:
2748
+ high_ret = ts_rank(returns, {d1}) > 0.8;
2749
+ low_ret = ts_rank(returns, {d1}) < 0.2;
2750
+ if_else(high_ret, -returns, if_else(low_ret, returns, 0))
2751
+ ```
2752
+ | 占位符 | 可选值 | 说明 |
2753
+ |--------|--------|------|
2754
+ | `{d1}` | `22`, `66` | 排名窗口 |
2755
+
2756
+ **说明**: 只对极端收益做反转
2757
+
2758
+ ---
2759
+
2760
+ ### TPL-1640: 三阶模板优化版
2761
+ ```
2762
+ 模板: <group_op/>(<ts_op1/>(<ts_op2/>(<field/>, <d1/>), <d2/>), <group/>)
2763
+ ```
2764
+ | 占位符 | 可选值 | 说明 |
2765
+ |--------|--------|------|
2766
+ | `<group_op/>` | `group_rank`, `group_zscore` | 外层分组操作 |
2767
+ | `<ts_op1/>` | `ts_rank`, `ts_delta`, `ts_mean` | 中层时序操作 |
2768
+ | `<ts_op2/>` | `ts_zscore`, `ts_rank`, `ts_ir` | 内层时序操作 |
2769
+ | `<field/>` | 任意字段 | 数据字段 |
2770
+ | `<d1/>` | `60`, `126`, `252` | 内层窗口 |
2771
+ | `<d2/>` | `5`, `22`, `66` | 外层窗口 |
2772
+ | `<group/>` | `sector`, `industry` | 分组 |
2773
+
2774
+ **说明**: 经典三阶嵌套结构,可灵活替换各层操作符
2775
+
2776
+ ---
2777
+
2778
+ ### TPL-1641: ts_entropy信号检测模板
2779
+ ```
2780
+ 模板: ts_entropy({field}, {d})
2781
+ ```
2782
+ | 占位符 | 可选值 | 说明 |
2783
+ |--------|--------|------|
2784
+ | `{field}` | `returns`, `volume`, 任意MATRIX字段 | 数据字段 |
2785
+ | `{d}` | `14`, `22`, `66` | 窗口 |
2786
+
2787
+ **说明**: 衡量时序数据的不确定性,高熵值表示更多随机性
2788
+
2789
+ ---
2790
+
2791
+ ### TPL-1642: 熵+ZScore组合模板
2792
+ ```
2793
+ 模板: ts_zscore({field}, {d}) * ts_entropy({field}, {d})
2794
+ ```
2795
+ | 占位符 | 可选值 | 说明 |
2796
+ |--------|--------|------|
2797
+ | `{field}` | 任意MATRIX字段 | 数据字段 |
2798
+ | `{d}` | `14`, `22` | 窗口 |
2799
+
2800
+ **说明**: RSI超买超卖 + 熵不确定性组合,捕捉可能的修正
2801
+
2802
+ ---
2803
+
2804
+ ### TPL-1643: ts_ir+ts_entropy信号组合
2805
+ ```
2806
+ 模板:
2807
+ signal = ts_ir({field}, {d}) + ts_entropy({field}, {d});
2808
+ group_rank(signal, {group})
2809
+ ```
2810
+ | 占位符 | 可选值 | 说明 |
2811
+ |--------|--------|------|
2812
+ | `{field}` | 任意MATRIX字段 | 数据字段 |
2813
+ | `{d}` | `22`, `66` | 窗口 |
2814
+ | `{group}` | `sector`, `industry` | 分组 |
2815
+
2816
+ **说明**: IR(信息比率)和Entropy组合捕捉信号稳定性和分布特征
2817
+
2818
+ ---
2819
+
2820
+ ### TPL-1644: trade_when市值过滤模板
2821
+ ```
2822
+ 模板: trade_when(rank(cap) > {threshold}, {alpha}, -1)
2823
+ ```
2824
+ | 占位符 | 可选值 | 说明 |
2825
+ |--------|--------|------|
2826
+ | `{threshold}` | `0.3`, `0.5`, `0.7` | 市值排名阈值 |
2827
+ | `{alpha}` | 主信号 | 原始Alpha |
2828
+
2829
+ **说明**: 仅交易大市值股票,降低prod corr
2830
+
2831
+ ---
2832
+
2833
+ ### TPL-1645: trade_when盈利过滤模板
2834
+ ```
2835
+ 模板: trade_when(eps > {threshold} * est_eps, group_rank((eps - est_eps)/est_eps, industry), -1)
2836
+ ```
2837
+ | 占位符 | 可选值 | 说明 |
2838
+ |--------|--------|------|
2839
+ | `{threshold}` | `1.0`, `1.1`, `1.2` | 盈利超预期比例 |
2840
+
2841
+ **说明**: 只交易盈利超预期的股票
2842
+
2843
+ ---
2844
+
2845
+ ### TPL-1646: trade_when量价触发模板
2846
+ ```
2847
+ 模板:
2848
+ triggerTrade = (ts_arg_max(volume, {d}) < 1) && (volume > ts_sum(volume, {d})/{d});
2849
+ trade_when(triggerTrade, {alpha}, -1)
2850
+ ```
2851
+ | 占位符 | 可选值 | 说明 |
2852
+ |--------|--------|------|
2853
+ | `{d}` | `5`, `10` | 判断窗口 |
2854
+ | `{alpha}` | `-rank(ts_delta(close, 2))` | 主信号 |
2855
+
2856
+ **说明**: 量价突破触发条件交易
2857
+
2858
+ ---
2859
+
2860
+ ### TPL-1647: trade_when情绪量过滤模板
2861
+ ```
2862
+ 模板:
2863
+ sent_vol = vec_sum({sentiment_vec});
2864
+ trade_when(rank(sent_vol) > {threshold}, -zscore({sentiment_field}) * sent_vol, -1)
2865
+ ```
2866
+ | 占位符 | 可选值 | 说明 |
2867
+ |--------|--------|------|
2868
+ | `{sentiment_vec}` | `scl12_alltype_buzzvec` 等VECTOR字段 | 情绪向量 |
2869
+ | `{sentiment_field}` | `scl12_buzz`, `scl12_sentiment` | 情绪字段 |
2870
+ | `{threshold}` | `0.9`, `0.95` | 情绪量阈值 |
2871
+
2872
+ **说明**: 高情绪量时反向交易情绪
2873
+
2874
+ ---
2875
+
2876
+ ### TPL-1648: bucket市值分组中性化模板
2877
+ ```
2878
+ 模板:
2879
+ my_group2 = bucket(rank(cap), range='{range}');
2880
+ group_neutralize({alpha}, my_group2)
2881
+ ```
2882
+ | 占位符 | 可选值 | 说明 |
2883
+ |--------|--------|------|
2884
+ | `{range}` | `'0,1,0.1'`, `'0.1,1,0.1'` | 分桶范围 |
2885
+ | `{alpha}` | 主信号 | 原始Alpha |
2886
+
2887
+ **说明**: 按市值分桶进行中性化,去除规模效应
2888
+
2889
+ ---
2890
+
2891
+ ### TPL-1649: group_zscore时序组合模板
2892
+ ```
2893
+ 模板: group_zscore(ts_ir({field}, {d}), {group})
2894
+ ```
2895
+ | 占位符 | 可选值 | 说明 |
2896
+ |--------|--------|------|
2897
+ | `{field}` | 任意MATRIX字段 | 数据字段 |
2898
+ | `{d}` | `22`, `66`, `126` | IR窗口 |
2899
+ | `{group}` | `sector`, `industry` | 分组 |
2900
+
2901
+ **说明**: 在分组内进行IR的Z-score标准化
2902
+
2903
+ ---
2904
+
2905
+ ### TPL-1650: scale+rank+ts组合模板
2906
+ ```
2907
+ 模板: scale(rank(ts_zscore({field}, {d})))
2908
+ ```
2909
+ | 占位符 | 可选值 | 说明 |
2910
+ |--------|--------|------|
2911
+ | `{field}` | 任意MATRIX字段 | 数据字段 |
2912
+ | `{d}` | `66`, `126`, `252` | 窗口 |
2913
+
2914
+ **说明**: 多层标准化处理信号
2915
+
2916
+ ---
2917
+
2918
+ ### TPL-1651: Betting Against Beta模板
2919
+ ```
2920
+ 模板:
2921
+ market_return = group_mean(returns, 1, market);
2922
+ beta = ts_regression(returns, market_return, {d}, rettype=2);
2923
+ -group_rank(beta, industry)
2924
+ ```
2925
+ | 占位符 | 可选值 | 说明 |
2926
+ |--------|--------|------|
2927
+ | `{d}` | `126`, `252` | 回归窗口 |
2928
+
2929
+ **说明**: 反Beta投注因子,做多低Beta股票
2930
+
2931
+ ---
2932
+
2933
+ ### TPL-1652: 跳跃因子模板
2934
+ ```
2935
+ 模板:
2936
+ jump_up = ts_count(returns > ts_std_dev(returns, {d}) * {threshold}, {d});
2937
+ jump_down = ts_count(returns < -ts_std_dev(returns, {d}) * {threshold}, {d});
2938
+ group_rank(jump_down - jump_up, {group})
2939
+ ```
2940
+ | 占位符 | 可选值 | 说明 |
2941
+ |--------|--------|------|
2942
+ | `{d}` | `22`, `66` | 统计窗口 |
2943
+ | `{threshold}` | `2`, `2.5`, `3` | 标准差倍数 |
2944
+ | `{group}` | `sector`, `industry` | 分组 |
2945
+
2946
+ **说明**: 统计尾部跳跃事件的不对称性
2947
+
2948
+ ---
2949
+
2950
+ ### TPL-1653: 量小换手率模板
2951
+ ```
2952
+ 模板:
2953
+ turnover = volume / sharesout;
2954
+ low_turnover = ts_percentage(turnover, {d}, percentage=0.2);
2955
+ group_rank(turnover < low_turnover, {group})
2956
+ ```
2957
+ | 占位符 | 可选值 | 说明 |
2958
+ |--------|--------|------|
2959
+ | `{d}` | `22`, `66` | 百分位窗口 |
2960
+ | `{group}` | `sector`, `industry` | 分组 |
2961
+
2962
+ **说明**: 识别低换手率状态
2963
+
2964
+ ---
2965
+
2966
+ ### TPL-1654: 隔夜收益因子模板
2967
+ ```
2968
+ 模板:
2969
+ overnight_ret = open / ts_delay(close, 1) - 1;
2970
+ group_rank(ts_mean(overnight_ret, {d}), {group})
2971
+ ```
2972
+ | 占位符 | 可选值 | 说明 |
2973
+ |--------|--------|------|
2974
+ | `{d}` | `5`, `22`, `66` | 平均窗口 |
2975
+ | `{group}` | `sector`, `industry` | 分组 |
2976
+
2977
+ **说明**: 隔夜"拉锯战"因子
2978
+
2979
+ ---
2980
+
2981
+ ### TPL-1655: sta1分组三因子模板
2982
+ ```
2983
+ 模板:
2984
+ a = rank(group_rank(ts_rank(ts_backfill({field1}, {d1}), {d2}), sta1_top3000c20));
2985
+ trade_when(rank(a) > {threshold}, -zscore(ts_zscore({field2}, {d3})) * a, {exit_threshold} - rank(a))
2986
+ ```
2987
+ | 占位符 | 可选值 | 说明 |
2988
+ |--------|--------|------|
2989
+ | `{field1}` | 任意字段 | 第一因子字段 |
2990
+ | `{field2}` | 模型字段如`mdl175_01dtsv` | 第二因子字段 |
2991
+ | `{d1}`, `{d2}`, `{d3}` | 各窗口参数 | 时间窗口 |
2992
+ | `{threshold}` | `0.03`, `0.1` | 入场阈值 |
2993
+ | `{exit_threshold}` | `0.25`, `0.5` | 出场阈值 |
2994
+
2995
+ **说明**: 使用sta1预定义分组的复合策略
2996
+
2997
+ ---
2998
+
2999
+ ### TPL-1656: macro泛化模板
3000
+ ```
3001
+ 模板: group_rank(ts_delta(ts_zscore({macro_field}, {d1}), {d2}), country)
3002
+ ```
3003
+ | 占位符 | 可选值 | 说明 |
3004
+ |--------|--------|------|
3005
+ | `{macro_field}` | 宏观数据字段 | 宏观数据 |
3006
+ | `{d1}` | `126`, `252` | zscore窗口 |
3007
+ | `{d2}` | `5`, `22` | delta窗口 |
3008
+
3009
+ **说明**: 基于Labs分析macro的泛化模板
3010
+
3011
+ ---
3012
+
3013
+ ### TPL-1657: ASI broker模板
3014
+ ```
3015
+ 模板:
3016
+ signal = group_rank(ts_rank({broker_field}, {d}), market);
3017
+ trade_when(volume > adv20, signal, -1)
3018
+ ```
3019
+ | 占位符 | 可选值 | 说明 |
3020
+ |--------|--------|------|
3021
+ | `{broker_field}` | broker数据字段 | 券商数据 |
3022
+ | `{d}` | `22`, `66` | 排名窗口 |
3023
+
3024
+ **说明**: ASI区域broker因子,需设置max_trade=ON
3025
+
3026
+ ---
3027
+
3028
+ ### TPL-1658: Earnings超预期模板
3029
+ ```
3030
+ 模板:
3031
+ surprise = (actual_eps - est_eps) / abs(est_eps);
3032
+ group_rank(ts_zscore(surprise, {d}), industry)
3033
+ ```
3034
+ | 占位符 | 可选值 | 说明 |
3035
+ |--------|--------|------|
3036
+ | `{d}` | `66`, `126` | zscore窗口 |
3037
+
3038
+ **说明**: 盈利超预期因子
3039
+
3040
+ ---
3041
+
3042
+ ### TPL-1659: CCI技术指标模板
3043
+ ```
3044
+ 模板:
3045
+ tp = (high + low + close) / 3;
3046
+ cci = (tp - ts_mean(tp, {d})) / (0.015 * ts_mean(abs(tp - ts_mean(tp, {d})), {d}));
3047
+ group_rank(-cci, {group})
3048
+ ```
3049
+ | 占位符 | 可选值 | 说明 |
3050
+ |--------|--------|------|
3051
+ | `{d}` | `14`, `20` | CCI窗口 |
3052
+ | `{group}` | `sector`, `industry` | 分组 |
3053
+
3054
+ **说明**: 商品通道指数(CCI)反转策略
3055
+
3056
+ ---
3057
+
3058
+ ### TPL-1660: 0.618黄金比例幂变换模板
3059
+ ```
3060
+ 模板:
3061
+ power_signal = signed_power({field}, 0.618);
3062
+ group_rank(ts_zscore(power_signal, {d}), {group})
3063
+ ```
3064
+ | 占位符 | 可选值 | 说明 |
3065
+ |--------|--------|------|
3066
+ | `{field}` | 任意MATRIX字段 | 数据字段 |
3067
+ | `{d}` | `66`, `126` | zscore窗口 |
3068
+ | `{group}` | `sector`, `industry` | 分组 |
3069
+
3070
+ **说明**: 使用黄金比例0.618进行幂次变换
3071
+
3072
+ ---
3073
+
3074
+ ## 附录A:标准时间窗口
3075
+
3076
+ | 窗口代号 | 天数 | 含义 |
3077
+ |---------|------|------|
3078
+ | `d_week` | 5 | 一周 |
3079
+ | `d_month` | 22 | 一月 |
3080
+ | `d_quarter` | 66 | 一季度 |
3081
+ | `d_half` | 126 | 半年 |
3082
+ | `d_year` | 252 | 一年 |
3083
+ | `d_2year` | 504 | 两年 |
3084
+
3085
+ **使用规则**:
3086
+ - 反转因子: 短窗口 `{3, 5, 22}`
3087
+ - 动量因子: 中窗口 `{22, 66}`
3088
+ - 长期趋势: 长窗口 `{126, 252, 504}`
3089
+ - 回归/波动: 超长窗口 `{250, 500, 750}`
3090
+
3091
+ ---
3092
+
3093
+ ## 附录B:常用操作符分类
3094
+
3095
+ ### 时序操作符 `<ts_op/>`
3096
+ | 操作符 | 用途 |
3097
+ |--------|------|
3098
+ | `ts_mean` | 移动平均 |
3099
+ | `ts_rank` | 时序排名 |
3100
+ | `ts_delta` | 差分 |
3101
+ | `ts_std_dev` | 移动标准差 |
3102
+ | `ts_ir` | 信息比率 |
3103
+ | `ts_zscore` | 时序Z-score |
3104
+ | `ts_corr` | 滚动相关性 |
3105
+ | `ts_regression` | 滚动回归 |
3106
+ | `ts_decay_linear` | 线性衰减 |
3107
+ | `ts_decay_exp_window` | 指数衰减 |
3108
+ | `ts_sum` | 滚动求和 |
3109
+ | `ts_backfill` | 数据回填 |
3110
+ | `ts_arg_min` | 最小值位置 |
3111
+ | `ts_arg_max` | 最大值位置 |
3112
+ | `ts_max` | 滚动最大值 |
3113
+ | `ts_min` | 滚动最小值 |
3114
+ | `ts_delay` | 延迟 |
3115
+ | `ts_moment` | k阶中心矩 |
3116
+ | `ts_co_skewness` | 协偏度 |
3117
+ | `ts_co_kurtosis` | 协峰度 |
3118
+ | `ts_partial_corr` | 偏相关 |
3119
+ | `ts_triple_corr` | 三元相关 |
3120
+ | `ts_theilsen` | Theil-Sen回归 |
3121
+ | `ts_poly_regression` | 多项式回归残差 |
3122
+ | `ts_vector_neut` | 向量中性化 |
3123
+ | `ts_weighted_decay` | 加权衰减 |
3124
+ | `ts_min_max_cps` | 最小最大压缩 |
3125
+ | `ts_max_diff` | 与最大值差 |
3126
+ | `ts_av_diff` | 与均值差 |
3127
+ | `ts_quantile` | 分位数 |
3128
+ | `ts_percentage` | 百分位 |
3129
+ | `ts_median` | 中位数 |
3130
+ | `ts_product` | 累积乘积 |
3131
+ | `ts_count_nans` | NaN计数 |
3132
+ | `ts_scale` | 时序缩放 |
3133
+ | `ts_target_tvr_hump` | 目标换手率Hump |
3134
+ | `ts_target_tvr_delta_limit` | Delta换手率限制 |
3135
+
3136
+ ### 分组操作符 `<group_op/>`
3137
+ | 操作符 | 用途 |
3138
+ |--------|------|
3139
+ | `group_rank` | 分组排名 |
3140
+ | `group_neutralize` | 分组中性化 |
3141
+ | `group_zscore` | 分组Z-score |
3142
+ | `group_mean` | 分组均值 |
3143
+ | `group_sum` | 分组求和 |
3144
+ | `group_extra` | 分组提取/填补 |
3145
+ | `group_backfill` | 分组回填 |
3146
+ | `group_normalize` | 分组归一化 |
3147
+ | `group_vector_neut` | 分组向量中性化 |
3148
+ | `group_vector_proj` | 分组向量投影 |
3149
+ | `group_count` | 分组计数 |
3150
+ | `group_std_dev` | 分组标准差 |
3151
+
3152
+ ### 向量操作符 `<vec_op/>`
3153
+ | 操作符 | 用途 |
3154
+ |--------|------|
3155
+ | `vec_avg` | 向量平均 |
3156
+ | `vec_sum` | 向量求和 |
3157
+ | `vec_max` | 向量最大 |
3158
+ | `vec_min` | 向量最小 |
3159
+ | `vec_stddev` | 向量标准差 |
3160
+ | `vec_count` | 向量计数 |
3161
+ | `vec_norm` | 向量归一化 |
3162
+ | `vec_zscore` | 向量Z-score |
3163
+ | `vec_range` | 向量范围 |
3164
+
3165
+ ### 事件/时间操作符
3166
+ | 操作符 | 用途 |
3167
+ |--------|------|
3168
+ | `days_from_last_change` | 距离上次变化天数 |
3169
+ | `last_diff_value` | 最近不同值 |
3170
+ | `ts_step` | 时间步长 |
3171
+
3172
+ ### 信号处理操作符
3173
+ | 操作符 | 用途 |
3174
+ |--------|------|
3175
+ | `signed_power` | 带符号幂变换 |
3176
+ | `clamp` | 边界限制 |
3177
+ | `left_tail` | 左尾截断 |
3178
+ | `right_tail` | 右尾截断 |
3179
+ | `fraction` | 分数映射 |
3180
+ | `nan_out` | NaN外推 |
3181
+ | `purify` | 数据清洗 |
3182
+ | `keep` | 条件保留 |
3183
+ | `scale_down` | 缩放降维 |
3184
+ | `hump` | Hump平滑 |
3185
+ | `hump_decay` | Hump衰减 |
3186
+
3187
+ ### 其他常用操作符
3188
+ | 操作符 | 用途 |
3189
+ |--------|------|
3190
+ | `rank` | 截面排名 |
3191
+ | `zscore` | 截面Z-score |
3192
+ | `sigmoid` | Sigmoid归一化 |
3193
+ | `winsorize` | 极端值截断 |
3194
+ | `truncate` | 截断 |
3195
+ | `tail` | 尾部处理 |
3196
+ | `scale` | 缩放 |
3197
+ | `filter` | 过滤 |
3198
+ | `densify` | 稠密化 |
3199
+ | `bucket` | 分桶 |
3200
+ | `log` | 对数 |
3201
+ | `abs` | 绝对值 |
3202
+ | `if_else` | 条件判断 |
3203
+ | `trade_when` | 条件交易 |
3204
+ | `regression_neut` | 回归中性化 |
3205
+ | `regression_proj` | 回归投影 |
3206
+ | `is_nan` | NaN检测 |
3207
+ | `is_not_nan` | 非NaN检测 |
3208
+ | `inst_pnl` | 单标的PnL |
3209
+ | `convert` | 单位转换 |
3210
+ | `pasteurize` | 去无效值 |
3211
+
3212
+ ---
3213
+
3214
+ ## 附录C:数据字段分类
3215
+
3216
+ ### 量价类 `<pv_field/>`
3217
+ ```
3218
+ close, open, high, low, vwap
3219
+ returns, volume, adv20, sharesout, cap
3220
+ ```
3221
+
3222
+ ### 基本面类 `<fundamental_field/>`
3223
+ ```
3224
+ assets, sales, ebitda, net_income, eps, operating_income
3225
+ goodwill, debt, cash, equity, gross_profit
3226
+ fnd6_*, fnd72_*, mdl175_*, mdl163_*
3227
+ debt_to_equity, roe, roa
3228
+ ```
3229
+
3230
+ ### 分析师类 `<analyst_field/>` (VECTOR)
3231
+ ```
3232
+ anl4_eps_mean, anl4_eps_low, anl4_eps_high
3233
+ anl4_revenue_mean, anl4_fcf_value, anl4_netprofit_mean
3234
+ anl4_adjusted_netincome_ft, anl4_bvps_flag
3235
+ oth41_s_west_*, analyst_*
3236
+ ```
3237
+
3238
+ ### 情绪类 `<sentiment_field/>`
3239
+ ```
3240
+ scl12_sentiment, scl12_buzz, scl12_alltype_buzzvec
3241
+ snt_value, snt_buzz, snt_buzz_ret, snt_buzz_bfl
3242
+ nws18_relevance, nws18_ber
3243
+ nws12_prez_result2, nws12_prez_short_interest
3244
+ mws85_sentiment, mws46_mcv
3245
+ ```
3246
+
3247
+ ### 期权类 `<option_field/>`
3248
+ ```
3249
+ option8_*, option14_*
3250
+ implied_volatility_call_120, implied_volatility_call_270
3251
+ parkinson_volatility_120, parkinson_volatility_270
3252
+ pcr_vol_10, pcr_vol_30
3253
+ put_delta, call_delta, put_gamma, call_gamma
3254
+ put_theta, call_theta, put_vega, call_vega
3255
+ call_breakeven_10, put_breakeven_10
3256
+ ```
3257
+
3258
+ ### 模型类 `<model_field/>`
3259
+ ```
3260
+ mdl175_01dtsv, mdl175_01icc
3261
+ mdl163_*, mdl*
3262
+ ```
3263
+
3264
+ ### 分组类 `<group/>`
3265
+ ```
3266
+ industry, sector, subindustry
3267
+ market, country, exchange
3268
+ sta1_top3000c20, sta1_*
3269
+ pv13_*, pv27_*
3270
+ ```
3271
+
498
3272
  """
499
3273
 
500
3274
  class SingleSession(requests.Session):
@@ -1254,7 +4028,7 @@ async def call_llm(prompt: str, llm_client: openai.AsyncOpenAI, max_retries: int
1254
4028
 
1255
4029
  return {}
1256
4030
 
1257
- async def propose_alpha_templates(alpha_details: dict, template_summary: str, llm_client: openai.AsyncOpenAI) -> dict:
4031
+ async def propose_alpha_templates(alpha_details: dict, template_summary: str, llm_client: openai.AsyncOpenAI, user_data_type: str = "MATRIX") -> dict:
1258
4032
  """
1259
4033
  Uses an LLM to propose new alpha templates based on a seed alpha's details.
1260
4034
 
@@ -1262,6 +4036,7 @@ async def propose_alpha_templates(alpha_details: dict, template_summary: str, ll
1262
4036
  alpha_details (dict): The details of the seed alpha.
1263
4037
  template_summary (str): A summary of alpha templates to guide the LLM.
1264
4038
  llm_client (openai.AsyncOpenAI): The authenticated OpenAI-compatible client.
4039
+ user_data_type (str): The data type for the alpha (MATRIX or VECTOR).
1265
4040
 
1266
4041
  Returns:
1267
4042
  dict: A dictionary of proposed alpha templates in JSON format.
@@ -1271,6 +4046,13 @@ async def propose_alpha_templates(alpha_details: dict, template_summary: str, ll
1271
4046
  return {}
1272
4047
  else:
1273
4048
  print(f"current seed alpha detail (当前种子Alpha详情): {alpha_details.get('expression')}")
4049
+
4050
+ data_type_instruction = ""
4051
+ if user_data_type == "MATRIX":
4052
+ data_type_instruction = "\n**Important Note on Data Type:**\nThe user has specified the data type as **MATRIX**. Please do NOT use any vector-type operators (e.g., `vec_avg`, `vec_sum`) in your proposed templates, as they will raise errors for MATRIX type data in BRAIN. Note: 'MATRIX' is just a system identifier and does not refer to mathematical matrices."
4053
+ elif user_data_type == "VECTOR":
4054
+ data_type_instruction = "\n**Important Note on Data Type:**\nThe user has specified the data type as **VECTOR**. Please ensure you use vector-type operators (e.g., `vec_avg`, `vec_sum`) to handle the data fields before applying other operators."
4055
+
1274
4056
  prompt = f"""
1275
4057
  As a world-class BRAIN consultant, your task is to design new alpha templates based on an existing seed alpha.
1276
4058
  You will be provided with the seed alpha's expression and a summary of successful alpha templates for inspiration.
@@ -1289,11 +4071,13 @@ Based on the structure and potential economic rationale of the seed alpha, by th
1289
4071
  2. Use placeholders like `<data_field/>` for data fields and `<operator/>` for operators that can be programmatically replaced later.
1290
4072
  3. For each proposed template, provide a brief, clear explanation of its investment rationale.
1291
4073
  4. Return the output as a single, valid JSON object where keys are the proposed template strings and values are their corresponding explanations. Do not include any other text or formatting outside of the JSON object.
1292
- 5. The proposed new alpha template should be related to the seed Alpha {alpha_details}, either in its format or in economic sense but in different format. utilize the inspiration well.
4074
+ 5. The proposed new alpha template should be related to the economic sense of seed Alpha {alpha_details} but in different format such as. Utilize the inspiration well.
4075
+ {data_type_instruction}
4076
+
1293
4077
  **Example Output Format:**
1294
4078
  {{
1295
- "group_zscore(<ts_rank(<data_field/>, 60)/>, industry)": "A cross-sectional momentum signal, neutralized by industry, to capture relative strength within peer groups.",
1296
- "ts_delta(<data_field/>, 20)": "A simple short-term momentum operator applied to a data field."
4079
+ "<group_operators/>(<ts_operators/>(<data_field/>, 60), industry)": "A cross-sectional momentum signal, neutralized by industry, to capture relative strength within peer groups.",
4080
+ "<logical_operator/><ts_operators/>(<data_field/>, 20)": "A simple short-term momentum operator applied to a data field."
1297
4081
  }}
1298
4082
 
1299
4083
  Now, generate the JSON object with your proposed templates.
@@ -1307,10 +4091,16 @@ Now, generate the JSON object with your proposed templates.
1307
4091
  print(f"An error occurred while calling the LLM (调用LLM时发生错误): {e}")
1308
4092
  return {}
1309
4093
 
1310
- async def propose_datafield_keywords(template_expression: str, template_explanation: str, placeholder: str, llm_client: openai.AsyncOpenAI) -> list[str]:
4094
+ async def propose_datafield_keywords(template_expression: str, template_explanation: str, placeholder: str, llm_client: openai.AsyncOpenAI, user_category: Optional[Union[str, list]] = None) -> list[str]:
1311
4095
  """
1312
4096
  Uses an LLM to propose search keywords for finding data fields.
1313
4097
  """
4098
+ category_instruction = ""
4099
+ if user_category:
4100
+ category_instruction = f"\n**User Specified Data Category:**\nThe user has specified the data category: {user_category}. Please ensure the proposed keywords are relevant to this category."
4101
+ else:
4102
+ category_instruction = "\n**Data Category:**\n Please propose keywords across diverse and relevant data categories."
4103
+
1314
4104
  prompt = f"""
1315
4105
  As a quantitative researcher, you need to find the best data fields for an alpha template placeholder.
1316
4106
  Based on the template's logic and the placeholder's name, suggest a list of 3-5 concise search keywords to use with the WorldQuant BRAIN `get_datafields` tool.
@@ -1323,6 +4113,7 @@ Based on the template's logic and the placeholder's name, suggest a list of 3-5
1323
4113
 
1324
4114
  **Placeholder to Fill:**
1325
4115
  `{placeholder}`
4116
+ {category_instruction}
1326
4117
 
1327
4118
  **Your Task:**
1328
4119
  Provide a list of search keywords that are likely to yield relevant data fields for this placeholder. The keywords should be specific and diverse. Return the output as a single, valid JSON array of strings.
@@ -1338,6 +4129,7 @@ Explanation: "measures the time-series evolution of a fund's relative rank on a
1338
4129
  """
1339
4130
  print(f"--- Calling LLM to get keywords for placeholder (正在调用LLM获取占位符关键词): {placeholder} ---")
1340
4131
  response = await call_llm(prompt, llm_client)
4132
+ print(f"AI使用如下提示词获取搜索关键词推荐:{prompt}")
1341
4133
  # Accept either a direct list or a dict containing a 'keywords' key
1342
4134
  if isinstance(response, list) and all(isinstance(item, str) for item in response):
1343
4135
  return response
@@ -1354,7 +4146,7 @@ async def get_datafield_candidates(s: SingleSession, alpha_details: dict, templa
1354
4146
  Gets candidate data fields for a placeholder by using an LLM to generate search keywords
1355
4147
  and then calling the BRAIN API's get_datafields to retrieve the top N results for each keyword.
1356
4148
  """
1357
- keywords = await propose_datafield_keywords(template_expression, template_explanation, placeholder, llm_client)
4149
+ keywords = await propose_datafield_keywords(template_expression, template_explanation, placeholder, llm_client, user_category=user_category)
1358
4150
  if not keywords:
1359
4151
  print(f"Could not generate keywords for placeholder (无法生成占位符关键词): {placeholder}")
1360
4152
  return []
@@ -1366,7 +4158,7 @@ async def get_datafield_candidates(s: SingleSession, alpha_details: dict, templa
1366
4158
  print(f"Alpha settings for datafield search (用于数据字段搜索的Alpha设置):")
1367
4159
  instrument_type = settings.get('instrumentType', 'EQUITY')
1368
4160
 
1369
- if user_region is not None:
4161
+ if user_region:
1370
4162
  region = user_region
1371
4163
  elif 'region' in settings:
1372
4164
  region = settings['region']
@@ -1375,7 +4167,7 @@ async def get_datafield_candidates(s: SingleSession, alpha_details: dict, templa
1375
4167
  return []
1376
4168
  print(f" 数据地区: {region}")
1377
4169
 
1378
- if user_universe is not None:
4170
+ if user_universe:
1379
4171
  universe = user_universe
1380
4172
  elif 'universe' in settings:
1381
4173
  universe = settings['universe']
@@ -1595,6 +4387,7 @@ async def judge_placeholder_type(placeholder: str, template_expression: str, tem
1595
4387
  - "data_field": If the placeholder clearly represents a financial data series (e.g., price, volume, fundamental ratio).
1596
4388
  - "group_data_field": If the placeholder represents a categorical field used for grouping or neutralization (e.g., `industry` in `group_zscore(x, industry)`).
1597
4389
  - "operator": If the placeholder represents a BRAIN operator that performs a calculation or transformation.
4390
+ - "vector_operator": If the placeholder represents a vector operator (e.g., vec_avg, vec_sum).
1598
4391
  - "integer_parameter": If the placeholder represents an integer value, typically a window length or count (e.g., `d` in `ts_mean(x, d)`).
1599
4392
  - "float_parameter": If the placeholder represents a floating-point number, typically a threshold or factor.
1600
4393
  - "string_parameter": If the placeholder represents a string value, like a group name (e.g., `industry` in `group_zscore(x, industry)`).
@@ -1642,7 +4435,7 @@ async def populate_template(s: SingleSession, alpha_details: dict, template_expr
1642
4435
  elif ph_type == "group_data_field":
1643
4436
  candidates = await get_group_datafield_candidates(template_expression, template_explanation, ph, llm_client)
1644
4437
  populated_placeholders[ph] = {"type": "group_data_field", "candidates": candidates}
1645
- elif ph_type in ["operator", "group_operator", "ts_operator"]:
4438
+ elif ph_type in ["operator", "group_operator", "ts_operator","vector_operator"]:
1646
4439
  candidates = await get_operator_candidates(template_expression, template_explanation, ph, llm_client)
1647
4440
  populated_placeholders[ph] = {"type": ph_type, "candidates": candidates}
1648
4441
  elif ph_type in ["integer_parameter", "float_parameter"]:
@@ -1706,7 +4499,7 @@ async def generate_new_alphas(alpha_description, brain_session, template_summary
1706
4499
 
1707
4500
  # --- Step 4: Propose New Alpha Templates ---
1708
4501
  print(f"\n--- Proposing new alpha templates for Alpha (正在为Alpha提议新模板) ---")
1709
- proposed_templates = await propose_alpha_templates(details, template_summary, llm_client)
4502
+ proposed_templates = await propose_alpha_templates(details, template_summary, llm_client, user_data_type=user_data_type)
1710
4503
 
1711
4504
  if not proposed_templates:
1712
4505
  print("Failed to generate proposed alpha templates. (生成提议模板失败)")