/** 回测报告说明：略口语、含数值方向与优劣判断（无统一标准的不写「越大越好」） */

export const REPORT_STOCK_GRID_TIPS = {
  enum: '逐只股票在枚举阶段的明细：机会数、完整度、平均间隔等。可搜索与排序，用于对照总体指标。',
  price: '逐只股票在价格回测中的明细：代码、名称、平均收益（ROI）、胜率、机会总数、平均交易时长、过期比例等。默认按 ROI 降序；点击代码可进入单股 K 线与交易标注。',
  capital: '逐只股票在资金模拟中的明细：交易次数、累计盈亏、胜率等。便于定位拖累或贡献较大的个股。',
};

export const ENUM_SECTION_TIPS = {
  overview: '汇总机会数量与完成比例，用于判断样本是否充足、结果是否可信。',
  stockStats: '观察机会在股票间的分布是否均衡；下方柱状图为「每股机会数」的分布形态。',
  timing: '观察机会在时间上的疏密与持续长度，评估是否易出现集中触发。',
  tradability: '统计目标日处于涨跌停等不可成交情形的机会占比，用于评估信号可执行性。',
};

export const ENUM_METRIC_TIPS = {
  totalOpportunities:
    '样本期内触发的机会总次数（括号内为参与统计的股票只数）。'
    + '数值越大表示信号越多；越小表示触发较少。'
    + '需结合策略设计判断，并非单纯越多越好。'
    + '若股票只数少于设置样本，常见原因为部分股票 K 线不足等，未纳入回测。',

  completeness:
    '截至回测结束日，已完整达成策略目标的机会占全部机会的比例。'
    + '比例越高，未完成样本越少；越低则尾部未完成较多。'
    + '通常越高越好。',

  winRate:
    '在「已完成」的机会中，ROI 为正（win）所占比例；负 ROI（loss）为败。'
    + '未完成（如回测结束日仍持仓、enumeration_end 强制平仓）不计入分母。'
    + '与上方「机会完成度」不同：完成度看是否走完目标，胜率只看已完成里的盈亏方向。'
    + '通常越高越好（须结合单笔盈亏幅度）。',

  triggerStocksRatio:
    '至少出现过一次机会的股票数占样本池的比例。'
    + '比例越高，覆盖面越广；越低则机会更集中于少数股票。'
    + '是否合理取决于策略定位，无统一阈值。',

  avgPerStock:
    '总机会数除以参与股票数，即平均每只股票的机会次数。'
    + '数值越大，单股触发越频繁；越小则多数股票较冷清。'
    + '宜与分布图对照，警惕少数股票拉高均值。',

  meanGap:
    '同一只股票相邻两次机会之间的平均间隔（自然日）。'
    + '间隔越短，机会越密集；越长则节奏越疏。'
    + '需与资金容量、持仓周期匹配，无统一优劣。',

  meanDuration:
    '单次机会从触发到结束的平均持续天数。'
    + '持续越长，单笔占用时间越长；越短则周转越快。'
    + '取决于策略规则，无统一优劣。',

  dispersion:
    '各股机会间隔的离散程度（SD 为天数标准差，CV 为变异系数）。'
    + '数值越大，节奏越不均匀；越小则越接近。'
    + '通常宜适中或偏小，以利于资金安排；下方为系统摘要。',

  limitUpBuy:
    '目标卖出日处于涨停、按回测假设无法买入的机会次数及占可评估买入样本的比例。'
    + '比例越高，越多信号在实盘中可能买不到。'
    + '通常越低越好。',

  limitDownSell:
    '目标卖出日处于跌停、按回测假设无法卖出的机会次数及占可评估卖出样本的比例。'
    + '比例越高，平仓越可能受阻。'
    + '通常越低越好。',
};

