{ "schema_version": 1, "frameworks": [ { "qualified_name": "tsBackTesting", "scope": "module", "module": "ts-backtesting", "kind": "framework", "summary": "Strategy backtesting lifecycle with configurable callbacks and portfolio state queries.", "evidence": [ "module/ts-backtesting.md#tsbacktesting" ], "lifecycle": [ { "phase": "construct", "members": [ "tsBackTesting" ], "evidence": [ "module/ts-backtesting.md#tsbacktesting" ] }, { "phase": "configure", "members": [ "tsBackTesting.FBegT", "tsBackTesting.FEndT", "tsBackTesting.FCycle", "tsBackTesting.FGroupType" ], "evidence": [ "module/ts-backtesting.md#tsbacktesting" ] }, { "phase": "schedule", "required": false, "members": [ "tsBackTesting.GetTimeSeries" ], "evidence": [ "module/ts-backtesting.md#gettimeseries" ] }, { "phase": "callback", "members": [ "tsBackTesting.GetTradeOrder" ], "evidence": [ "module/ts-backtesting.md#gettradeorderv_end_t" ] }, { "phase": "execute", "members": [ "tsBackTesting.BackTest" ], "evidence": [ "module/ts-backtesting.md#backtest" ] }, { "phase": "inspect", "members": [ "tsBackTesting.GetTradeData", "tsBackTesting.GetPortfolioReturn", "tsBackTesting.GetGainandLoss" ], "evidence": [ "module/ts-backtesting.md#gettradedatav_beg_tv_end_t", "module/ts-backtesting.md#getportfolioreturn", "module/ts-backtesting.md#getgainandlossv_beg_tv_end_t" ] } ], "configuration": [ { "api": "tsBackTesting.FBegT", "role": "backtest_start", "evidence": [ "module/ts-backtesting.md#fbegt" ] }, { "api": "tsBackTesting.FEndT", "role": "backtest_end", "evidence": [ "module/ts-backtesting.md#fendt" ] }, { "api": "tsBackTesting.FCycle", "role": "rebalance_cycle", "evidence": [ "module/ts-backtesting.md#fcycle" ] }, { "api": "tsBackTesting.FGroupType", "role": "return_schema_discriminator", "contract_evidence_required": true, "evidence": [ "module/ts-backtesting.md#fgrouptype" ] }, { "api": "tsBackTesting.FRateType", "role": "ratio_allocation_mode", "evidence": [ "module/ts-backtesting.md#fratetype" ] }, { "api": "tsBackTesting.FPriceType", "role": "execution_price_mode", "evidence": [ "module/ts-backtesting.md#fpricetype" ] }, { "api": "tsBackTesting.FFeeType", "role": "fee_input_mode", "evidence": [ "module/ts-backtesting.md#ffeetype" ] }, { "api": "tsBackTesting.FOpenVolType", "role": "quantity_open_size_mode", "evidence": [ "module/ts-backtesting.md#fopenvoltype" ] }, { "api": "tsBackTesting.FCloseVolType", "role": "quantity_close_size_mode", "evidence": [ "module/ts-backtesting.md#fclosevoltype" ] } ], "hooks": [ { "api": "tsBackTesting.GetTimeSeries", "required": false, "override": true, "role": "schedule_provider", "evidence": [ "module/ts-backtesting.md#gettimeseries" ] }, { "api": "tsBackTesting.GetTradeOrder", "required": true, "override": true, "role": "trade_or_target_callback", "evidence": [ "module/ts-backtesting.md#gettradeorderv_end_t" ] } ], "state_apis": [ { "api": "tsBackTesting.GetHoldData", "concept": "current_or_historical_holdings", "observation_point": "framework_defined; exact callback timing requires contract evidence", "replacement_allowed": false, "evidence": [ "module/ts-backtesting.md#getholddata" ] }, { "api": "tsBackTesting.GetSurplusFund", "concept": "available_funds_before_trade", "observation_point": "before_current_trade", "replacement_allowed": false, "evidence": [ "module/ts-backtesting.md#getsurplusfund" ] }, { "api": "tsBackTesting.GetNetAssetValue", "concept": "net_asset_value_before_trade", "observation_point": "before_current_trade", "replacement_allowed": false, "evidence": [ "module/ts-backtesting.md#getnetassetvalue" ] }, { "api": "tsBackTesting.GetSellpool", "concept": "sellable_security_quantity", "observation_point": "framework_defined; exact callback timing requires contract evidence", "replacement_allowed": false, "evidence": [ "module/ts-backtesting.md#getsellpool" ] } ], "execution": [ { "api": "tsBackTesting.BackTest", "role": "backtest_entrypoint", "evidence": [ "module/ts-backtesting.md#backtest" ] } ], "result_apis": [ { "api": "tsBackTesting.GetTradeData", "role": "trade_results", "evidence": [ "module/ts-backtesting.md#gettradedatav_beg_tv_end_t" ] }, { "api": "tsBackTesting.GetPortfolioReturn", "role": "portfolio_return", "evidence": [ "module/ts-backtesting.md#getportfolioreturn" ] }, { "api": "tsBackTesting.GetGainandLoss", "role": "profit_and_loss", "evidence": [ "module/ts-backtesting.md#getgainandlossv_beg_tv_end_t" ] } ], "contracts": [ { "id": "ts-backtesting-trade-order", "status": "resolved", "callback": "tsBackTesting.GetTradeOrder", "mode_discriminator": { "api": "tsBackTesting.FGroupType" }, "return_schemas": [ { "id": "ratio-target-holdings", "when": { "FGroupType": "1" }, "result_kind": "target_holdings", "record_shape": "table_array", "fields": [ { "name": "截止日", "type": "date_time", "required": true, "pdf_non_empty": true }, { "name": "代码", "type": "string", "required": true, "pdf_non_empty": true }, { "name": "方向", "type": "integer", "required": false, "default": "1", "pdf_non_empty": true, "values": { "0": "short", "1": "long" } }, { "name": "比例(%)", "type": "numeric", "pdf_non_empty": true, "required_when": [ { "field": "FRateType", "equals": [ "-1" ] } ] }, { "name": "成交价", "type": "numeric", "pdf_non_empty": false, "required_when": [ { "field": "FPriceType", "equals": [ "-1" ] } ], "description": "Provide when FPriceType=-1; otherwise the framework selects the execution price." }, { "name": "乘数", "type": "numeric", "required": false, "pdf_non_empty": false, "default": "1_or_instrument_default" }, { "name": "保证金比例(%)", "type": "numeric", "required": false, "pdf_non_empty": false, "default": "100_or_instrument_default" }, { "name": "开仓费率(%)", "type": "numeric", "required": false, "pdf_non_empty": true, "used_when": [ { "field": "FFeeType", "equals": [ "1" ] } ], "fallback": "tsBackTesting.StockFee" }, { "name": "平仓费率(%)", "type": "numeric", "required": false, "pdf_non_empty": true, "used_when": [ { "field": "FFeeType", "equals": [ "1" ] } ], "fallback": "tsBackTesting.StockFee" } ], "alternate_returns": [ { "type": "empty_array", "meaning": "clear_all_positions" }, { "type": "non_array", "meaning": "skip_current_rebalance", "documented_examples": [ -1, 1 ] } ], "evidence": [ "module/ts-backtesting.md#gettradeorderv_end_t" ] }, { "id": "quantity-trade-details", "when": { "FGroupType": "2" }, "result_kind": "trade_details", "record_shape": "table_array", "fields": [ { "name": "截止日", "type": "date_time", "required": true, "pdf_non_empty": true }, { "name": "代码", "type": "string", "required": true, "pdf_non_empty": true }, { "name": "方向", "type": "integer", "required": false, "default": "1", "pdf_non_empty": true, "values": { "0": "short", "1": "long" } }, { "name": "动作", "type": "integer", "required": true, "compat_default": "0", "pdf_non_empty": true, "values": { "0": "open", "1": "close", "32": "build_option_group", "33": "unlock_option_group" } }, { "name": "成交量", "type": "numeric", "pdf_non_empty": true, "required_when": [ { "field": "FOpenVolType", "equals": [ "1" ], "record_when": { "动作": [ "0" ] } }, { "field": "FCloseVolType", "equals": [ "1" ], "record_when": { "动作": [ "1" ] } } ], "record_required_when": { "动作": [ "32", "33" ] } }, { "name": "成交价", "type": "numeric", "pdf_non_empty": true, "required_when": [ { "field": "FPriceType", "equals": [ "-1" ] } ], "record_required_when": { "动作": [ "32", "33" ] }, "record_constraint_when": { "动作": { "32": "greater_than_zero", "33": "greater_than_zero" } } }, { "name": "资金", "type": "numeric", "required_when": [ { "field": "FOpenVolType", "equals": [ "2" ], "record_when": { "动作": [ "0" ] } } ] }, { "name": "剩余资金占比(%)", "type": "numeric", "required_when": [ { "field": "FOpenVolType", "equals": [ "3" ], "record_when": { "动作": [ "0" ] } } ] }, { "name": "平仓数量占比(%)", "type": "numeric", "required_when": [ { "field": "FCloseVolType", "equals": [ "2" ], "record_when": { "动作": [ "1" ] } } ] }, { "name": "乘数", "type": "numeric", "required": false, "pdf_non_empty": false, "default": "1_or_instrument_default" }, { "name": "保证金比例(%)", "type": "numeric", "required": false, "pdf_non_empty": false, "default": "100_or_instrument_default" }, { "name": "费率(%)", "type": "numeric", "pdf_non_empty": true, "used_when": [ { "field": "FFeeType", "equals": [ "1" ] } ], "record_value_when": { "动作": { "32": 0, "33": 0 } }, "fallback": "tsBackTesting.StockFee" }, { "name": "费用", "type": "numeric", "pdf_non_empty": false, "required_when": [ { "field": "FFeeType", "equals": [ "2" ] } ], "record_value_when": { "动作": { "32": 0, "33": 0 } } }, { "name": "组 ID", "type": "string", "pdf_non_empty": true, "required": false, "applies_when": "option_group_strategy", "required_in_extension": true, "description": "Required as a non-empty shared identifier for option-group rows; empty for ungrouped single-leg rows." }, { "name": "组合类型", "type": "string", "pdf_non_empty": false, "required": false, "applies_when": "option_group_strategy", "description": "Option strategy identifier such as CNSJC or STD; may be empty for single-leg or unrecognized combinations." } ], "record_rules": [ { "when": "option_group_strategy", "rule": "Return all component contracts for a group; rows in the same group share 组 ID, 动作, and 成交量." }, { "when": { "动作": [ "0", "32", "33" ] }, "rule": "Option-group opening, construction, and unlock records use a concrete 成交量; action 1 may instead use 平仓数量占比(%)." }, { "when": { "动作": [ "0" ] }, "rule": "Option-group opening (action 0) uses FOpenVolType=1; fixed-amount and remaining-funds modes are not supported for this action." } ], "alternate_returns": [ { "type": "empty_array", "meaning": "no_trade_at_current_time" } ], "evidence": [ "module/ts-backtesting.md#gettradeorderv_end_t" ] } ], "evidence": [ "module/ts-backtesting.md#gettradeorderv_end_t" ] } ] }, { "qualified_name": "tsbf_ReturnAttribution", "scope": "module", "module": "tsbf-return-attribution", "kind": "framework", "summary": "Return-attribution framework with required portfolio and factor return providers.", "evidence": [ "module/tsbf-return-attribution.md#tsbf_returnattribution" ], "lifecycle": [ { "phase": "construct", "members": [ "tsbf_ReturnAttribution" ], "evidence": [ "module/tsbf-return-attribution.md#tsbf_returnattribution" ] }, { "phase": "configure", "members": [ "tsbf_ReturnAttribution.FEndT", "tsbf_ReturnAttribution.FCycle", "tsbf_ReturnAttribution.FRegMode", "tsbf_ReturnAttribution.FRegCycle", "tsbf_ReturnAttribution.FRegN" ], "evidence": [ "module/tsbf-return-attribution.md#tsbf_returnattribution" ] }, { "phase": "schedule", "members": [ "tsbf_ReturnAttribution.GetTimeSeries" ], "evidence": [ "module/tsbf-return-attribution.md#gettimeseries" ] }, { "phase": "callback", "members": [ "tsbf_ReturnAttribution.GetPortfolioReturn", "tsbf_ReturnAttribution.GetFactorReturn", "tsbf_ReturnAttribution.GetFactorConfig" ], "evidence": [ "module/tsbf-return-attribution.md#getportfolioreturnv_beg_tv_end_tcy", "module/tsbf-return-attribution.md#getfactorreturnv_beg_tv_end_tcy", "module/tsbf-return-attribution.md#getfactorconfig" ] }, { "phase": "inspect", "members": [ "tsbf_ReturnAttribution.RaRegressCoeff", "tsbf_ReturnAttribution.RaRegressTTest", "tsbf_ReturnAttribution.RaRegressRSquare", "tsbf_ReturnAttribution.RaRegressVIF" ], "evidence": [ "module/tsbf-return-attribution.md#raregresscoeff", "module/tsbf-return-attribution.md#raregressttestr_type", "module/tsbf-return-attribution.md#raregressrsquare", "module/tsbf-return-attribution.md#raregressvif" ] } ], "configuration": [ { "api": "tsbf_ReturnAttribution.FEndT", "role": "attribution_end", "evidence": [ "module/tsbf-return-attribution.md#fendt" ] }, { "api": "tsbf_ReturnAttribution.FCycle", "role": "attribution_cycle", "evidence": [ "module/tsbf-return-attribution.md#fcycle" ] }, { "api": "tsbf_ReturnAttribution.FRegMode", "role": "regression_mode", "evidence": [ "module/tsbf-return-attribution.md#fregmode" ] }, { "api": "tsbf_ReturnAttribution.FRegCycle", "role": "regression_cycle", "evidence": [ "module/tsbf-return-attribution.md#fregcycle" ] }, { "api": "tsbf_ReturnAttribution.FRegN", "role": "regression_periods", "evidence": [ "module/tsbf-return-attribution.md#fregn" ] } ], "hooks": [ { "api": "tsbf_ReturnAttribution.GetPortfolioReturn", "required": true, "override": true, "role": "portfolio_return_provider", "evidence": [ "module/tsbf-return-attribution.md#getportfolioreturnv_beg_tv_end_tcy" ] }, { "api": "tsbf_ReturnAttribution.GetFactorReturn", "required": true, "override": true, "role": "factor_return_provider", "evidence": [ "module/tsbf-return-attribution.md#getfactorreturnv_beg_tv_end_tcy" ] }, { "api": "tsbf_ReturnAttribution.GetFactorConfig", "required": false, "override": true, "role": "conditional_factor_config_provider", "evidence": [ "module/tsbf-return-attribution.md#getfactorconfig" ] } ], "state_apis": [], "execution": [], "result_apis": [ { "api": "tsbf_ReturnAttribution.RaRegressCoeff", "role": "regression_coefficients", "evidence": [ "module/tsbf-return-attribution.md#raregresscoeff" ] }, { "api": "tsbf_ReturnAttribution.RaRegressTTest", "role": "regression_t_test", "evidence": [ "module/tsbf-return-attribution.md#raregressttestr_type" ] }, { "api": "tsbf_ReturnAttribution.RaRegressRSquare", "role": "regression_r_square", "evidence": [ "module/tsbf-return-attribution.md#raregressrsquare" ] }, { "api": "tsbf_ReturnAttribution.RaRegressVIF", "role": "regression_vif", "evidence": [ "module/tsbf-return-attribution.md#raregressvif" ] } ], "contracts": [ { "id": "tsbf-return-attribution-portfolio-return", "status": "incomplete", "callback": "tsbf_ReturnAttribution.GetPortfolioReturn", "reason": "The reference names required fields but does not yet provide a complete typed record schema.", "required_next_step": "Record the exact array shape and field types before generating callback records.", "evidence": [ "module/tsbf-return-attribution.md#getportfolioreturnv_beg_tv_end_tcy" ] }, { "id": "tsbf-return-attribution-factor-return", "status": "incomplete", "callback": "tsbf_ReturnAttribution.GetFactorReturn", "reason": "The reference names dynamic factor fields but does not yet provide a complete typed record schema.", "required_next_step": "Record the exact array shape and dynamic factor-field contract before generating callback records.", "evidence": [ "module/tsbf-return-attribution.md#getfactorreturnv_beg_tv_end_tcy" ] } ] }, { "qualified_name": "ts_EvaluationOfRotationSkill", "scope": "module", "module": "ts-evaluation-of-rotation-skill", "kind": "framework", "summary": "Rotation-skill evaluation workflow with one documented entrypoint and result queries.", "evidence": [ "module/ts-evaluation-of-rotation-skill.md#ts_evaluationofrotationskill" ], "lifecycle": [ { "phase": "construct", "members": [ "ts_EvaluationOfRotationSkill" ], "evidence": [ "module/ts-evaluation-of-rotation-skill.md#ts_evaluationofrotationskill" ] }, { "phase": "execute", "members": [ "ts_EvaluationOfRotationSkill.Measure" ], "evidence": [ "module/ts-evaluation-of-rotation-skill.md#measure" ] }, { "phase": "inspect", "members": [ "ts_EvaluationOfRotationSkill.Get_Ret_CfgDescriptionQK", "ts_EvaluationOfRotationSkill.Get_Ret_RotationConductQK", "ts_EvaluationOfRotationSkill.Get_Ret_RotationDescriptionQK", "ts_EvaluationOfRotationSkill.Get_Ret_RotationSkillQK", "ts_EvaluationOfRotationSkill.Get_Ret_CfgSkillQK" ], "evidence": [ "module/ts-evaluation-of-rotation-skill.md#get_ret_cfgdescriptionqkvbegtvendt", "module/ts-evaluation-of-rotation-skill.md#get_ret_rotationconductqkvbegtvendt", "module/ts-evaluation-of-rotation-skill.md#get_ret_rotationdescriptionqkvbegtvendt", "module/ts-evaluation-of-rotation-skill.md#get_ret_rotationskillqkvbegtvendt", "module/ts-evaluation-of-rotation-skill.md#get_ret_cfgskillqkvbegtvendt" ] } ], "configuration": [], "hooks": [], "state_apis": [], "execution": [ { "api": "ts_EvaluationOfRotationSkill.Measure", "role": "workflow_entrypoint", "evidence": [ "module/ts-evaluation-of-rotation-skill.md#measure" ] } ], "result_apis": [ { "api": "ts_EvaluationOfRotationSkill.Get_Ret_CfgDescriptionQK", "role": "configuration_description_results", "evidence": [ "module/ts-evaluation-of-rotation-skill.md#get_ret_cfgdescriptionqkvbegtvendt" ] }, { "api": "ts_EvaluationOfRotationSkill.Get_Ret_RotationConductQK", "role": "rotation_conduct_results", "evidence": [ "module/ts-evaluation-of-rotation-skill.md#get_ret_rotationconductqkvbegtvendt" ] }, { "api": "ts_EvaluationOfRotationSkill.Get_Ret_RotationDescriptionQK", "role": "rotation_description_results", "evidence": [ "module/ts-evaluation-of-rotation-skill.md#get_ret_rotationdescriptionqkvbegtvendt" ] }, { "api": "ts_EvaluationOfRotationSkill.Get_Ret_RotationSkillQK", "role": "rotation_skill_results", "evidence": [ "module/ts-evaluation-of-rotation-skill.md#get_ret_rotationskillqkvbegtvendt" ] }, { "api": "ts_EvaluationOfRotationSkill.Get_Ret_CfgSkillQK", "role": "configuration_skill_results", "evidence": [ "module/ts-evaluation-of-rotation-skill.md#get_ret_cfgskillqkvbegtvendt" ] } ], "contracts": [] }, { "qualified_name": "ts_IndustryAllocationOfFund", "scope": "module", "module": "ts-industry-allocation-of-fund", "kind": "framework", "summary": "Fund-industry allocation workflow with configuration fields and one documented entrypoint.", "evidence": [ "module/ts-industry-allocation-of-fund.md#ts_industryallocationoffund" ], "lifecycle": [ { "phase": "construct", "members": [ "ts_IndustryAllocationOfFund" ], "evidence": [ "module/ts-industry-allocation-of-fund.md#ts_industryallocationoffund" ] }, { "phase": "configure", "members": [ "ts_IndustryAllocationOfFund.FFundsArr", "ts_IndustryAllocationOfFund.FrDate", "ts_IndustryAllocationOfFund.FhyType" ], "evidence": [ "module/ts-industry-allocation-of-fund.md#ts_industryallocationoffund" ] }, { "phase": "execute", "members": [ "ts_IndustryAllocationOfFund.Allocation" ], "evidence": [ "module/ts-industry-allocation-of-fund.md#allocation" ] } ], "configuration": [ { "api": "ts_IndustryAllocationOfFund.FFundsArr", "role": "fund_universe", "evidence": [ "module/ts-industry-allocation-of-fund.md#ffundsarr" ] }, { "api": "ts_IndustryAllocationOfFund.FrDate", "role": "report_date", "evidence": [ "module/ts-industry-allocation-of-fund.md#frdate" ] }, { "api": "ts_IndustryAllocationOfFund.FhyType", "role": "industry_classification", "evidence": [ "module/ts-industry-allocation-of-fund.md#fhytype" ] } ], "hooks": [], "state_apis": [], "execution": [ { "api": "ts_IndustryAllocationOfFund.Allocation", "role": "workflow_entrypoint", "evidence": [ "module/ts-industry-allocation-of-fund.md#allocation" ] } ], "result_apis": [], "contracts": [] }, { "qualified_name": "ts_SameTypeFundEquityPercent", "scope": "module", "module": "fund-research", "kind": "framework", "summary": "Historical same-type fund position measurement with overridable schedules, fund selection, solver customization, caching, and result analysis.", "evidence": [ "module/fund-research/position-estimation.md#ts_sametypefundequitypercent" ], "lifecycle": [ { "phase": "construct", "members": [ "ts_SameTypeFundEquityPercent" ], "evidence": [ "module/fund-research/position-estimation.md#ts_sametypefundequitypercent" ] }, { "phase": "configure", "members": [ "ts_SameTypeFundEquityPercent.FBegT", "ts_SameTypeFundEquityPercent.FEndT", "ts_SameTypeFundEquityPercent.FCycle", "ts_SameTypeFundEquityPercent.FPMOBJ", "ts_SameTypeFundEquityPercent.FVersionId" ], "evidence": [ "module/fund-research/position-estimation.md#ts_sametypefundequitypercent" ] }, { "phase": "schedule", "required": false, "members": [ "ts_SameTypeFundEquityPercent.GetTimeSeries" ], "evidence": [ "module/fund-research/position-estimation.md#gettimeseries" ] }, { "phase": "callback", "required": false, "members": [ "ts_SameTypeFundEquityPercent.GetFundArr", "ts_SameTypeFundEquityPercent.GetStatfundData", "ts_SameTypeFundEquityPercent.GetPMOBJ" ], "evidence": [ "module/fund-research/position-estimation.md#getfundarrvendt", "module/fund-research/position-estimation.md#getstatfunddataregmxarrdayday", "module/fund-research/position-estimation.md#getpmobjvendtfund" ] }, { "phase": "execute", "members": [ "ts_SameTypeFundEquityPercent.BackMeasure" ], "evidence": [ "module/fund-research/position-estimation.md#backmeasure" ] }, { "phase": "inspect", "members": [ "ts_SameTypeFundEquityPercent.GetPMdetail", "ts_SameTypeFundEquityPercent.GetPMdistribution", "ts_SameTypeFundEquityPercent.GetOverAllPM", "ts_SameTypeFundEquityPercent.GetErrorDistribution", "ts_SameTypeFundEquityPercent.GetOverAllErrorAnalysis" ], "evidence": [ "module/fund-research/position-estimation.md#getpmdetailvbegtvendt", "module/fund-research/position-estimation.md#getpmdistributionvbegtvendt", "module/fund-research/position-estimation.md#getoverallpmvbegtvendttype_", "module/fund-research/position-estimation.md#geterrordistributionvbegtvendt", "module/fund-research/position-estimation.md#getoverallerroranalysisvbegtvendt" ] } ], "configuration": [ { "api": "ts_SameTypeFundEquityPercent.FBegT", "role": "measurement_start", "evidence": [ "module/fund-research/position-estimation.md#fbegt" ] }, { "api": "ts_SameTypeFundEquityPercent.FEndT", "role": "measurement_end", "evidence": [ "module/fund-research/position-estimation.md#fendt-1" ] }, { "api": "ts_SameTypeFundEquityPercent.FCycle", "role": "measurement_cycle", "evidence": [ "module/fund-research/position-estimation.md#fcycle-1" ] }, { "api": "ts_SameTypeFundEquityPercent.FPMOBJ", "role": "position_solver", "evidence": [ "module/fund-research/position-estimation.md#fpmobj" ] }, { "api": "ts_SameTypeFundEquityPercent.FVersionId", "role": "cache_mode", "evidence": [ "module/fund-research/position-estimation.md#fversionid" ] } ], "hooks": [ { "api": "ts_SameTypeFundEquityPercent.GetTimeSeries", "required": false, "override": true, "role": "measurement_schedule_provider", "evidence": [ "module/fund-research/position-estimation.md#gettimeseries" ] }, { "api": "ts_SameTypeFundEquityPercent.GetFundArr", "required": false, "override": true, "role": "fund_universe_provider", "evidence": [ "module/fund-research/position-estimation.md#getfundarrvendt" ] }, { "api": "ts_SameTypeFundEquityPercent.GetStatfundData", "required": false, "override": true, "role": "statistical_sample_filter", "evidence": [ "module/fund-research/position-estimation.md#getstatfunddataregmxarrdayday" ] }, { "api": "ts_SameTypeFundEquityPercent.GetPMOBJ", "required": false, "override": true, "role": "per_fund_solver_provider", "evidence": [ "module/fund-research/position-estimation.md#getpmobjvendtfund" ] } ], "state_apis": [], "execution": [ { "api": "ts_SameTypeFundEquityPercent.BackMeasure", "role": "measurement_entrypoint", "evidence": [ "module/fund-research/position-estimation.md#backmeasure" ] } ], "result_apis": [ { "api": "ts_SameTypeFundEquityPercent.GetPMdetail", "role": "position_measurement_details", "evidence": [ "module/fund-research/position-estimation.md#getpmdetailvbegtvendt" ] }, { "api": "ts_SameTypeFundEquityPercent.GetPMdistribution", "role": "position_distribution", "evidence": [ "module/fund-research/position-estimation.md#getpmdistributionvbegtvendt" ] }, { "api": "ts_SameTypeFundEquityPercent.GetOverAllPM", "role": "aggregate_position_measurement", "evidence": [ "module/fund-research/position-estimation.md#getoverallpmvbegtvendttype_" ] }, { "api": "ts_SameTypeFundEquityPercent.GetErrorDistribution", "role": "measurement_error_distribution", "evidence": [ "module/fund-research/position-estimation.md#geterrordistributionvbegtvendt" ] }, { "api": "ts_SameTypeFundEquityPercent.GetOverAllErrorAnalysis", "role": "aggregate_error_analysis", "evidence": [ "module/fund-research/position-estimation.md#getoverallerroranalysisvbegtvendt" ] } ], "contracts": [ { "id": "same-type-fund-universe", "status": "incomplete", "callback": "ts_SameTypeFundEquityPercent.GetFundArr", "reason": "The callback may return either a one-dimensional code array or a two-dimensional table, but the full table schema is not documented.", "required_next_step": "Record the exact two-dimensional fund-universe record schema before generating callback rows.", "evidence": [ "module/fund-research/position-estimation.md#getfundarrvendt" ] } ] }, { "qualified_name": "ts_AIPBackTesting", "scope": "module", "module": "fund-research", "kind": "framework", "summary": "Fund periodic-investment backtesting lifecycle with strategy configuration, overridable purchase and redemption callbacks, execution, and return analysis.", "evidence": [ "module/fund-research/fixed-amount-investment.md#ts_aipbacktesting" ], "lifecycle": [ { "phase": "construct", "members": [ "ts_AIPBackTesting" ], "evidence": [ "module/fund-research/fixed-amount-investment.md#ts_aipbacktesting" ] }, { "phase": "configure", "members": [ "ts_AIPBackTesting.FAIPFund", "ts_AIPBackTesting.FAIPType", "ts_AIPBackTesting.FOriginalAmount", "ts_AIPBackTesting.FPurchaseRatio", "ts_AIPBackTesting.FDeductDay" ], "evidence": [ "module/fund-research/fixed-amount-investment.md#ts_aipbacktesting" ] }, { "phase": "schedule", "required": false, "members": [ "ts_AIPBackTesting.GetTimeSeries" ], "evidence": [ "module/fund-research/fixed-amount-investment.md#gettimeseries" ] }, { "phase": "callback", "members": [ "ts_AIPBackTesting.GetTradeOrder", "ts_AIPBackTesting.GetTA" ], "evidence": [ "module/fund-research/fixed-amount-investment.md#gettradeorderv_end_t", "module/fund-research/fixed-amount-investment.md#gettav_end_t" ] }, { "phase": "execute", "members": [ "ts_AIPBackTesting.BackTest" ], "evidence": [ "module/fund-research/fixed-amount-investment.md#backtest" ] }, { "phase": "inspect", "members": [ "ts_AIPBackTesting.CumReturn", "ts_AIPBackTesting.IntervalReturn" ], "evidence": [ "module/fund-research/fixed-amount-investment.md#cumreturnbeg_tend_trtypeannual", "module/fund-research/fixed-amount-investment.md#intervalreturnbegtendt" ] } ], "configuration": [ { "api": "ts_AIPBackTesting.FAIPFund", "role": "investment_fund", "evidence": [ "module/fund-research/fixed-amount-investment.md#faipfund" ] }, { "api": "ts_AIPBackTesting.FAIPType", "role": "investment_strategy", "contract_evidence_required": true, "evidence": [ "module/fund-research/fixed-amount-investment.md#faiptype" ] }, { "api": "ts_AIPBackTesting.FOriginalAmount", "role": "periodic_investment_amount", "evidence": [ "module/fund-research/fixed-amount-investment.md#foriginalamount" ] }, { "api": "ts_AIPBackTesting.FPurchaseRatio", "role": "purchase_fee_ratio", "evidence": [ "module/fund-research/fixed-amount-investment.md#fpurchaseratio" ] }, { "api": "ts_AIPBackTesting.FDeductDay", "role": "deduction_day", "evidence": [ "module/fund-research/fixed-amount-investment.md#fdeductday" ] } ], "hooks": [ { "api": "ts_AIPBackTesting.GetTimeSeries", "required": false, "override": true, "role": "investment_schedule_provider", "evidence": [ "module/fund-research/fixed-amount-investment.md#gettimeseries" ] }, { "api": "ts_AIPBackTesting.GetTradeOrder", "required": true, "override": true, "role": "purchase_and_redemption_order_provider", "evidence": [ "module/fund-research/fixed-amount-investment.md#gettradeorderv_end_t" ] }, { "api": "ts_AIPBackTesting.GetTA", "required": false, "override": true, "role": "subscription_and_redemption_cashflow_provider", "evidence": [ "module/fund-research/fixed-amount-investment.md#gettav_end_t" ] } ], "state_apis": [], "execution": [ { "api": "ts_AIPBackTesting.BackTest", "role": "backtest_entrypoint", "evidence": [ "module/fund-research/fixed-amount-investment.md#backtest" ] } ], "result_apis": [ { "api": "ts_AIPBackTesting.CumReturn", "role": "interval_return", "evidence": [ "module/fund-research/fixed-amount-investment.md#cumreturnbeg_tend_trtypeannual" ] }, { "api": "ts_AIPBackTesting.IntervalReturn", "role": "periodic_investment_return_series", "evidence": [ "module/fund-research/fixed-amount-investment.md#intervalreturnbegtendt" ] } ], "contracts": [ { "id": "aip-trade-order", "status": "incomplete", "callback": "ts_AIPBackTesting.GetTradeOrder", "reason": "The reference requires purchase and redemption details but does not define the complete typed order-record schema.", "required_next_step": "Record the exact purchase and redemption order fields before generating callback rows.", "evidence": [ "module/fund-research/fixed-amount-investment.md#gettradeorderv_end_t" ] } ] } ] }