3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
get_fundamentals 接口获取相关财务数据,并计算 Z-Score 实现自动化财务避雷。\n\n---\n\n## 一、 Altman Z-Score 模型公式\n\n针对制造业及一般上市公司,经典的 Altman Z-Score 计算公式如下:\n\n$$Z = 1.2X_1 + 1.4X_2 + 3.3X_3 + 0.6X_4 + 0.999X_5$$\n\n各项指标含义及 PTrade 对应数据源:\n\n1. $X_1$ = 营运资金 / 总资产 (Working Capital / Total Assets)\n * 营运资金 = 流动资产 - 流动负债\n * 数据表:balance_statement (字段:total_current_assets, total_current_liability, total_assets)\n2. $X_2$ = 留存收益 / 总资产 (Retained Earnings / Total Assets)\n * 留存收益 = 未分配利润 + 盈余公积\n * 数据表:balance_statement (字段:retained_profit, surplus_reserve_fund, total_assets)\n3. $X_3$ = 息税前利润 (EBIT) / 总资产 (EBIT / Total Assets)\n * 数据表:profit_ability (字段:ebit) 及 balance_statement (字段:total_assets)\n4. $X_4$ = 股东权益市值 / 负债总额 (Market Value of Equity / Total Liabilities)\n * 股东权益市值 = A股总市值 (total_value)\n * 数据表:valuation (字段:total_value) 及 balance_statement (字段:total_non_current_liability + total_current_liability)\n5. $X_5$ = 营业收入 / 总资产 (Sales / Total Assets)\n * 数据表:income_statement (字段:operating_revenue) 及 balance_statement (字段:total_assets)\n\n### Z-Score 风险判定标准:\n* Z > 2.99:财务状况健康(安全区)\n* 1.81 ≤ Z ≤ 2.99:存在财务隐患(灰色区)\n* Z < 1.81:破产风险极高(危险区,建议剔除)\n\n---\n\n## 二、 PTrade 策略实现源码\n\n以下是在 PTrade 中计算 Altman Z-Score 并剔除危险区股票的完整实现逻辑:\n\npython\nimport pandas as pd\nimport numpy as np\n\ndef initialize(context):\n # 设置初始股票池(以中证800为例)\n g.security_list = get_index_stocks('000906.XBHS')\n set_universe(g.security_list)\n # 每日盘前运行风控筛选\n run_daily(context, filter_high_risk_stocks, time='09:15')\n\ndef before_trading_start(context, data):\n pass\n\ndef filter_high_risk_stocks(context):\n stocks = g.security_list\n \n # 1. 获取资产负债表数据\n bs_fields = ['total_current_assets', 'total_current_liability', 'total_assets', \n 'retained_profit', 'surplus_reserve_fund', 'total_non_current_liability']\n df_bs = get_fundamentals(stocks, 'balance_statement', fields=bs_fields)\n \n # 2. 获取利润表数据\n df_is = get_fundamentals(stocks, 'income_statement', fields=['operating_revenue'])\n \n # 3. 获取盈利能力表数据 (EBIT)\n df_pa = get_fundamentals(stocks, 'profit_ability', fields=['ebit'])\n \n # 4. 获取市值数据\n df_val = get_fundamentals(stocks, 'valuation', fields=['total_value'])\n \n # 合并财务数据\n df = df_bs.merge(df_is, left_index=True, right_index=True)\n df = df.merge(df_pa, left_index=True, right_index=True)\n df = df.merge(df_val, left_index=True, right_index=True)\n \n # 计算各项比率\n working_capital = df['total_current_assets'] - df['total_current_liability']\n total_liability = df['total_current_liability'] + df['total_non_current_liability']\n retained_earnings = df['retained_profit'] + df['surplus_reserve_fund']\n \n x1 = working_capital / df['total_assets']\n x2 = retained_earnings / df['total_assets']\n x3 = df['ebit'] / df['total_assets']\n x4 = df['total_value'] / total_liability\n x5 = df['operating_revenue'] / df['total_assets']\n \n # 计算 Z-Score\n z_score = 1.2 * x1 + 1.4 * x2 + 3.3 * x3 + 0.6 * x4 + 0.999 * x5\n \n # 过滤出 Z-Score > 1.81 的安全股票\n safe_stocks = z_score[z_score > 1.81].index.tolist()\n \n log.info(f"原始股票池数量: {len(stocks)}, 避雷后安全股票数量: {len(safe_stocks)}")\n # 更新可交易股票池\n g.trade_universe = safe_stocks\n set_universe(g.trade_universe)\n\ndef handle_data(context, data):\n # 在此处编写具体的买卖交易逻辑\n pass\n\n\n---\n\n## 三、 注意事项与优化建议\n\n1. 适用行业:Altman Z-Score 模型最初专为制造业设计。金融类(银行、券商、保险)公司由于负债结构特殊,不适用此模型。\n2. 数据频率与限流:PTrade 的 get_fundamentals 接口有流量限制,建议在 before_trading_start 或 run_daily 阶段统一获取并计算,避免在 handle_data 中频繁高频调用。\n3. 结合其他避雷指标:可配合 filter_stock_by_status 接口进一步剔除 ST、停牌和退市风险股票,确保策略运行的稳健性。