export const ENUM_CHART_TIPS = {
  opportunityDistribution:
    '横轴为每股机会数区间，柱高为落入该区间的股票数（标注为占比）。'
    + '若柱体集中在低区间，说明多数股票机会较少；集中在高区间则少数股票机会偏多。'
    + '分布越均匀通常越利于分散；过度右偏需关注集中度风险。',
};

export const PRICE_SECTION_TIPS = {
  overview: '价格层单股规则下的胜率、收益率、持仓与年化折算，用于评估信号质量。',
  sampleCoverage: '核对交易笔数、覆盖股票数及未平仓数量，样本不足或尾仓过多会影响结论。',
  profitStructure: '除平均盈亏外，关注赢亏结构及收益率（ROI）分布是否均衡。',
  executionSkips: '因涨跌停或股票状态设置而跳过模拟投资的笔数，用于对照回测假设是否过于乐观。',
};

export const PRICE_METRIC_TIPS = {
  winRate:
    '已平仓交易中，盈利笔数所占比例。'
    + '比例越高，赢面越大；越低则亏损笔数占比更高。'
    + '通常越高越好（须结合单笔盈亏，避免「小赢大亏」）。',

  avgRoi:
    '每笔投资的平均收益率（ROI，百分比）。'
    + '数值越高，单笔回报越好；为负则平均亏损。'
    + '通常越高越好。',

  avgDurationDays:
    '单笔投资从买入到卖出的平均持仓天数（自然日）。'
    + '天数越长，周转越慢；越短则周转越快。'
    + '是否合理取决于策略周期，无统一优劣。',

  annualReturn:
    '按自然日折算：平均每笔收益率（ROI）×（365 ÷ 平均持仓天数），为线性年化而非复利。'
    + '数值越高，在同等持仓节奏下信号层表现越好；为负则亏损。'
    + '本指标基于价格层假设：每笔机会均可按规则成交，未考虑资金上限、仓位冲突、闲置现金等约束，因此通常偏乐观。'
    + '完成资金模拟后，请以资金报告中的总收益率、资产曲线为准；实盘可得的年化往往明显低于此数。'
    + '回测区间很短时该值还会被进一步放大，不宜单独作为预期收益。',

  totalInvestments:
    '价格回测中模拟的买入总笔数（含期末仍持仓）。'
    + '笔数越多，样本越大；越少则统计波动更大。'
    + '需与策略频率匹配，无单纯优劣。',

  stocksWithOpportunities:
    '至少发生一笔投资的股票只数。'
    + '只数越多，覆盖面越广；越少则更集中。'
    + '是否合理视策略而定。',

  avgInvestmentsPerStock:
    '总笔数除以有交易的股票数。'
    + '数值越大，单股交易越频繁。'
    + '宜警惕少数股票反复交易拉高均值。',

  totalOpenInvestments:
    '回测结束日仍未平仓的笔数。'
    + '数值越大，截止日截断的未了结越多；越小则大多已平仓。'
    + '通常宜较少，以便结论更完整。',

  winLossCount:
    '盈利笔数与亏损笔数（下方为赢单/亏单说明）。'
    + '盈利侧越大越好；亏损侧越大越需关注。'
    + '宜同时查看「每笔平均盈利」。',

  avgProfitPerInvestment:
    '每笔投资平均盈亏金额（元，含正负）。'
    + '数值越大越好；为负表示平均每笔亏损。'
    + '通常越高越好。',

  avgProfitPerStock:
    '各股累计盈亏的平均值（元）。'
    + '数值越大，票池整体贡献越正向。'
    + '通常越高越好。',

  roiVolatility:
    '各笔收益率（ROI）的离散程度；有标准差时展示波动，否则展示分位数。'
    + '波动越大，收益越不稳定；越平稳则分布越集中。'
    + '在平均收益相近时，通常越小越稳健。',

  skippedBuyAtLimitUp:
    '因涨停且规则不允许买入而跳过的投资笔数。'
    + '数值越大，越多机会未进入回测。'
    + '通常越低越好（或反映你关闭「涨停日允许买入」后的保守程度）。',

  skippedSellAtLimitDown:
    '因跌停且规则不允许卖出而跳过的卖出笔数。'
    + '数值越大，平仓假设越受阻。'
    + '通常越低越好。',

  skippedStockStatus:
    '因触发日股票状态命中「跳过投资机会」配置而跳过的投资笔数。'
    + '数值越大，越多 ST/*ST 等机会未模拟。'
    + '需与策略风控设定一并理解，无单纯优劣。',

  skippedBuyParticipation:
    '因计划买入股数超过当日成交量×最大参与率且选择「跳过」而未成交的笔数。'
    + '反映流动性约束下的可执行性。',

  skippedSellParticipation:
    '因计划卖出股数超过当日成交量×最大参与率且选择「跳过」而未成交的笔数。',

  clippedBuyParticipation:
    '买入时因参与率上限被缩量至可成交股数、仍完成成交的笔数。'
    + '与「跳过」对照，反映 clip 模式下的部分成交。',

  clippedSellParticipation:
    '卖出时因参与率上限被缩量、仍完成成交的笔数。',
};

