简介:作为机构投资者参与私募基金投资前的必备合规环节,这份风险调查问卷(机构版)旨在系统评估机构的财务实力、投资目标与风险承受能力,协助金融机构履行适当性义务。问卷涵盖基本信息、净资产规模、年营业收入、合格投资者确认以及投资目的等核心项目,并附有风险评估评分标准,便于实操中快速划分风险等级,推荐匹配的私募基金产品。
压缩包内含1个docx格式文档,文件大小约15KB,内容为可直接编辑的问卷模板,适用于私募基金管理人、银行私行、财富管理机构等展业场景。已有68人学习使用,说明该模板在行业中具有一定关注度。借助这份问卷,机构能够如实确认自身风险偏好与财务门槛,金融机构也可在合规前提下降低错配风险,提升适当性管理效率。
1. 机构版私募问卷不是表单,是一套可计算的适当性规则
拿到这份《私募基金投资者风险调查问卷(机构版)》时,不少人会把它当成"填完归档的 Word 模板"。但真正做过适当性管理系统的工程师都清楚,机构版和个人版完全是两套逻辑:个人版的核心是 KYC 打分,机构版的核心是合格投资者校验加风险承受力评级,两道门槛缺一不可。净资产不低于 1000 万是硬性准入条件,风险等级决定机构最终能买 R 几的产品——这两件事如果靠人工 Excel 处理,出错只是时间问题。这里把问卷拆成评分规则、校验逻辑和自动再评估触发条件,给出能直接落地的 Python 实现。读完后你能把任何一份同类问卷快速结构化到系统里,而不是继续让它躺在 Word 文档中。
2. 问卷评分标准拆解:机构版四级结构与权重分配
2.1 机构版和个人版评估维度的本质差异
个人版问卷关注年龄、收入、投资经验、可投资资产、风险偏好,最终输出 C1-C5 风险等级。机构版问卷多了两个决定性维度:机构性质与财务合规性。换句话说,个人版先评级后匹配产品,机构版是先验资后评级。问卷开头的"净资产不低于 1000 万元"不是一道打分题,而是一道一票否决题——这直接改变了系统的数据模型,不能把题目统一放进一个 score 字段里。
问卷题目布局也做了分层:基本信息与投资目的是第一层,财务指标是第二层,投资经验与决策流程是第三层,风险偏好与流动性需求是第四层。每一层在系统中的角色不同:基本层用于留痕,财务层用于合格投资者校验,后两层才实际进入风险评分。解析问卷时不能按顺序遍历题目编号,要按题目编号映射到业务字段:
# 问卷章节 → 业务字段映射,解析时按 section 分组落库 SECTION_FIELDS = { "basic_identity": {"inst_type", "legal_rep", "contact", "cert_type"}, "financial_indicator": {"net_assets", "annual_revenue"}, "invest_experience": {"fund_exp", "decision_maker"}, "risk_attitude": {"loss_tolerance", "target_return", "liquidity"}, }这套映射的价值在于问卷版本演进时只需要改配置。比如 2025 年版问卷把"年营业收入"从财务层挪到基本信息层,字段集合不变,落库逻辑也不用动,变化的只是解析配置。实际项目中问卷模板经常微调,把解析逻辑和业务逻辑分开,是维护成本最低的做法。
2.2 百分制评分标准与四个打分维度的分值表
从问卷后附的评分标准来看,采用的是百分制、四维度加权:财务实力 40 分、投资经验 25 分、风险偏好 25 分、流动性需求 10 分。财务实力维度里净资产规模占 30 分、年营业收入占 10 分;投资经验维度里私募基金投资年限占 15 分、投资决策机制占 10 分;风险偏好维度里可承受最大损失占 15 分、预期收益目标占 10 分;流动性需求为单题满分 10 分。
评分标准里分值映射以四级选项为主,每道题四个选项按保守到激进的顺序排列,分值如下。这套映射是依据问卷选项顺序还原的,各家机构落地时可以按自己的评分标准微调:
| 题目模块 | 选项 A | 选项 B | 选项 C | 选项 D | 满分 |
|---|---|---|---|---|---|
| 净资产规模 | 0 | 10 | 20 | 30 | 30 |
| 年营业收入 | 0 | 3 | 6 | 10 | 10 |
| 私募投资年限 | 0 | 5 | 10 | 15 | 15 |
| 投资决策机制 | 0 | 3 | 6 | 10 | 10 |
| 可承受最大损失 | 0 | 5 | 10 | 15 | 15 |
| 预期收益目标 | 0 | 3 | 6 | 10 | 10 |
| 流动性需求 | 0 | 3 | 6 | 10 | 10 |
这里要特别注意"选项 A 得分 0"的语义:它不是"没作答"而是"该维度最低分"。未作答和选 A 在系统里必须区分开,未作答走异常流程,选 A 正常参与计算。之前在实际项目里见过把两者都记 0 分的实现,结果问卷只填一半也能算出等级,这在适当性审查里是直接暴露的合规缺陷。
顺带提一下权重调整的问题。如果公司内部风险政策变化,需要把"投资经验"维度从 25 分上调到 30 分,同时压缩财务实力占比,映射表的分值不是简单的整体缩放,而是每个选项分值的重新分配。改动前先跑一遍历史样本做回测,确认调整后各等级分布没有剧烈偏移,再上线新版本评分标准。
2.3 得分到风险等级的阈值映射
百分制得分按阈值映射到五档风险等级,对应关系参考《证券期货投资者适当性管理办法》的框架:总分 0-30 为 C1 保守型,31-50 为 C2 稳健型,51-70 为 C3 平衡型,71-85 为 C4 积极型,86-100 为 C5 激进型。
| 总分区间 | 风险等级 | 可购买产品范围 |
|---|---|---|
| 0-30 | C1 保守型 | R1 |
| 31-50 | C2 稳健型 | R1-R2 |
| 51-70 | C3 平衡型 | R1-R3 |
| 71-85 | C4 积极型 | R1-R4 |
| 86-100 | C5 激进型 | R1-R5 |
绝大多数私募基金属于 R5 级产品。按适当性规则,只有 C5 机构可以直接申购;C4 机构坚持购买必须补充风险揭示确认,并由机构书面确认愿意承担超出风险承受能力的后果。评分引擎只负责算分,最终是否允许交易是"评分等级 + 特别确认记录"两个条件共同决定的结果,这个组合判断要在交易链路里做,不能依赖前端展示。
3. 用 Python 把问卷落成可执行的风险评分引擎
3.1 定义机构资料模型与评分映射表
先把问卷题目结构化。最直接的做法是用 dataclass 定义机构资料模型,每个字段对应问卷中的一个答案选项。字段值保留问卷自身的字母编号,而不是直接存储分值,这样评分标准调整时只改映射表,不需要迁移历史数据。
from dataclasses import dataclass, asdict @dataclass class InstitutionProfile: inst_type: str # 机构性质: A-国有企事业单位 B-非上市民营企业 C-外资企业 D-上市公司 net_assets: str # 净资产: A-500万以下 B-500万-2000万 C-2000万-1亿 D-1亿以上 annual_revenue: str # 年营业收入四级选项 fund_exp: str # 私募基金投资年限 decision_maker: str # 投资决策机制 loss_tolerance: str # 可承受最大损失 target_return: str # 预期收益目标 liquidity: str # 流动性需求实际对接数据库时,这些字段就是问卷表的结构化列。问卷通过 OCR 或人工录入转成 JSON 后,直接反序列化到这个对象。评分映射表单独写成常量,保持与评估逻辑分离,后续任何评分标准的调整都不需要动函数本体:
SCORING_MATRIX = { "net_assets": {"A": 0, "B": 10, "C": 20, "D": 30}, "annual_revenue": {"A": 0, "B": 3, "C": 6, "D": 10}, "fund_exp": {"A": 0, "B": 5, "C": 10, "D": 15}, "decision_maker": {"A": 0, "B": 3, "C": 6, "D": 10}, "loss_tolerance": {"A": 0, "B": 5, "C": 10, "D": 15}, "target_return": {"A": 0, "B": 3, "C": 6, "D": 10}, "liquidity": {"A": 0, "B": 3, "C": 6, "D": 10}, }映射表是评分标准在代码里的唯一载体。将来评分标准从 100 分制改成 120 分制,或者新增一个"资产负债率"维度,只需改这张表和阈值配置,评估函数完全不需要变。
3.2 评分计算与等级判定函数
评分函数遍历映射表,对每个维度取机构选择对应的分值累加,同时记录分值明细。映射表里没有的答案统一记 0 分,但在明细里标记 INVALID,供上层合规校验识别。
RISK_LEVELS = [ (30, "C1-保守型"), (50, "C2-稳健型"), (70, "C3-平衡型"), (85, "C4-积极型"), (100, "C5-激进型"), ] def evaluate(profile: InstitutionProfile) -> dict: """计算机构风险承受力得分与等级""" total = 0 details = {} invalid = [] for key, score_map in SCORING_MATRIX.items(): answer = getattr(profile, key, "E") # 缺省视为无效答案 if answer not in score_map: invalid.append(key) details[key] = {"answer": answer, "score": 0, "status": "INVALID"} continue score = score_map[answer] details[key] = {"answer": answer, "score": score, "status": "OK"} total += score level = "UNRATED" for threshold, name in RISK_LEVELS: if total <= threshold: level = name break return { "total_score": total, "level": level, "details": details, "invalid_fields": invalid, "passed": len(invalid) == 0, }逻辑说明:getattr(profile, key, "E")用缺省值 "E" 兜底,防止某个字段漏填导致 KeyError;RISK_LEVELS 按阈值升序排列,遍历时第一次满足 total ≤ threshold 就返回对应等级,86-100 分自然落到 C5;invalid 列表记录所有无效答案,评分函数本身不拒绝任何输入,判定权交给上层校验逻辑。
提示:某个维度得 0 分有两种可能——选了选项 A(最低档)或者没作答。details 里的 status 必须能把这两种情况分开,评分结论页只允许展示 OK 状态下的得分,INVALID 状态一律拦截。
实际跑数据时如果发现某机构得分异常,优先检查原始问卷里答案字母是否被 OCR 识别错误,比如把 B 识别成 8、把 D 识别成 O。这类脏数据进不到评分逻辑里,因为答案不在映射表中,会被 invalid_fields 拦下来,但拦截的代价是工单滞留。所以解析问卷时要对答案字段做白名单校验,只接受 A/B/C/D 四个字母,从源头过滤。
3.3 结构化输出与版本归档
评分结果建议直接序列化成 JSON 存入适当性管理系统,作为留痕证据的一部分。展示端再把 details 渲染成问卷样式的表格,或者生成 PDF 附件归档。
import json def build_record(profile: InstitutionProfile) -> str: result = evaluate(profile) record = { "profile": asdict(profile), "evaluation": result, "evaluated_at": "2025-01-15 10:30:00", "operator": "system@fund_company", "version": "survey_inst_2024_v3", } return json.dumps(record, ensure_ascii=False, indent=2)version 字段是关键。适当性监管要求评分标准和问卷版本可追溯,同一机构在不同年份做的问卷,版本不同评分标准也可能不同。归档必须带版本号,否则审计时无法解释为什么同一机构前后风险等级发生变化。evaluated_at 建议取数据库时间戳而不是应用服务器本地时间,避免大批量操作时时间精度不一致。
4. 合格投资者校验边界:一票否决与异常数据拦截
4.1 净资产门槛的硬校验实现
合格投资者校验必须先于评分执行。机构净资产不低于 1000 万是法定门槛。问卷里净资产题目选 A(500 万以下)直接判不通过;选 B(500 万-2000 万)属于边界区间,不能直接放行,要补充净资产审计报告或财务报表确认实际净资产不低于 1000 万;选 C 或 D 默认通过,留待审计抽查。
def check_qualified(profile: InstitutionProfile, verified_net_assets: float | None = None) -> dict: """合格投资者校验;verified_net_assets 为审计确认值(万元)""" q = profile.net_assets if q == "A": return {"pass": False, "reason": "净资产低于500万,未达1000万门槛"} if q == "B": if verified_net_assets is None: return {"pass": "PENDING", "reason": "净资产区间含混,需补充审计报告确认是否≥1000万"} if verified_net_assets >= 1000: return {"pass": True, "reason": f"经审计确认净资产{verified_net_assets}万元"} return {"pass": False, "reason": "审计确认净资产未达1000万门槛"} return {"pass": True, "reason": "净资产区间明确高于门槛"}PENDING 状态是这套校验里容易被忽略的设计。实际项目里如果只做 pass/fail 两态,选 B 的机构会被一刀切拒绝或放行,前者误伤合格机构、后者埋合规隐患。三态设计配合人工审核工单,是适当性管理系统里比较稳妥的取舍。
从排错角度看,如果机构反馈"我们明明满足了条件却被拒",优先查 verified_net_assets 参数有没有从人工审核模块传进来。这个参数是独立于问卷之外的确认值,很多实现在问卷校验时忘了带上它,导致所有选 B 的机构都被 PENDING 卡住,形成大面积工单积压。
4.2 机构性质与财务数据的交叉验证
机构性质对净资产、营业收入选项有明显约束。比如选 D(上市公司)但净资产选 B(500 万-2000 万)基本不可能,A 股上市公司净资产绝大多数远超这个区间;选 A(国有企事业单位)但年收入选最低档也需要警惕。这类矛盾不一定代表机构弄虚作假,但必须人工核实,不能直接进评分流程。
| 机构性质 | 净资产约束 | 校验动作 |
|---|---|---|
| 上市公司 | 必须 ≥ C 档 | 与公开财报交叉核对,不一致退回 |
| 国有企事业单位 | 不做硬约束 | 确认净资产选项与审计报告一致 |
| 外资企业 | 不做硬约束 | 确认净资产口径为境内法人主体 |
| 非上市民营企业 | 不做硬约束 | 抽检财务报表 |
外资企业这里有个容易踩坑的点:境外母公司的净资产不能算进境内法人机构的净资产,问卷填的是境内法人主体自身的数据。系统字段必须明确是"境内法人净资产"还是"合并口径净资产",解析问卷时在元数据里标注口径,避免后续审计时产生争议。
4.3 综合判定优先级与失效降级处理
把合格投资者校验和评分结果放到一起做综合判定。前面评分函数的 invalid_fields 在这里派上用场:只要有一个维度没有有效答案,评分结果就不能作为适当性依据,系统进入"待完善"状态而不是给默认低分。
def decide_eligibility(profile: InstitutionProfile, verified_net_assets: float | None = None) -> dict: qual = check_qualified(profile, verified_net_assets) eval_result = evaluate(profile) if qual["pass"] is False: return {"decision": "REJECT_HARD", "detail": qual} if qual["pass"] == "PENDING": return {"decision": "REJECT_MANUAL_REVIEW", "detail": qual} if not eval_result["passed"]: return {"decision": "REJECT_INCOMPLETE", "detail": {"invalid": eval_result["invalid_fields"]}} return {"decision": "ALLOW", "level": eval_result["level"], "product_max_risk": "R5" if eval_result["level"] == "C5" else "R4"}判定优先级是:合格投资者硬性拒绝 > 边界待人工复核 > 问卷完整性 > 风险等级。这个顺序不能反,反了就会出现净资产不达标但风险等级是 C5 的机构被放行到申购环节。问卷有效期建议在系统里配置为一年,到期前 30 天自动生成再评估任务;机构发生重大变更(净资产大幅下降、经营范围变更、法定代表人变更)时立即触发重新评估,而不是等问卷自然到期。
5. 评分引擎接入适当性管理流程的几个落地技巧
先讲触发时机。制度上要求"了解客户"信息发生重大变化时重新评估,但"重大变化"的标准要翻译成运营人员能执行的规则。我习惯在机构资料表上加一个 risk_review_triggers 字段,存 JSON 规则数组:
[ {"event": "net_assets_decline_30pct", "action": "immediate_reassess"}, {"event": "questionnaire_expire_30d", "action": "pending_review"}, {"event": "legal_rep_change", "action": "reassess"} ]运营系统消费这些规则生成待办工单,技术侧不用每次改代码。第二个技巧是评分标准做成配置而不是写死在代码里。前面 SCORING_MATRIX 已经和评估逻辑分离,生产环境更灵活的存法是把映射表放数据库或独立配置表,版本号与问卷模板版本关联。评分标准修改后,历史评估记录保留旧版本得分明细,新评估使用新版本,审计对照时结构清晰。
第三个技巧是留痕字段不要省。监管人员现场检查时通常要求调取任意一笔申购对应的适当性全链路:问卷原文件、评分明细、风险等级、产品风险等级、特别确认函、复核人意见。我在归档表里固定放 audit_trail 字段,用 JSON 存 questionnaire_file_hash、scoring_version、evaluator、review_operator 和时间戳,查询时一条 SQL 就能拼出完整链路。最后提醒一个容易忽视的点:评分引擎输出的风险等级与产品匹配关系,要在交易系统里做硬校验,而不是只在营销端做提示。申购接口调用时实时查询该机构当前风险等级与产品风险等级,不匹配直接拒绝并返回错误码,错误码对应到适当性规则条款。这样即使前端绕过页面,后端交易链路也能堵住。
本文还有配套的精品资源,点击获取