cnhkmcp 2.2.0__py3-none-any.whl → 2.3.1__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 (121) hide show
  1. cnhkmcp/__init__.py +1 -1
  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/README.md +1 -1
  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/config.json +2 -2
  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/main.py +1 -1
  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/vector_db/chroma.sqlite3 +0 -0
  6. cnhkmcp/untracked/APP/Tranformer/Transformer.py +2 -2
  7. cnhkmcp/untracked/APP/Tranformer/transformer_config.json +1 -1
  8. cnhkmcp/untracked/APP/blueprints/feature_engineering.py +2 -2
  9. cnhkmcp/untracked/APP/blueprints/inspiration_house.py +4 -4
  10. cnhkmcp/untracked/APP/blueprints/paper_analysis.py +3 -3
  11. cnhkmcp/untracked/APP/give_me_idea/BRAIN_Alpha_Template_Expert_SystemPrompt.md +34 -73
  12. cnhkmcp/untracked/APP/give_me_idea/alpha_data_specific_template_master.py +2 -2
  13. cnhkmcp/untracked/APP/give_me_idea/what_is_Alpha_template.md +366 -1
  14. cnhkmcp/untracked/APP/simulator/wqb20260130130030.log +210 -0
  15. cnhkmcp/untracked/APP/simulator/wqb20260130131757.log +104 -0
  16. cnhkmcp/untracked/APP/simulator/wqb20260130172245.log +70 -0
  17. cnhkmcp/untracked/APP/static/inspiration.js +350 -14
  18. cnhkmcp/untracked/APP/templates/index.html +18 -3
  19. cnhkmcp/untracked/APP/templates/transformer_web.html +1 -1
  20. cnhkmcp/untracked/APP/trailSomeAlphas/README.md +38 -0
  21. cnhkmcp/untracked/APP/trailSomeAlphas/ace.log +66 -0
  22. cnhkmcp/untracked/APP/trailSomeAlphas/enhance_template.py +588 -0
  23. cnhkmcp/untracked/APP/trailSomeAlphas/requirements.txt +3 -0
  24. cnhkmcp/untracked/APP/trailSomeAlphas/run_pipeline.py +1051 -0
  25. cnhkmcp/untracked/APP/trailSomeAlphas/run_pipeline_step_by_step.ipynb +5258 -0
  26. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-data-feature-engineering/OUTPUT_TEMPLATE.md +325 -0
  27. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-data-feature-engineering/SKILL.md +503 -0
  28. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-data-feature-engineering/examples.md +244 -0
  29. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-data-feature-engineering/output_report/ASI_delay1_analyst11_ideas.md +285 -0
  30. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-data-feature-engineering/output_report/GLB_delay1_fundamental72_ideas.md +362 -0
  31. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-data-feature-engineering/reference.md +399 -0
  32. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/SKILL.md +40 -0
  33. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/config.json +6 -0
  34. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709385783386000.json +388 -0
  35. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709386274840400.json +131 -0
  36. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709386838244700.json +1926 -0
  37. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709387369198500.json +31 -0
  38. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709387908905800.json +1926 -0
  39. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709388486243600.json +240 -0
  40. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709389024058600.json +1926 -0
  41. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709389549608700.json +41 -0
  42. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709390068714000.json +110 -0
  43. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709390591996900.json +36 -0
  44. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709391129137100.json +31 -0
  45. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709391691643500.json +41 -0
  46. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709392192099200.json +31 -0
  47. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709392703423500.json +46 -0
  48. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769709393213729400.json +246 -0
  49. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710186683932500.json +388 -0
  50. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710187165414300.json +131 -0
  51. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710187665211700.json +1926 -0
  52. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710188149193400.json +31 -0
  53. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710188667627400.json +1926 -0
  54. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710189220822000.json +240 -0
  55. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710189726189500.json +1926 -0
  56. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710190248066100.json +41 -0
  57. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710190768298700.json +110 -0
  58. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710191282588100.json +36 -0
  59. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710191838960900.json +31 -0
  60. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710192396688000.json +41 -0
  61. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710192941922400.json +31 -0
  62. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710193473524600.json +46 -0
  63. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710194001961200.json +246 -0
  64. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710420975888800.json +46 -0
  65. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710421647590100.json +196 -0
  66. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710422131378500.json +5 -0
  67. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710422644184400.json +196 -0
  68. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710423702350600.json +196 -0
  69. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_1_idea_1769710424244661800.json +5 -0
  70. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/analyst11_ASI_delay1.csv +211 -0
  71. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/analyst11_ASI_delay1/final_expressions.json +7062 -0
  72. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/final_expressions.json +138 -0
  73. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759441444909600.json +38 -0
  74. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759441920092000.json +14 -0
  75. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759442418767100.json +14 -0
  76. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759442902507600.json +14 -0
  77. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759443377036200.json +10 -0
  78. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759443845377000.json +14 -0
  79. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759444313546700.json +10 -0
  80. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759444784598600.json +14 -0
  81. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759445274311200.json +14 -0
  82. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759445747421700.json +10 -0
  83. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759446222137800.json +22 -0
  84. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759446686222600.json +14 -0
  85. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759447154698500.json +10 -0
  86. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759447629677000.json +10 -0
  87. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759448102331200.json +10 -0
  88. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_1_idea_1769759448573382000.json +14 -0
  89. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/data/fundamental72_GLB_delay1/fundamental72_GLB_delay1.csv +330 -0
  90. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/scripts/ace.log +3 -0
  91. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/scripts/ace_lib.py +1514 -0
  92. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/scripts/fetch_dataset.py +119 -0
  93. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/scripts/helpful_functions.py +180 -0
  94. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/scripts/implement_idea.py +236 -0
  95. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/scripts/merge_expression_list.py +90 -0
  96. cnhkmcp/untracked/APP/trailSomeAlphas/skills/brain-feature-implementation/scripts/parsetab.py +60 -0
  97. cnhkmcp/untracked/APP/trailSomeAlphas/skills/template_final_enhance/op/321/206/320/220/342/225/227/321/207/342/225/227/320/243.md +434 -0
  98. cnhkmcp/untracked/APP/trailSomeAlphas/skills/template_final_enhance/sample_prompt.md +62 -0
  99. cnhkmcp/untracked/APP/trailSomeAlphas/skills/template_final_enhance//321/205/320/235/320/245/321/205/320/253/320/260/321/205/320/275/320/240/321/206/320/220/320/255/321/210/320/220/320/223/321/211/320/220/342/225/227/321/210/342/225/233/320/241/321/211/320/243/342/225/233.md +354 -0
  100. cnhkmcp/untracked/APP/usage.md +2 -2
  101. 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 +400 -9
  102. cnhkmcp/untracked/back_up/platform_functions.py +2 -2
  103. cnhkmcp/untracked/mcp/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/320/276/342/225/221/321/205/320/255/320/253/321/207/320/231/320/2302_/321/205/320/266/320/222/321/206/320/256/320/254/321/205/320/236/320/257/321/207/320/231/320/230/321/205/320/240/320/277/321/205/320/232/320/270/321/204/342/225/225/320/235/321/204/342/225/221/320/226/321/206/342/225/241/320/237/321/210/320/267/320/230/321/205/320/251/320/270/321/205/342/226/221/342/226/222/321/210/320/277/320/245/321/210/342/224/220/320/251/321/204/342/225/225/320/272/platform_functions.py +2 -2
  104. cnhkmcp/untracked/platform_functions.py +2 -2
  105. cnhkmcp/untracked/skills/alpha-expression-verifier/scripts/validator.py +889 -0
  106. cnhkmcp/untracked/skills/brain-feature-implementation/scripts/implement_idea.py +4 -3
  107. cnhkmcp/untracked/skills/brain-improve-alpha-performance/arXiv_API_Tool_Manual.md +490 -0
  108. cnhkmcp/untracked/skills/brain-improve-alpha-performance/reference.md +1 -1
  109. cnhkmcp/untracked/skills/brain-improve-alpha-performance/scripts/arxiv_api.py +229 -0
  110. cnhkmcp/untracked//321/211/320/225/320/235/321/207/342/225/234/320/276/321/205/320/231/320/235/321/210/342/224/220/320/240/321/210/320/261/320/234/321/206/320/230/320/241_/321/205/320/276/320/231/321/210/320/263/320/225/321/205/342/224/220/320/225/321/210/320/266/320/221/321/204/342/225/233/320/255/321/210/342/225/241/320/246/321/205/320/234/320/225.py +35 -11
  111. cnhkmcp/vector_db/_manifest.json +1 -0
  112. cnhkmcp/vector_db/_meta.json +1 -0
  113. {cnhkmcp-2.2.0.dist-info → cnhkmcp-2.3.1.dist-info}/METADATA +1 -1
  114. {cnhkmcp-2.2.0.dist-info → cnhkmcp-2.3.1.dist-info}/RECORD +121 -33
  115. /cnhkmcp/untracked/{skills/expression_verifier → APP/trailSomeAlphas/skills/brain-feature-implementation}/scripts/validator.py +0 -0
  116. /cnhkmcp/untracked/skills/{expression_verifier → alpha-expression-verifier}/SKILL.md +0 -0
  117. /cnhkmcp/untracked/skills/{expression_verifier → alpha-expression-verifier}/scripts/verify_expr.py +0 -0
  118. {cnhkmcp-2.2.0.dist-info → cnhkmcp-2.3.1.dist-info}/WHEEL +0 -0
  119. {cnhkmcp-2.2.0.dist-info → cnhkmcp-2.3.1.dist-info}/entry_points.txt +0 -0
  120. {cnhkmcp-2.2.0.dist-info → cnhkmcp-2.3.1.dist-info}/licenses/LICENSE +0 -0
  121. {cnhkmcp-2.2.0.dist-info → cnhkmcp-2.3.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,60 @@
1
+
2
+ # parsetab.py
3
+ # This file is automatically generated. Do not edit.
4
+ # pylint: disable=W,C,R
5
+ _tabversion = '3.10'
6
+
7
+ _lr_method = 'LALR'
8
+
9
+ _lr_signature = 'ASSIGN BOOLEAN CATEGORY COMMA DIVIDE EQUAL FIELD FUNCTION GREATER GREATEREQUAL IDENTIFIER LESS LESSEQUAL LPAREN MINUS NOTEQUAL NUMBER PLUS RPAREN STRING TIMESexpression : comparison\n| expression EQUAL comparison\n| expression NOTEQUAL comparison\n| expression GREATER comparison\n| expression LESS comparison\n| expression GREATEREQUAL comparison\n| expression LESSEQUAL comparisoncomparison : term\n| comparison PLUS term\n| comparison MINUS termterm : factor\n| term TIMES factor\n| term DIVIDE factorfactor : NUMBER\n| STRING\n| FIELD\n| CATEGORY\n| IDENTIFIER\n| BOOLEAN\n| MINUS factor\n| LPAREN expression RPAREN\n| function_callfunction_call : FUNCTION LPAREN args RPARENargs : arg_list\n| emptyarg_list : arg\n| arg_list COMMA argarg : expression\n| IDENTIFIER ASSIGN expressionempty :'
10
+
11
+ _lr_action_items = {'NUMBER':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,]),'STRING':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,]),'FIELD':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,]),'CATEGORY':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,]),'IDENTIFIER':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[10,10,10,10,10,10,10,10,10,10,10,10,10,44,44,10,]),'BOOLEAN':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,]),'MINUS':([0,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,38,44,45,46,47,],[4,22,-8,4,-11,-14,-15,-16,-17,-18,-19,4,-22,4,4,4,4,4,4,4,4,4,4,-20,4,22,22,22,22,22,22,-9,-10,-12,-13,-21,-18,-23,4,4,]),'LPAREN':([0,4,12,14,15,16,17,18,19,20,21,22,23,24,27,46,47,],[12,12,12,27,12,12,12,12,12,12,12,12,12,12,12,12,12,]),'FUNCTION':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,]),'$end':([1,2,3,5,6,7,8,9,10,11,13,25,28,29,30,31,32,33,34,35,36,37,38,45,],[0,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,-23,]),'EQUAL':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[15,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,15,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,15,-18,-23,15,]),'NOTEQUAL':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[16,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,16,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,16,-18,-23,16,]),'GREATER':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[17,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,17,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,17,-18,-23,17,]),'LESS':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[18,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,18,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,18,-18,-23,18,]),'GREATEREQUAL':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[19,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,19,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,19,-18,-23,19,]),'LESSEQUAL':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[20,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,20,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,20,-18,-23,20,]),'RPAREN':([2,3,5,6,7,8,9,10,11,13,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,48,49,],[-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,38,-30,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,45,-24,-25,-26,-28,-18,-23,-27,-29,]),'COMMA':([2,3,5,6,7,8,9,10,11,13,25,28,29,30,31,32,33,34,35,36,37,38,40,42,43,44,45,48,49,],[-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,46,-26,-28,-18,-23,-27,-29,]),'PLUS':([2,3,5,6,7,8,9,10,11,13,25,28,29,30,31,32,33,34,35,36,37,38,44,45,],[21,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,21,21,21,21,21,21,-9,-10,-12,-13,-21,-18,-23,]),'TIMES':([3,5,6,7,8,9,10,11,13,25,34,35,36,37,38,44,45,],[23,-11,-14,-15,-16,-17,-18,-19,-22,-20,23,23,-12,-13,-21,-18,-23,]),'DIVIDE':([3,5,6,7,8,9,10,11,13,25,34,35,36,37,38,44,45,],[24,-11,-14,-15,-16,-17,-18,-19,-22,-20,24,24,-12,-13,-21,-18,-23,]),'ASSIGN':([44,],[47,]),}
12
+
13
+ _lr_action = {}
14
+ for _k, _v in _lr_action_items.items():
15
+ for _x,_y in zip(_v[0],_v[1]):
16
+ if not _x in _lr_action: _lr_action[_x] = {}
17
+ _lr_action[_x][_k] = _y
18
+ del _lr_action_items
19
+
20
+ _lr_goto_items = {'expression':([0,12,27,46,47,],[1,26,43,43,49,]),'comparison':([0,12,15,16,17,18,19,20,27,46,47,],[2,2,28,29,30,31,32,33,2,2,2,]),'term':([0,12,15,16,17,18,19,20,21,22,27,46,47,],[3,3,3,3,3,3,3,3,34,35,3,3,3,]),'factor':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[5,25,5,5,5,5,5,5,5,5,5,36,37,5,5,5,]),'function_call':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,]),'args':([27,],[39,]),'arg_list':([27,],[40,]),'empty':([27,],[41,]),'arg':([27,46,],[42,48,]),}
21
+
22
+ _lr_goto = {}
23
+ for _k, _v in _lr_goto_items.items():
24
+ for _x, _y in zip(_v[0], _v[1]):
25
+ if not _x in _lr_goto: _lr_goto[_x] = {}
26
+ _lr_goto[_x][_k] = _y
27
+ del _lr_goto_items
28
+ _lr_productions = [
29
+ ("S' -> expression","S'",1,None,None,None),
30
+ ('expression -> comparison','expression',1,'p_expression','validator.py',383),
31
+ ('expression -> expression EQUAL comparison','expression',3,'p_expression','validator.py',384),
32
+ ('expression -> expression NOTEQUAL comparison','expression',3,'p_expression','validator.py',385),
33
+ ('expression -> expression GREATER comparison','expression',3,'p_expression','validator.py',386),
34
+ ('expression -> expression LESS comparison','expression',3,'p_expression','validator.py',387),
35
+ ('expression -> expression GREATEREQUAL comparison','expression',3,'p_expression','validator.py',388),
36
+ ('expression -> expression LESSEQUAL comparison','expression',3,'p_expression','validator.py',389),
37
+ ('comparison -> term','comparison',1,'p_comparison','validator.py',396),
38
+ ('comparison -> comparison PLUS term','comparison',3,'p_comparison','validator.py',397),
39
+ ('comparison -> comparison MINUS term','comparison',3,'p_comparison','validator.py',398),
40
+ ('term -> factor','term',1,'p_term','validator.py',405),
41
+ ('term -> term TIMES factor','term',3,'p_term','validator.py',406),
42
+ ('term -> term DIVIDE factor','term',3,'p_term','validator.py',407),
43
+ ('factor -> NUMBER','factor',1,'p_factor','validator.py',414),
44
+ ('factor -> STRING','factor',1,'p_factor','validator.py',415),
45
+ ('factor -> FIELD','factor',1,'p_factor','validator.py',416),
46
+ ('factor -> CATEGORY','factor',1,'p_factor','validator.py',417),
47
+ ('factor -> IDENTIFIER','factor',1,'p_factor','validator.py',418),
48
+ ('factor -> BOOLEAN','factor',1,'p_factor','validator.py',419),
49
+ ('factor -> MINUS factor','factor',2,'p_factor','validator.py',420),
50
+ ('factor -> LPAREN expression RPAREN','factor',3,'p_factor','validator.py',421),
51
+ ('factor -> function_call','factor',1,'p_factor','validator.py',422),
52
+ ('function_call -> FUNCTION LPAREN args RPAREN','function_call',4,'p_function_call','validator.py',450),
53
+ ('args -> arg_list','args',1,'p_args','validator.py',454),
54
+ ('args -> empty','args',1,'p_args','validator.py',455),
55
+ ('arg_list -> arg','arg_list',1,'p_arg_list','validator.py',462),
56
+ ('arg_list -> arg_list COMMA arg','arg_list',3,'p_arg_list','validator.py',463),
57
+ ('arg -> expression','arg',1,'p_arg','validator.py',470),
58
+ ('arg -> IDENTIFIER ASSIGN expression','arg',3,'p_arg','validator.py',471),
59
+ ('empty -> <empty>','empty',0,'p_empty','validator.py',478),
60
+ ]
@@ -0,0 +1,434 @@
1
+ 先给个小计划:
2
+ 1)用一个统一的单因子例子(比如 anl11_esgreg_industryperc)来思考“哪些区间有信号、哪些是噪音”。
3
+ 2)按算子类别,一一说明典型适用场景,重点围绕你提到的“只一部分区间有信号 / 极值是噪音 / 时序更重要”等情况。
4
+
5
+ 下面我按类别来梳理,每个只讲“什么时候应该想起它”。
6
+
7
+ 一、简单算术类(add / subtract / multiply / reverse / power / signed_power / log / sqrt / s_log_1p / abs)
8
+
9
+ add(A, c) / subtract(A, c)
10
+
11
+ 场景:想把阈值移动到别的区间,例如 A 本来 0–100,你想用 “(A-50)>0” 判断高于中位;
12
+ 简单平移,用于配合逻辑算子(greater/less)做“高于某个基准”的判断。
13
+ multiply(A, c)(c>0)
14
+
15
+ 场景:你已经认可当前形状/排序,只想调整“力度”(控制尾部放大还是压缩)或和其他因子对齐量级;
16
+ 调权重,不改变好坏排序。
17
+ reverse(A)(-A)
18
+
19
+ 场景:你发现指标“值越小越好”(比如利差、成本),想改成“值越大越好”的方向;
20
+ 或同一个原始字段想同时挖 value/momentum 两方向信号,一个用 A,一个用 -A。
21
+ power(A, y)(A≥0)
22
+
23
+ 场景:你希望放大高端或低端:
24
+ y>1:突出极端高值(比如只关心极高 ESG 的公司—tail 强调);
25
+ 0<y<1:压缩差距,只保留大致排序,不让极端值太主导。
26
+
27
+ signed_power(A, y)
28
+ 场景:A 有正负,正负号本身有含义(好/坏),你只想“非线性放大极端程度”,不能把符号毁掉;
29
+ 比如盈利 surprise zscore,高正/高负都想被放大,而 0 附近缩小。
30
+ log(A) / sqrt(A)(A>0)
31
+
32
+ 场景:A 分布高度右偏,极个别超大值是噪音,想压扁右尾;
33
+ 例如成交量类、规模类字段拉得太长,用 log 把大公司压回来,但顺序还保留。
34
+ s_log_1p(A)
35
+
36
+ 场景:想把正负两边都压短,但不破坏“正是好、负是坏”的结构;
37
+ 尤其适用于 zscore 后的因子,避免少数极端 zscore>5 的点主导。
38
+ abs(A)
39
+
40
+ 场景:你不在乎正负方向,只关心“离中性多远”:
41
+ 如“极端 ESG 无论好坏都可能带来风险溢价”,先做 zscore,再 abs 找两端。
42
+ 二、逻辑算子(greater / less / greater_equal / less_equal / equal / not_equal / and / or / not / if_else / is_nan / trade_when)
43
+
44
+ greater(A, threshold) / less(A, threshold)
45
+
46
+ 场景:你认为只有高于某阈值的区域才有信号,中间区间全是噪音;
47
+ 如:greater(A, 80) 把 ESG 行业分位 >80% 的打上标签。
48
+ if_else(cond, x, y)
49
+
50
+ 场景:要做“分段函数”:
51
+ 例如 A>80 用 A 自己,A 在 20–80 之间直接给 0,A<20 用 -A;
52
+ 用来实现“头尾有含义,中间视为 0”。
53
+ trade_when(cond, new_value, old_value)
54
+
55
+ 场景:你想在满足条件时改变 alpha 值 / 关闭仓位:
56
+ 如:trade_when(less(A,20), NAN, A) → 低于 20 分的 ESG 直接不持仓;
57
+ 或只在 “A 显著好/差” 时 trade,其他时间保持昨天的权重。
58
+ and / or / not
59
+
60
+ 场景:组合多条件,例如“ESG 高且 盈利高 才算好”,“ESG 差或 盈利差 就算差”;
61
+ 在你刚才举的 ESG×盈利例子、区间过滤里非常关键。
62
+ is_nan(A)
63
+
64
+ 场景:处理缺失数据,过滤掉“看似极值其实是缺数据”的点;
65
+ 或建立“有无披露”的信号(披露本身可能有含义)。
66
+ 三、截面预处理&形状控制(winsorize / zscore / normalize / quantile / truncate / scale)
67
+
68
+ winsorize(A, std=4)
69
+
70
+ 场景:你怀疑极小区间(最极端头/尾)是噪音,但又不想完全扔掉:
71
+ 用标准差裁剪,把极值“拉回”可控范围,保留排序;
72
+ 如 ESG 分数里个别公司数据错误/极端,先 winsorize 再用。
73
+ zscore(A)
74
+
75
+ 场景:
76
+ 你想把不同尺度的指标放到统一标准(利于后续组合或理解强度);
77
+ 或直接用 “相对平均的偏离程度”衡量好坏,而不是原始值;
78
+ 复杂场景下,“只有某段区间有信号” 之前,一般都会先 winsorize+zscore 做“干净版本”。
79
+ normalize(A, useStd=false)
80
+
81
+ 场景:
82
+ 想让 alpha 向量满足一些约束(如和为 0、绝对和为 1 等)以方便模拟;
83
+ 已经认定好坏排序无误,只需要变成实际可交易权重。
84
+ quantile(A, driver=gaussian|cauchy|uniform)
85
+
86
+ 场景:
87
+ 只信 rank,不信原始间距;
88
+ 想把头尾拉长、中间压缩,使“头尾区域贡献更大,中间区间噪音影响更小”;
89
+ 比如:quantile(A,"gaussian") 把中间堆在 0 附近,两头往远处拉。
90
+ truncate(A, maxPercent=0.01)
91
+
92
+ 场景:
93
+ 想严格限制任一股票最大权重,即便因子极端也不能超出;
94
+ 如“即便最好的 ESG 也最多只占 1% booksize”,挤出一部分极端风险。
95
+ scale(A, scale=1, longscale=1, shortscale=1)
96
+
97
+ 场景:
98
+ 控制多空强度,比如多头总权重=1,空头总权重=-1;
99
+ 或者想让“好公司”仓位更集中、坏公司更分散:用不同的 longscale/shortscale。
100
+ 四、分组算子(group_rank / group_zscore / group_scale / group_normalize / group_mean / group_backfill / group_cartesian_product)
101
+
102
+ group_rank(A, group)
103
+
104
+ 场景:
105
+ 你觉得“信号只在组内排序上有意义”,不同组之间原始水平不能比;
106
+ 如 ESG 按行业比,行业间 ESG 水平不具可比性。
107
+ group_zscore(A, group)
108
+
109
+ 场景:
110
+ 你想在行业内做“高于行业平均几个标准差”的度量;
111
+ 尤其当某些行业整体 ESG 水平很高/很低时,需要去掉这一层偏移。
112
+ group_scale(A, group)
113
+
114
+ 场景:
115
+ 想要每个行业内的 A 从 0~1 线性分布,方便配合逻辑/桶化;
116
+ 比如只做“行业内 Top 20%”选股,之前先 group_scale 再用阈值。
117
+ group_normalize(A, group)
118
+
119
+ 场景:
120
+ 想做到每天每个行业“净多空为 0 / 杠杆受控”,避免行业间暴露;
121
+ 单因子 A 决定组内排序,同时这个算子决定组内权重如何平衡。
122
+ group_backfill(A, group, d)
123
+
124
+ 场景:
125
+ 某个行业里个别股票 ESG 缺数据,你想用同组历史均值/邻近值填充,用于维持样本量;
126
+ 防止某些组因缺值导致权重集中在少数有数据的成员。
127
+ group_cartesian_product(g1, g2)
128
+
129
+ 场景:
130
+ 想在“行业 × 国家”“行业 × size”等更细粒度 group 内排序;
131
+ 对于只在特定子群(如小盘高 ESG)才有信号的因子特别有用。
132
+ 五、变换/筛选类(bucket / right_tail / left_tail / trade_when)
133
+
134
+ bucket(rank(A), range="0,1,0.1")
135
+
136
+ 场景:
137
+ 你相信“只有前 10%/后 10% 的 A 有信号,中间是噪音”,想做分组处理;
138
+ 分桶后可以对不同桶施加不同逻辑(比如头部多、尾部空、中间 0)。
139
+ right_tail(A, minimum)
140
+
141
+ 场景:
142
+ 想把“低于某值”的都视为噪音(NaN),只在右尾上做信号;
143
+ 例如只关心 ESG 行业分位>70%的公司,中低段看成无信号。
144
+ left_tail(A, maximum)
145
+
146
+ 场景:
147
+ 想把“高于某值”的都视为噪音,只在左尾(差公司)上建反向信号;
148
+ 如“只做最低 ESG 10% 的反向因子”,其余不参与。
149
+ trade_when(A, ...)
150
+
151
+ 场景:
152
+ 将“某区间内”的值替换为 0 / NaN / 别的逻辑输出,从而只在有信号区间交易;
153
+ 用于构造“区间择时”:例如仅当 A 超过某阈值时,才重新调整权重。
154
+ 六、时间序列算子(ts_mean / ts_rank / ts_delta / ts_zscore / ts_scale / ts_sum / ts_std_dev / ts_decay_linear / hump / hump_decay / ts_target_tvr_ / ts_backfill / ts_median / ts_quantile / ts_arg_max / ts_arg_min / ts_corr / ts_covariance / last_diff_value / days_from_last_change / ts_product / ts_step / ts_count_nans / ts_regression / kth_element / inst_tvr)*
155
+
156
+ 这些主要用于“时序上更好才是更好”的场景。
157
+
158
+ ts_mean(A, d) / ts_median(A,d)
159
+
160
+ 场景:
161
+ 你认为“持续高 ESG / 高盈利”的公司更可靠,而不是只看某一时点;
162
+ 则用近 d 天平均/中位数来平滑一次性噪音。
163
+ ts_delta(A, d)
164
+
165
+ 场景:
166
+ “变好”比“绝对高”更重要,例如 ESG 评分持续上升;
167
+ A_t - A_{t-d} > 0 代表在改善,可用作单独因子或与水平因子叠加。
168
+ ts_rank(A, d) / ts_zscore(A,d) / ts_scale(A,d)
169
+
170
+ 场景:
171
+ 你关心 A 在自身过去窗口中的位置,“历史高位/低位”是否预示未来表现;
172
+ 如 ESG 刚刷新历史高值是否会带来短期 alpha。
173
+ ts_decay_linear(A, d) / ts_decay_exp_window(A,d)
174
+
175
+ 场景:
176
+ A 每天抖动大,但方向稳定,希望平滑,用“加权平均最近几天”的方式;
177
+ 控制周频/日频噪音,不改变整体趋势。
178
+ hump(A, hump=0.01) / hump_decay(A, ...)
179
+
180
+ 场景:
181
+ 控制日间权重变化幅度,忽略太小的变化,降低 turnover;
182
+ 当你知道因子信号慢变,不需要对小抖动频繁调仓时。
183
+ ts_target_tvr_* 一族
184
+
185
+ 场景:
186
+ 有明确 turnover 目标,想自动调整 decay 相关参数;
187
+ 对于已经验证有信号但过于频繁交易的因子,做“统一降速”。
188
+ ts_backfill(A, lookback, ...) / kth_element
189
+
190
+ 场景:
191
+ 在时间维度上填补缺失 A,减少由于少数缺值导致的随机信号。
192
+ days_from_last_change(A) / last_diff_value(A,d)
193
+
194
+ 场景:
195
+ 因子是“事件驱动型”的(评级变动、ESG 评级更新等),只在变动后若干天内才有信号;
196
+ 可以构造“距上次变化时间”的信号。
197
+ 七、Reduce / Combo 等(reduce_ / combo_a / self_corr 等)*
198
+
199
+ 这些更多在多因子/多 Alpha 组合层面用,但单因子也有场景:
200
+
201
+ reduce_*(avg / max / min / stddev / percentage等)
202
+
203
+ 场景:
204
+ 你想从一个“多维度向量”提炼单值,例如同一公司的多条 ESG 子项合成一个指标;
205
+ 或在历史上把 A 的波动性/偏度/峰度作为新的单因子。
206
+ combo_a(alphas, ...)
207
+
208
+ 场景:
209
+ 多个不同构造方式的同主题因子(比如多个 ESG 变体)组合,提升稳健性;
210
+ 单一指标不够可靠,想自动根据历史 IR 给权重。
211
+ self_corr(A)
212
+
213
+ 场景:
214
+ 研究同因子在截面上的相关结构,比如 ESG 因子和某个 sector pattern 是否极度重叠;
215
+ 更偏研究/调试,不是直接构造单因子。
216
+ 小结(对应你说的那些“现实情景”):
217
+
218
+ 只头部/尾部有信号:
219
+ 想起:rank + bucket + 逻辑算子(greater/less/if_else/trade_when)、right_tail / left_tail。
220
+ 中间区间是噪音:
221
+ 想起:用阈值+逻辑把中段置 0 / NaN(if_else/trade_when),或 quantile 把中间压在 0 附近。
222
+ 极值是噪音:
223
+ 想起:winsorize、truncate、log/s_log_1p 以及 group 版处理。
224
+ 时序上持续更好才是“好”:
225
+ 想起:ts_mean / ts_median / ts_rank / ts_delta / ts_zscore / ts_decay_linear 与 hump。
226
+ 只在某些 group 中有用信号(行业/国家/size):
227
+ 想起:group_rank / group_zscore / group_scale / group_normalize / group_cartesian_product。
228
+ 如果你愿意,下一步我可以挑一个具体字段(比如 anl11_esgreg_industryperc),分别用“头尾信号型 / 极值噪音型 / 时序改善型 / group 内相对型”4 种典型场景,各写一个短而实战的 Alpha 表达式,让你一眼看到这些算子在真实情境下的用法差别。
229
+
230
+
231
+ ---------------------------------------------------------------------------------------------
232
+ 先说思路,再按算子类别给“B 的安全用法模板”。
233
+
234
+ 目标回顾
235
+
236
+ 已有主信号 A(决定方向和主排序)。
237
+ 从属信号 B 只能:
238
+ 放大/缩小 A 的力度;
239
+ 或在“已确定阵营”的前提下微调排序;
240
+ 不能:翻转方向、让 B 在全局上主导排序。
241
+ 下面假设 A 已经是你认可的版本(例如 A = zscore(winsorize(returns,4))),我们只讨论 “在 A 基础上怎样用 B”。
242
+
243
+ 一、Arithmetic 类算子(add / subtract / multiply / reverse / power / signed_power / log / sqrt / s_log_1p / abs / inverse / max / min)
244
+
245
+ 这里关键:让 B 进入一个受控区间,再影响 A。
246
+
247
+ add(B,c) / subtract(B,c)
248
+
249
+ 用途:给 B 平移到围绕 0 的小区间。
250
+ 模板:
251
+ b = zscore(winsorize(B,4))
252
+ b_clip = winsorize(b, 2)
253
+ 再进入其他结构(见 multiply)。
254
+ multiply(A, something(B))
255
+
256
+ 安全范式:
257
+ factor = 1 + k * b_clip,其中 b_clip 已限制在[-1,1],k 小于 1;
258
+ core = A * factor
259
+ 示例:
260
+ b = zscore(winsorize(B,4))
261
+ b_clip = winsorize(b,2)
262
+ factor = add(1, multiply(0.5, b_clip)) (≈ 0.5~1.5)
263
+ core = multiply(A, factor, filter=true)
264
+ 这样:
265
+ sign(core) = sign(A);
266
+ |core| 随 B 增大/减小。
267
+ reverse(B) / inverse(B)(1/B)
268
+
269
+ 只适合作为 构造 factor 的中间步骤,仍要映射到有限区间:
270
+ 如:b_inv = inverse(B) → 再 zscore + winsorize + 映射到 [0.5,1.5];
271
+ 不要 A * inverse(B) 直接上,会把稀奇小值放大得乱七八糟。
272
+ power(B,y) / signed_power(B,y)
273
+
274
+ 用途:
275
+ y>1:强调高 B;0<y<1:压平 B。
276
+ 模式:
277
+ b = zscore(B) → b_clip = winsorize(b,2) → b2 = signed_power(b_clip, y) → 再缩放成 factor。
278
+ 依然走 “factor = 1 + k*b2” 的套路。
279
+ log(B) / sqrt(B)
280
+
281
+ 用途:B>0 且右偏时压尾,避免少数巨大成交量/市值主导因子。
282
+ 一般流程:b = log(B) 或 sqrt(B) → 标准化、截断 → 做 factor。
283
+ s_log_1p(B)
284
+
285
+ 用途:既压缩幅度又保留正负号,适合已 zscore 的 B:
286
+ b = zscore(winsorize(B,4)) → b2 = s_log_1p(b);b2 自动收在有限范围。
287
+ abs(B) / max(A,B) / min(A,B)
288
+
289
+ 用途:
290
+ abs(B):我们只关心“B 极端程度”而非方向,例如极大成交量时更值得放大;
291
+ 可用:factor = 1 + k * s_log_1p(abs(zscore(B)))。
292
+ max/min 不用于 A×B,而常用来在两种 factor 中选更强/更弱的一个。
293
+ 二、Logical 类(and / or / not / greater / less / equal / not_equal / if_else / is_nan)
294
+
295
+ 这里 B 更像“开关/权重档位”。
296
+
297
+ 区间筛选:只在某些 B 区间放大或允许交易
298
+
299
+ 例:B 为 volume,成交量太小的股票不想重仓:
300
+ high_liq = greater(B, thresh)
301
+ core = if_else(high_liq, A, 0.5*A) 或 trade_when(not high_liq, 0.5*A, A)。
302
+ 模式:
303
+ B 只决定“用 A 还是 c*A”,而不是参与算术组合。
304
+ 多条件:B 只是辅助条件,不决定符号
305
+
306
+ 如:收益为正,且成交量高时才加大多头:
307
+ long = greater(A,0)
308
+ high_vol = greater(B, thresh)
309
+ boost = and(long, high_vol)
310
+ core = trade_when(boost, 1.5*A, A)。
311
+ is_nan(B)
312
+
313
+ 用 B 的缺失与否控制是否用其影响:
314
+ has_B = not(is_nan(B))
315
+ core = trade_when(has_B, A * factor(B), A)。
316
+ 三、Cross-sectional 形状控制(winsorize / zscore / normalize / quantile / rank / truncate / scale)
317
+
318
+ 这些几乎是所有 “B 处理” 的第一步。
319
+
320
+ 对 B 做“干净版处理”:
321
+
322
+ 标准套路:
323
+ b = zscore(winsorize(B,4))
324
+ 或 b_rank = rank(B)
325
+ 或 b_q = quantile(B,"gaussian")。
326
+ 关键:B 必须先被裁剪和标准化,再参与任何与 A 的组合。
327
+ 用 rank(B) 时特别注意:
328
+
329
+ 若你直接 A * rank(B),B 会在[0,1]里直接线性放大/缩小 A(可接受);
330
+ 真正危险的是 rank(A) * rank(B) 类型,“双 rank 全局扭曲排序”;
331
+ 安全模式:
332
+ core = A * f(rank(B)),且 f 在有限区间(比如 [0.5,1.5])。
333
+ quantile(B, driver)
334
+
335
+ 适合把 B 的中间区间压到 0 附近,让“只有极高/极低的 B 才明显放大/抑制 A”;
336
+ 再映射到小系数范围即可。
337
+ truncate / scale
338
+
339
+ truncate(A, x):作用于合成后的 core,保证任何单股票权重不爆;
340
+ scale:多空总和、booksize 控制,与 B 关系不大,但最后一步常用。
341
+ 四、Group 类(group_rank / group_zscore / group_scale / group_normalize / group_backfill / group_mean)
342
+
343
+ 当 B 的含义“只在 group 内比较有意义”(如行业内量能/市值):
344
+
345
+ Group 内标准化 B:
346
+
347
+ b = group_zscore(B, industry) 或 b_rank = group_rank(B, industry);
348
+ 然后用作 factor 的原材料。
349
+ 典型安全模式:
350
+
351
+ factor = 1 + k * group_zscore(B, industry) 截断在[-1,1];
352
+ 或在多头/空头阵营内用 group_rank(B, group) 调整权重。
353
+ 不要用 group 结果去改变 A 的方向,只影响幅度和组内排序。
354
+
355
+ 五、Transformational(bucket / right_tail / left_tail / trade_when / right_tail/left_tail 已讲)
356
+
357
+ bucket(rank(B), ...)
358
+
359
+ 场景:把 B 分为“极高 / 高 / 中 / 低 / 极低”,然后每个桶给不同放大倍数:
360
+ 模式:
361
+ b_rank = rank(B)
362
+ b_bucket = bucket(b_rank, "0,1,0.2")
363
+ 再 if_else / trade_when:
364
+ 极高桶:乘 1.5;高桶:乘 1.2;中桶:乘 1;低桶:乘 0.7;极低桶:乘 0.5。
365
+ 注意:始终是 “A * f(bucket(B))”。
366
+ right_tail / left_tail
367
+
368
+ 提前把“无意义区间”的 B 变 NaN,然后只在 B 有意义区间里做放大;
369
+ 如:b_sig = right_tail(zscore(B), minimum=0) → 只对高量能时放大 A,其余 factor=1。
370
+ trade_when(上面已部分提过)
371
+
372
+ 是最通用的 “条件改变 A 倍数或关闭仓位” 工具。
373
+ 样板:
374
+ cond = some_function_of_B
375
+ core = trade_when(cond, A * factor1, A * factor2)。
376
+ 六、Time Series 类(ts_mean / ts_rank / ts_delta / ts_zscore / ts_decay_linear / hump 等)
377
+
378
+ 这里 B 是时序信号,比如 volume, adv, 波动率等。
379
+
380
+ 基础清洗:
381
+
382
+ b_ts = ts_zscore(B, d) 或 ts_rank(B,d);
383
+ 用于识别“这个股票近期 volume 特别高/特别低”。
384
+ 安全组合范式:
385
+
386
+ factor = 1 + k * ts_zscore(B,d) 截断;
387
+ 或 factor = f(ts_rank(B,d)) 映射到 [0.5,1.5];
388
+ 再 core = A * factor。
389
+ Turnover 控制相关(ts_decay_linear / hump / ts_target_tvr_*):
390
+
391
+ 这些更多用于平滑最终 Alpha,而不是直接处理 B;
392
+ 可在合成 core 后:core_smooth = ts_decay_linear(core, 3);B 的作用已经体现在 core 里。
393
+ ts_delta(B,d) / days_from_last_change(B)
394
+
395
+ 把“最近量能/波动突变”作为从属放大器;
396
+ 例如 volume 爆量那几天放大 A,平时保持中立:
397
+ b_spike = greater(ts_delta(B,1), thresh)
398
+ core = trade_when(b_spike, 1.5*A, A)。
399
+ 七、Reduce / Combo 等
400
+
401
+ 多数用于多维/多因子的情况,不再一一展开;简单原则:
402
+
403
+ 若 B 其实是一组值(如多个 volume 相关字段),先用 reduce_avg/reduce_max 合成一个 B_agg,再按前面逻辑当作单一 B 处理。
404
+ 最后给一个总的“使用从属 B 的模板公式”
405
+
406
+ 可以抽象成:
407
+
408
+ 先得到干净的主信号:
409
+
410
+ A_clean = some_transform_on_A(...)(你已完成)
411
+ 再把 B 变成有限、解释清晰的放大器:
412
+
413
+ 结构 1:线性缩放
414
+
415
+ B_clean = standardize_and_clip(B)
416
+ factor = 1 + k * B_clean (k 小于 1,B_clean 在[-1,1])
417
+ core = A_clean * factor
418
+ 结构 2:按阵营分配
419
+
420
+ 基于 A 确定阵营:long_mask = A_clean>0,short_mask = A_clean<0
421
+ 在每个阵营内部,用 rank(B) / group_rank(B,industry) 再调节:
422
+ factor_long = f(rank(B | long_mask))
423
+ factor_short = g(rank(B | short_mask))
424
+ core = trade_when(long_mask, A_clean*factor_long, A_clean) 再对空头同理。
425
+ 最后再 normalize / scale / truncate 做可交易化。
426
+ 只要你保证“B 只出现在 factor 里,且 factor 不会跨 0”,主信号 A 的方向和骨干排序就不会被 B 颠覆。
427
+
428
+ ### Smoothing Operators
429
+ - **ts_mean vs ts_decay_linear**:
430
+ - `ts_mean(x, N)` puts equal weight on all N days.
431
+ - `ts_decay_linear(x, N)` puts linearly decreasing weight (N, N-1, ..., 1).
432
+ - **Turnover Impact**: `ts_decay_linear` results in **much higher turnover** than `ts_mean` for the same window size, because it emphasizes recent data.
433
+ - Example: `ts_mean(x, 20)` -> Turnover 16%. `ts_decay_linear(x, 20)` -> Turnover 73%.
434
+ - **Recommendation**: Use `ts_mean` for reducing turnover. Use `ts_decay_linear` only if you need faster reaction and can afford the turnover.
@@ -0,0 +1,62 @@
1
+ An alpha template is a reusable recipe that captures an economic idea and leaves “slots” (data fields, operators, groups, decay, neutralization choices, etc.) to instantiate many candidate alphas. Typical structure: clean data (backfill, winsorize) → transform/compare across time or peers → rank/neutralize → (optionally) decay/turnover tune. Templates encourage systematic search, reuse, and diversification while keeping an explicit economic rationale.
2
+
3
+ Some Example Templates and rationales
4
+
5
+ CAPM residual (market/sector-neutral return): ts_regression(returns, group_mean(returns, log(ts_mean(cap,21)), sector), 252, rettype=0) after backfill+winsorize. Rationale: strip market/sector beta to isolate idiosyncratic alpha; sector-weighted by smoothed log-cap to reduce large-cap dominance.
6
+ CAPM beta (slope) template: same regression with rettype=2; pre-clean target/market (ts_backfill(...,63) + winsorize(std=4)). Rationale: rank stocks by relative risk within sector; long low-β, short high-β, or study β dispersion across groups.
7
+ CAPM generalized to any feature: data = winsorize(ts_backfill(<data>,63),std=4); data_gpm = group_mean(data, log(ts_mean(cap,21)), sector); resid = ts_regression(data, data_gpm, 252, rettype=0). Rationale: pull out the component unexplained by group average of same feature; reduces common-mode exposure.
8
+ Actual vs estimate spread (analyst): group_zscore( group_zscore(<act>, industry) – group_zscore(<est>, industry), industry ) or the abstracted group_compare(diff(group_compare(act,...), group_compare(est,...)), ...). Rationale: surprise/beat-miss signal within industry, normalized to peers to avoid level bias.
9
+ Analyst term-structure (fp1 vs fy1/fp2/fy2): group_zscore( group_zscore(anl14_mean_eps_<period1>, industry) – group_zscore(anl14_mean_eps_<period2>, industry), industry ) with operator/group slots. Rationale: cross-period expectation steepness; rising near-term vs long-term forecasts can flag momentum/inflection.
10
+ Option Greeks net spread: group_operator(<put_greek> - <call_greek>, <grouping_data>) over industry/sector (Delta/Gamma/Vega/Theta). Rationale: options-implied sentiment/convexity skew vs peers; outlier net Greeks may precede spot moves; extend with multi-Greek composites or time-series deltas.
11
+
12
+
13
+ based on the following guidance of how to make a data collation template into a signal, and guidance on how to utilize the best of operators.
14
+
15
+ guidance of how to make a data collation template into a signal
16
+ --------------
17
+ D:\BRAINProject\cnhkmcp\cnhkmcp\untracked\APP\trailSomeAlphas\skills\template_final_enhance\单因子思考逻辑链.md
18
+ --------------
19
+ 'guidance on how to use the best of operators'
20
+ D:\BRAINProject\cnhkmcp\cnhkmcp\untracked\APP\trailSomeAlphas\skills\template_final_enhance\op总结.md
21
+ --------------
22
+ improve the following raw template
23
+ { "template": "({disclosed_intangibles} + {goodwill}) / {tot_asset} * {sales_rev_turn}",
24
+ "idea": "Intangible asset intensity scaled by revenue productivity to measure efficiency of non-physical capital."
25
+ }
26
+ in the template, {} represent datafield set so keep it as that way, you should just return your new template with the operators you choose and properparameter. the output keey the same in json format and try to output as much diverse enhanced template as you can.
27
+ [{
28
+ "enhanced_template": "",
29
+ "idea": ""
30
+ },{
31
+ "enhanced_template": "",
32
+ "idea": ""
33
+ },
34
+ ]
35
+
36
+
37
+
38
+ --------------
39
+ sample output
40
+
41
+ [
42
+ {
43
+ "enhanced_template": "signed_power(group_zscore(winsorize((ts_backfill({disclosed_intangibles},63) + ts_backfill({goodwill},63)) / ts_backfill({tot_asset},63), std=4) * winsorize(ts_backfill({sales_rev_turn},63), std=4), sector), 0.5)",
44
+ "idea": "Sector-neutral intangible capital efficiency with concave transformation (sqrt). Assumes mid-range efficiency differentials are noisy; sub-linear scaling prevents extreme outliers from dominating while preserving rank order."
45
+ },
46
+ {
47
+ "enhanced_template": "trade_when(greater(rank(winsorize(ts_backfill({sales_rev_turn},63), std=4)), 0.6), group_zscore(winsorize((ts_backfill({disclosed_intangibles},63) + ts_backfill({goodwill},63)) / ts_backfill({tot_asset},63), std=4), sector), 0)",
48
+ "idea": "Intangible intensity signal conditioned on high asset productivity (top 40% turnover only). Filters out low-turnover value traps and focuses on efficient knowledge-capital deployers within sector peers."
49
+ },
50
+ {
51
+ "enhanced_template": "ts_zscore(ts_delta(winsorize((ts_backfill({disclosed_intangibles},126) + ts_backfill({goodwill},126)) / ts_backfill({tot_asset},126), std=4), 63), 252) * s_log_1p(group_zscore(winsorize(ts_backfill({sales_rev_turn},21), std=4), sector))",
52
+ "idea": "Time-series momentum in intangible capital intensity (quarterly change) scaled by recent productivity. Captures corporate investment shifts into knowledge assets while compressing extreme productivity outliers via symmetric log transform."
53
+ },
54
+ {
55
+ "enhanced_template": "ts_regression(winsorize((ts_backfill({disclosed_intangibles},63) + ts_backfill({goodwill},63)) / ts_backfill({tot_asset},63) * ts_backfill({sales_rev_turn},63), std=4), group_mean(winsorize((ts_backfill({disclosed_intangibles},63) + ts_backfill({goodwill},63)) / ts_backfill({tot_asset},63) * ts_backfill({sales_rev_turn},63), std=4), log(ts_mean(ts_backfill({close},1),21)), sector), 252, rettype=0)",
56
+ "idea": "CAPM-style residual extracting idiosyncratic intangible efficiency unexplained by size-weighted sector averages. Strips common capital-structure exposure to isolate firm-specific capital allocation skill."
57
+ },
58
+ {
59
+ "enhanced_template": "bucket(rank(group_zscore(winsorize((ts_backfill({disclosed_intangibles},63) + ts_backfill({goodwill},63)) / ts_backfill({tot_asset},63), std=4) * winsorize(ts_backfill({sales_rev_turn},63), std=4), sector)), '0,1,0.2')",
60
+ "idea": "Quintile bucketing of sector-adjusted intangible productivity creating discrete long-short portfolios. Treats middle quintiles as noise (neutral weight), isolating extreme efficient vs inefficient capital allocators."
61
+ }
62
+ ]