export const PRICE_CHART_TIPS = {
  roiPercentileUnavailable: '暂无收益率分位数据，请重新执行价格回测。',
  roiPercentileCaption:
    '横轴为 10%～90% 分位，纵轴为该分位的收益率（ROI）水平。'
    + '仅统计按 goal 规则退出的交易（止损/止盈/到期等），回测区间结束强制平仓不计入。'
    + '整体偏上且负值分位较短，分布较健康；若极少数分位极高，需警惕少数大单拉高。'
    + '宜结合胜率与平均收益率一并判断。',
  roiBucketUnavailable: '暂无收益率区间分布数据，请重新执行价格回测。',
  roiBucketCaption:
    '各笔 ROI 按固定档位统计：负侧 6 档（封顶 -100%），正侧含 0–5%、…、50–100% 与 >100%；'
    + '负区间红柱、正区间青柱。'
    + '仅含按 goal 规则退出的交易；若设置了止损/止盈，主峰应落在对应档位附近。'
    + '另有「区间结束强平」的仓位单独计数，不计入本图（避免与风控档位混淆）。'
    + '重新执行价格回测后更新。',
  roiBucketTruncatedNote: (count) => (
    `另有 ${count} 笔因回测区间结束强制平仓，未计入上图。`
  ),
};

export const CAPITAL_SECTION_TIPS = {
  overview: '账户层面的收益、回撤与资产曲线，最接近实盘资金表现。',
  tradeQuality: '从交易笔数、胜率与盈亏金额判断收益是否稳定。',
  utilization: '观察仓位与现金占用，评估资金是否闲置或长期满负荷。',
  risk: '关注回撤深度、持续时间、连续亏损及大额单笔亏损。',
  concentration: '评估收益是否过度依赖少数股票。',
  executionSkips:
    '因涨跌停、股票状态或成交量参与率约束而跳过/缩量的笔数，用于对照资金层成交假设。',
};

