策略类型:可持续因子驱动 × 自进化Skill框架
核心逻辑:将可持续投资逻辑结构化为策略协议(Strategy Protocol),通过版本管理(Version Management)和样本隔离(Sample Isolation)实现策略的自动迭代进化,而非无约束参数搜索。
适用市场:沪深A股(主板、科创板、创业板、北交所)
版本说明:v1.0 — 初始版本,融合华泰金工自进化Skill三框架 + A股ESG评分体系 + 可持续因子库
策略协议是将投资逻辑、可调边界、约束条件写入Skill的核心层,确保迭代方向符合可持续投资研究规范。
# scripts/sustainability_strategy_protocol.py
STRATEGY_PROTOCOL = {
# 策略元信息
"strategy_name": "A股可持续因子策略",
"version": "1.0.0",
"author": "RealGreen AI",
"created_date": "2025-01-01",
"last_updated": "2025-01-01",
# 可持续投资逻辑约束(硬约束,不可越过)
"investment_logic": {
"core_principle": "可持续价值成长 — 兼顾ESG质量与长期成长性",
"esg_minimum": {
"ESG总分": 60, # 综合ESG最低60分(百分制)
"E环境": 50, # 环境维度最低门槛
"S社会": 50, # 社会维度最低门槛
"G治理": 55, # 治理维度门槛略高(A股特色)
},
"exclusion_sectors": [
"象牙/稀有皮革", "军工武器制造", "博彩业",
"传统烟草制造", "场外衍生品"
],
"controversial_activities_threshold": {
"adult_content": 0.0, # 成人内容:零容忍
"gambling": 0.0, # 博彩:零容忍
"tobacco": 0.1, # 烟草:营收占比>10%排除
"alcohol": 0.2, # 酒精:营收占比>20%排除
"nuclear": 0.0, # 核武器:零容忍
"coal_power": 0.3, # 燃煤发电:营收占比>30%排除
},
},
# 可调边界参数(可在版本迭代中调整)
"adjustable_bounds": {
"esg_top_percentile": {"min": 0.20, "max": 0.50, "default": 0.30},
"sustainability_score_min": {"min": 50, "max": 80, "default": 60},
"financial_quality_min": {"min": 30, "max": 60, "default": 40},
"value_weight": {"min": 0.10, "max": 0.40, "default": 0.20},
"growth_weight": {"min": 0.10, "max": 0.40, "default": 0.20},
"momentum_lookback_days": {"min": 20, "max": 120, "default": 60},
},
# 组合约束(硬约束)
"portfolio_constraints": {
"max_stock_weight": 0.05, # 单票最大5%
"max_industry_weight": 0.25, # 单行业最大25%
"min_daily_volume": 10_000_000, # 最小日均成交额(元)
"min_stocks": 30, # 最小持仓数
"max_stocks": 100, # 最大持仓数
"turnover_rate_target": {"min": 0.20, "max": 1.0}, # 换手率目标区间
},
# A股特有风险约束(硬约束)
"astock_risk_bounds": {
"max_pledge_ratio": 0.30, # 股权质押≤30%
"max_goodwill_ratio": 0.30, # 商誉/净资产≤30%
"max_related_party_tx": 0.20, # 关联交易≤20%
"exclude_st": True, # 排除ST/*ST
"exclude_suspended": True, # 排除停牌股
"exclude_newly_listed_days": 90, # 排除上市不足90天
"violation_lookback_days": 365, # 违规追溯期(天)
},
}
每次策略迭代生成新版本,保留完整历史记录。
# scripts/version_manager.py
class StrategyVersionManager:
"""
策略版本管理器
每次迭代记录:版本号、参数变更、原因、评价结果
"""
def __init__(self, db_path="outputs/strategy_versions.db"):
self.db_path = db_path
self._init_db()
def create_version(self, strategy_name, params, reason, signals):
"""创建新版本"""
version_id = self._generate_version_id()
evaluation = self._run_evaluation(signals)
record = {
"version_id": version_id,
"strategy_name": strategy_name,
"timestamp": datetime.now(),
"params": json.dumps(params),
"reason": reason,
"evaluation": evaluation,
"status": "candidate" # candidate / approved / rejected
}
self._save_record(record)
return version_id
def compare_versions(self, version_a, version_b):
"""对比两个版本的绩效差异"""
pass
def get_best_version(self, metric="sharpe_ratio"):
"""按指定指标返回最优版本"""
pass
版本命名规范:v{主版本}.{次版本}.{修订号}
防止信息泄露,确保评价结果可信。
# scripts/sample_isolation.py
class SampleIsolationEngine:
"""
样本隔离引擎
三重隔离:时间隔离 + 行业隔离 + 因子隔离
"""
def __init__(self):
self.train_window = 252 * 3 # 训练集:3年
self.warmup_window = 60 # 预热期:60天
self.test_window = 252 # 测试集:1年
self.purge_window = 20 # purge期:20天(防止look-ahead bias)
def split_samples(self, df_prices, df_factors):
"""三重样本划分"""
# 1. 时间隔离:训练/测试严格分离
train_period = df_prices.index[:-self.test_window]
test_period = df_prices.index[-self.test_window:]
# 2. 行业隔离:确保测试集行业分布稳定
# (如果测试期行业构成变化过大需额外处理)
# 3. 因子隔离:确保因子值无未来信息泄露
df_factors = self._apply_purge(df_factors, self.purge_window)
return train_period, test_period, df_factors
def run_kfold_purged_cv(self, df, n_splits=5, embargo_pct=0.1):
"""K折Purge交叉验证(防止过度拟合)"""
pass
# 可持续因子数据源
sustainability_raw = {
# ESG评级数据(优先级从高到低)
"primary_esg": {
"Wind ESG": "8000+公司,月更新,200+指标",
"华证ESG": "与SASB对齐,季度更新",
},
"secondary_esg": {
"中证ESG": "本土特色(扶贫权重高)",
"富时罗素ESG": "国际标准对齐",
},
# 可持续特色因子数据
"sustainability_data": {
"carbon_intensity": "碳排放强度(吨CO2/万元营收)",
"green_revenue_ratio": "绿色营收占比",
"renewable_energy_pct": "可再生能源使用比例",
"safety_incident_rate": "安全生产事故率",
"employee_satisfaction": "员工满意度(若有)",
"supply_chain_esg": "供应链ESG审查覆盖比例",
"community_investment": "社区投资额/营收",
"tax_paid_per_revenue": "税负透明度(支付的各项税费/营收)",
},
# 财务因子
"financial_raw": {
"value_factors": ["PB", "PE", "PS", "PCF", "EV/EBITDA"],
"quality_factors": ["ROE", "ROA", "gross_margin", "debt_ratio", "cash_ratio"],
"growth_factors": ["revenue_yoy", "profit_yoy", "cash_flow_yoy"],
"momentum_factors": ["return_20d", "return_60d", "return_120d"],
# A股特有质量因子
"astock_quality": ["audit_opinion", "cash_conversion_cycle", "accrual_ratio"],
},
}
# scripts/sustainability_scorer.py
from sustainability_scorer import (
build_sustainability_score,
add_policy_orientation_score,
add_green_premium_factor,
add_transition_risk_factor,
)
# 基础可持续评分(E×0.35 + S×0.30 + G×0.35,行业标准化)
df_sust = build_sustainability_score(df_esg, industry_mapping="sw_level1")
# 政策导向加分(A股特色)
df_sust = add_policy_orientation_score(df_sust)
# 输出:policy_score(新质生产力、碳中和、专精特新等政策加成)
# 绿色溢价因子(绿色业务占比×绿色溢价系数)
df_sust = add_green_premium_factor(df_sust)
# 输出:green_premium_factor
# 转型风险因子(高碳行业低碳转型能力评分)
df_sust = add_transition_risk_factor(df_sust)
# 输出:transition_risk_score
from screening_model import AStockRiskFilter
risk_filter = AStockRiskFilter(
max_pledge_ratio=0.30,
max_goodwill_ratio=0.30,
max_related_tx=0.20,
exclude_st=True,
exclude_suspended=True,
exclude_newly_listed_days=90,
violation_lookback_days=365,
)
df_filtered = risk_filter.apply(df_sust)
from sustainability_screening import SustainableFactorScreener
screener = SustainableFactorScreener(
# 策略协议参数(来自Step 1定义的协议)
protocol=STRATEGY_PROTOCOL,
# 可持续因子筛选配置
sustainability_top_pct=0.30, # 可持续评分前30%入选
min_sustainability_score=60, # 可持续评分最低门槛
min_esg_subscore={
"E": 50, "S": 50, "G": 55,
},
# 多因子权重配置(可在版本迭代中调整)
factor_weights={
"sustainability_score": 0.40, # 可持续评分
"financial_quality": 0.20, # 财务质量
"value_factor": 0.20, # 估值价值
"growth_factor": 0.20, # 成长性
},
# 可持续特色筛选
green_revenue_min=0.10, # 绿色营收最低占比
exclude_fossil_fuels=True, # 排除化石燃料开采
exclude_tobacco=True, # 排除烟草
# 板块差异化
board_bonus={"科创板": 0.10, "创业板": 0.05},
)
screened = screener.screen(df_filtered)
from portfolio_builder import build_sustainable_portfolio
portfolio = build_sustainable_portfolio(
screened,
# 组合约束(来自策略协议)
max_w=0.05,
max_ind_w=0.25,
min_liquidity=10_000_000,
min_stocks=30,
max_stocks=100,
# 可持续特色约束
min_green_holdings=0.50, # 绿色持仓占比≥50%
max_fossil_exposure=0.05, # 化石燃料敞口≤5%
min_diversity_score=0.30, # 组合多样性(行业/板块分散度)
)
from backtest_engine import run_backtest
from version_manager import StrategyVersionManager
# 创建版本管理器
vm = StrategyVersionManager()
# 运行回测
bt_results = run_backtest(
signal_df=portfolio,
test_period="2022-01-01", # 样本隔离:训练期外
benchmark="000300.SH",
initial_capital=100_000_000,
transaction_cost=0.0015,
slippage=0.001,
)
# 评估结果
evaluation = {
"annual_return": bt_results["annual_return"],
"sharpe_ratio": bt_results["sharpe_ratio"],
"max_drawdown": bt_results["max_drawdown"],
"turnover_rate": bt_results["turnover_rate"],
"sustainability_score_avg": bt_results["avg_esg_score"],
}
# 创建策略新版本记录
if evaluation["sharpe_ratio"] > 0.7:
new_version = vm.create_version(
strategy_name="A股可持续因子策略",
params=screener.get_current_params(),
reason="夏普比率突破0.7,调整可持续评分权重",
signals=portfolio,
)
print(f"✅ 新版本已创建: {new_version}")
else:
print("⚠️ 当前版本未达标,需进一步迭代")
| 类别 | 因子名称 | 适用行业 | 权重建议 | 预期方向 |
|---|---|---|---|---|
| ------ | --------- | --------- | --------- | --------- |
| E环境 | 碳排放强度 | 全行业 | 0.15 | 负向 |
| 能耗强度(万元GDP) | 高耗能行业 | 0.10 | 负向 | |
| 环保研发投入比 | 全行业 | 0.08 | 正向 | |
| 可再生能源使用比例 | 电力/制造 | 0.08 | 正向 | |
| 绿色营收占比 | 全行业 | 0.10 | 正向 | |
| 环境违规记录 | 全行业 | 0.05 | 负向(硬约束) | |
| S社会 | 员工利润率 | 全行业 | 0.08 | 正向 |
| 安全生产评分 | 工业/制造 | 0.10 | 正向 | |
| 社区投资占比 | 全行业 | 0.05 | 正向 | |
| 供应链ESG覆盖 | 制造业/零售 | 0.07 | 正向 | |
| 数据安全事件 | 互联网/金融 | 0.05 | 负向 | |
| G治理 | 股权质押比例 | 全行业 | 0.08 | 负向 |
| 独董比例 | 全行业 | 0.05 | 正向 | |
| 商誉风险 | 全行业 | 0.08 | 负向 | |
| 关联交易透明度 | 全行业 | 0.05 | 正向 | |
| 税负透明度 | 全行业 | 0.05 | 正向 | |
| 政策导向 | 碳中和受益度 | 新能源/绿电 | 0.10 | 正向 |
| 专精特新认定 | 科创/创业板 | 0.08 | 正向 | |
| 国产替代贡献 | 半导体/高端制造 | 0.08 | 正向 | |
| 乡村振兴参与 | 农业/消费品 | 0.05 | 正向 |
# references/industry_sustainability_weights.py
INDUSTRY_WEIGHTS = {
# 行业:(E权重, S权重, G权重)
"煤炭": (0.40, 0.25, 0.35), # E权重高,关注转型风险
"钢铁": (0.35, 0.30, 0.35),
"电力": (0.40, 0.25, 0.35), # E权重高,关注清洁能源转型
"化工": (0.35, 0.30, 0.35),
"半导体": (0.20, 0.30, 0.50), # G权重高,关注国产替代+治理
"新能源": (0.45, 0.25, 0.30), # E权重极高
"医药": (0.15, 0.40, 0.45), # S+G权重高,关注产品安全+研发
"食品饮料": (0.10, 0.45, 0.45), # S权重高,关注食品安全
"互联网": (0.10, 0.40, 0.50), # S+G权重高,关注数据安全+员工关怀
"银行": (0.15, 0.30, 0.55), # G权重极高,关注资产质量+合规
"保险": (0.10, 0.35, 0.55),
"房地产": (0.30, 0.30, 0.40),
"传媒": (0.05, 0.50, 0.45), # S权重高,关注内容合规
"轻工制造": (0.20, 0.40, 0.40),
"汽车": (0.30, 0.30, 0.40),
}
SUSTAINABILITY_STRATEGY_PARAMS = {
# 策略协议参数
"strategy_version": "1.0.0",
"core_principle": "可持续价值成长",
"esg_minimum_total": 60,
"esg_minimum_E": 50,
"esg_minimum_S": 50,
"esg_minimum_G": 55,
# 可持续因子权重
"sustainability_score_weight": 0.40,
"financial_quality_weight": 0.20,
"value_factor_weight": 0.20,
"growth_factor_weight": 0.20,
# 筛选参数
"sustainability_top_pct": 0.30,
"min_sustainability_score": 60,
"green_revenue_min": 0.10,
"financial_min_percentile": 40,
# 组合约束
"max_stock_weight": 0.05,
"max_industry_weight": 0.25,
"min_stocks": 30,
"max_stocks": 100,
"min_liquidity": 10_000_000,
"min_green_holdings": 0.50,
# 调仓参数
"rebalance_freq": "quarterly",
# A股特有风险参数(来自策略协议)
"max_pledge_ratio": 0.30,
"max_goodwill_ratio": 0.30,
"max_related_tx": 0.20,
"exclude_st": True,
"exclude_suspended": True,
"exclude_newly_listed_days": 90,
# 样本隔离参数
"train_window_days": 756, # 训练窗口:3年
"test_window_days": 252, # 测试窗口:1年
"purge_window_days": 20, # Purge窗口:20天
# 评价指标(版本迭代参照)
"evaluation_metrics": {
"target_sharpe": 0.70,
"max_acceptable_drawdown": 0.20,
"target_annual_return": 0.10,
"max_turnover_rate": 1.0,
},
}
策略自动迭代在以下条件满足时触发:
ITERATION_TRIGGERS = {
"ic_decay": {
"threshold": 0.02, # IC衰减至<0.02触发
"lookback": 60, # 近60天IC均值
},
"rolling_performance": {
"threshold": 0.80, # 滚动年化收益<基准×0.80触发
"window": 252, # 滚动窗口
},
"factor_boundary_breach": {
"description": "可调边界参数触及边界时触发(需重新搜索最优值)",
},
"scheduled": {
"frequency": "quarterly", # 每季度定期评估
},
}
# 允许迭代的参数及搜索范围(来自adjustable_bounds)
SEARCH_SPACE = {
"esg_top_percentile": np.linspace(0.20, 0.50, 7),
"sustainability_score_min": [50, 55, 60, 65, 70],
"financial_quality_min": [30, 35, 40, 45, 50],
"value_weight": np.linspace(0.10, 0.40, 7),
"growth_weight": np.linspace(0.10, 0.40, 7),
"green_revenue_min": [0.05, 0.10, 0.15, 0.20],
}
VERSION_APPROVAL_CRITERIA = {
"must_pass": [
"样本外夏普比率 > 0.60",
"样本外年化收益率 > 基准指数收益",
"样本外最大回撤 < 25%",
"绿色持仓占比 ≥ 50%",
"无新增重大违规记录",
],
"improvement_required": [
"夏普比率提升 ≥ 5%(相比上一版本)",
"或年化收益提升 ≥ 3%(相比上一版本)",
"或换手率下降 ≥ 10%(相比上一版本)",
],
"version_guardrails": [
"单次参数调整幅度 ≤ 20%(防止剧烈跳变)",
"最多连续拒绝3次新版本后需人工介入",
"每年强制人工review一次策略协议",
],
}
执行策略后输出:
| 文件 | 内容 | 何时读取 |
|---|---|---|
| ------ | ------ | --------- |
| references/industry_sustainability_weights.py | 30+行业E/S/G权重配置 | 构建可持续评分时 |
| references/parameter_tuning.md | 参数调优指南与回测框架 | 参数优化时 |
| references/sustainability_factors.md | 可持续因子详细说明 | Step 2因子构建时 |
| references/version_approval.md | 版本接受标准详细说明 | 版本评估时 |
| scripts/sustainability_scorer.py | 可持续评分核心代码 | 执行评分时 |
| scripts/sustainability_strategy_protocol.py | 策略协议定义代码 | 策略初始化时 |
本Skill生成的策略代码和参数仅供研究参考,不构成投资建议。回测结果不代表未来收益,A股市场存在政策风险、流动性风险等多种不确定因素。策略自进化需在严格的版本管理框架下进行,人工review不可省略。
共 1 个版本