export const CAPITAL_METRIC_TIPS = {
  initialCapital:
    '回测起始投入资金（元）。'
    + '为计算收益率的基准，本身无优劣。',

  finalEquity:
    '回测结束日账户总资产，含现金与持仓市值（元）。'
    + '高于初始资金为盈利，低于为亏损。'
    + '通常越高越好。',

  totalReturnPct:
    '（最终总资产 − 初始资金）÷ 初始资金，以百分比表示。'
    + '数值越高，区间收益越好。'
    + '通常越高越好。',

  calmarRatio:
    '年化收益率与最大回撤的比值（回撤为 0 时仅供参考）。'
    + '数值越大，单位回撤对应的收益越高。'
    + '通常越大越好。',

  totalTrades:
    '买入与卖出成交总次数（下方为买、卖拆分）。'
    + '次数越多，换手越高。'
    + '是否合理取决于策略与成本假设。',

  winRate:
    '已平仓交易中盈利笔数占比（下方为盈/亏笔数）。'
    + '比例越高越好。'
    + '须结合单笔平均盈亏判断。',

  totalProfit:
    '已平仓交易累计盈亏（元）。'
    + '数值越大越好；为负表示净亏损。'
    + '通常越高越好。',

  avgPnlPerTrade:
    '每笔已平仓交易平均盈亏（元）。'
    + '数值越大越好。'
    + '通常越高越好。',

  avgOpenPositions:
    '回测期间平均同时持仓只数 / 历史最高同时持仓只数。'
    + '反映仓位占用水平。'
    + '需与风控与策略设计匹配，无统一优劣。',

  fullExposureDaysRatio:
    '仓位接近满仓的交易日占回测区间的比例。'
    + '比例越高，资金越常满负荷；越低则空仓时间越多。'
    + '视策略风格而定。',

  avgCashRatio:
    '现金占总资产的平均比例。'
    + '比例越高，闲置现金越多；越低则资金更投入市场。'
    + '无统一优劣。',

  capitalUtilization:
    '实际用于市场的资金占可用资金的比例。'
    + '比例越高，资金利用越充分。'
    + '在风险可控前提下，长期偏低可能拉低收益。',

  maxDrawdown:
    '净值相对历史高点的最大回落幅度（%）。'
    + '数值越大（绝对值），最差阶段跌得越深。'
    + '通常越小越好。',

  maxDrawdownDuration:
    '从回撤开始到收复前高的最长天数。'
    + '天数越长，恢复期越久。'
    + '通常越短越好。',

  maxLossStreak:
    '连续亏损的最长笔数。'
    + '笔数越多，连续亏损压力越大。'
    + '通常越小越好。',

  worstTradePnls:
    '亏损最大的三笔金额（元）。'
    + '绝对值越大，尾部风险越大。'
    + '通常绝对值越小越好。',

  stockCount:
    '至少成交过一笔的股票只数。'
    + '只数越多，覆盖面越广。'
    + '是否合理视策略而定。',

  avgTradesPerStock:
    '总成交次数除以股票数。'
    + '数值越大，单股交易越频繁。'
    + '宜关注是否过度集中。',

  top5ContributionRatio:
    '盈利最高的 5 只股票贡献的盈利占总盈利的比例。'
    + '括号内为触发股票总数；样本很少时（如仅 6 只），前 5 占比可能接近 100%，需结合总股数解读。'
    + '比例越高，收益越集中；通常越低越稳健。',

  stockPnlCv:
    '各股盈亏的变异系数（CV）。'
    + '数值越大，个股差异越大、结果越依赖个别股票。'
    + '在总收益相近时，通常越小越好。',

  skippedBuyAtLimitUp: PRICE_METRIC_TIPS.skippedBuyAtLimitUp,
  skippedSellAtLimitDown: PRICE_METRIC_TIPS.skippedSellAtLimitDown,
  skippedStockStatus: PRICE_METRIC_TIPS.skippedStockStatus,
  skippedBuyParticipation: PRICE_METRIC_TIPS.skippedBuyParticipation,
  skippedSellParticipation: PRICE_METRIC_TIPS.skippedSellParticipation,
  clippedBuyParticipation: PRICE_METRIC_TIPS.clippedBuyParticipation,
  clippedSellParticipation: PRICE_METRIC_TIPS.clippedSellParticipation,
};

export const CAPITAL_CHART_TIPS = {
  equityCurve:
    '账户总资产随时间变化。上行且波动可控为较理想形态。'
    + '宜与回撤曲线对照阅读。',
  drawdownCurve:
    '相对历史高点的回撤深度（%）。'
    + '峰值越高，该阶段回撤越大。'
    + '通常越低越好。',
};
