{
  "schemaVersion": 1,
  "datasetId": "csr-crypto-signal-accuracy-evaluation-method-2026-07-12",
  "title": "Crypto Signal Accuracy Evaluation Method",
  "canonicalUrl": "https://cryptosignalsreview.com/how-to-evaluate-the-accuracy-and-performance-of-a-crypto-signal-provider/",
  "researchDate": "2026-07-12",
  "publishedAt": "2026-07-12",
  "modifiedAt": "2026-07-14",
  "decisionBoundary": "A claim becomes reproducible only when the population, chronology, dispositions, execution, costs, and account path can be reconstructed. Reproducible is not the same as independently verified or predictive.",
  "sourceRelease": {
    "bootstrap": false,
    "repositoryCommit": "4c6f7305b79b4aa0ec512d1f455ca1b7bf0ee895",
    "sourcePath": "data/research/crypto-signal-accuracy-evaluation-method-20260712.json",
    "sourceSha256": "3d1420e318e9102ba6fc9e08fd7be719493df4f755de9c94d872b05a66841ccf",
    "sourceBytes": 15186,
    "sourceUrl": "https://raw.githubusercontent.com/TheCryptoSimon/CryptoSignalsReview/4c6f7305b79b4aa0ec512d1f455ca1b7bf0ee895/data/research/crypto-signal-accuracy-evaluation-method-20260712.json"
  },
  "searchDemand": {
    "source": "Google Search Console authenticated property view",
    "window": "Last 3 months",
    "capturedOn": "2026-07-12",
    "clicks": 0,
    "impressions": 128,
    "ctrPercent": 0,
    "averagePosition": 11.6,
    "visibleQuery": {
      "query": "crypto quality signals review",
      "impressions": 20
    },
    "preReleaseInspection": {
      "indexState": "Page with redirect",
      "httpStatus": 301,
      "redirectTarget": "https://cryptosignalsreview.com/methodology/",
      "lastCrawl": "2026-07-05T02:23:29+02:00",
      "crawler": "Googlebot smartphone",
      "fetch": "Successful",
      "userDeclaredCanonical": "https://cryptosignalsreview.com/methodology/",
      "googleSelectedCanonical": "https://cryptosignalsreview.com/methodology/"
    },
    "boundary": "Property-specific, privacy-filtered observations explain why the historical canonical was restored. They do not prove search volume, future rank, indexing, or intent for every impression."
  },
  "officialSources": [
    {
      "sourceId": "cftc-trading-systems-advisory",
      "label": "CFTC: Commodity Trading Systems Sold on the Internet",
      "url": "https://www.cftc.gov/LearnAndProtect/AdvisoriesAndArticles/fraudadv_tradingsystem.html",
      "accessedOn": "2026-07-12",
      "httpStatus": 200,
      "bytes": 44430,
      "sha256": "35a02c7f7b4b58c4a7ae7176c464b234b653e5cd3f166f135599764c46219a52",
      "role": "General context on hypothetical trading, execution assumptions, spreads, fees, independent verification, and the difference between simulated and actual results.",
      "boundary": "The advisory is not specific to crypto signal providers and does not evaluate any provider covered by CryptoSignalsReview."
    },
    {
      "sourceId": "nfa-rule-2-29-interpretive-notice",
      "label": "NFA Interpretive Notice 9025: Hypothetical Performance Results",
      "url": "https://www.nfa.futures.org/rulebooksql/rules.aspx?RuleID=9025&Section=9",
      "accessedOn": "2026-07-12",
      "httpStatus": 200,
      "bytes": 158080,
      "sha256": "67603c40f5d552e437192af0353d7526270bf38b361ee80c1e430623beb338ce",
      "role": "General context on hindsight, liquidity, slippage, financial risk, material assumptions, actual-versus-hypothetical separation, and presentation prominence.",
      "boundary": "The interpretive notice applies to specified NFA members and promotional material. This guide uses it as measurement context, not as a legal finding about a provider."
    }
  ],
  "decisionSteps": [
    {
      "id": "freeze-population",
      "label": "Freeze the population",
      "question": "What exact channels, products, pairs, access tiers, and dates are included, and when was that rule fixed?",
      "failure": "A provider can change the denominator after outcomes are known or mix incomparable products."
    },
    {
      "id": "preserve-chronology",
      "label": "Preserve the chronology",
      "question": "Can every original alert, timestamp, edit, deletion, cancellation, and closure be reconstructed?",
      "failure": "A later result post can survive while the original instruction or losing call disappears."
    },
    {
      "id": "reconcile-statuses",
      "label": "Reconcile every status",
      "question": "Do wins, losses, break-even calls, open positions, no-fills, cancellations, and duplicate updates sum to the published population?",
      "failure": "The numerator can look precise while exclusions remain invisible."
    },
    {
      "id": "declare-execution",
      "label": "Declare execution rules",
      "question": "Which venue, price, order type, latency, entry range, target weights, stop rule, and missed-fill rule are used?",
      "failure": "A market move is mistaken for a subscriber fill."
    },
    {
      "id": "apply-costs",
      "label": "Apply costs trade by trade",
      "question": "Are fees, spread, slippage, funding, borrow cost, and subscription cost included at the same grain as the trades?",
      "failure": "Gross signal movement is presented as net value."
    },
    {
      "id": "rebuild-account-path",
      "label": "Rebuild the account path",
      "question": "Are sizing, leverage, concurrency, compounding, open equity, peak margin, drawdown, and recovery time defined?",
      "failure": "Summed trade percentages are treated as account return."
    },
    {
      "id": "separate-evidence-types",
      "label": "Separate evidence types",
      "question": "Are actual, paper-traded, backtested, provider-published, third-party, and independently reproduced results labeled separately?",
      "failure": "A technically valid simulation or selected example is generalized into live subscriber performance."
    }
  ],
  "claimTypes": [
    {
      "id": "hit-rate",
      "label": "Hit rate or win rate",
      "unit": "Winning observations divided by one declared eligible denominator",
      "required": "Stable win definition, complete disposition counts, period, exclusions, and break-even treatment",
      "cannotProve": "Profitability, account return, drawdown, or suitability"
    },
    {
      "id": "asset-move",
      "label": "Underlying asset move",
      "unit": "Price change from one declared reference price to another",
      "required": "Venue, timestamps, side of market, entry rule, exit rule, and whether a subscriber could fill",
      "cannotProve": "Position return or realized account return"
    },
    {
      "id": "leveraged-position-return",
      "label": "Leveraged position return",
      "unit": "Position-level movement under stated leverage and margin assumptions",
      "required": "Leverage, margin mode, position size, liquidation path, fees, funding, and target allocation",
      "cannotProve": "Whole-account return"
    },
    {
      "id": "target-touch",
      "label": "Target touch or target sum",
      "unit": "A market level touched or percentages accumulated across targets",
      "required": "Target weights, remaining position, stop movement, fill sequence, and whether targets are independent",
      "cannotProve": "One realized trade outcome without the allocation rule"
    },
    {
      "id": "account-return",
      "label": "Account return",
      "unit": "Change in one defined account or model portfolio after all costs",
      "required": "Starting capital, sizing, concurrency, cash flows, costs, mark-to-market policy, and equity curve",
      "cannotProve": "Future performance or another subscriber's result"
    },
    {
      "id": "backtest",
      "label": "Backtest or simulation",
      "unit": "Historical model output under fixed data and execution assumptions",
      "required": "Data version, strategy version, parameters, in/out-of-sample split, costs, slippage, and forward boundary",
      "cannotProve": "Actual trading or future fills"
    }
  ],
  "evidenceFields": [
    {
      "id": "population",
      "label": "Population and date window",
      "proof": "Named channels, products, access tiers, pairs, start and end dates, and a rule fixed before outcomes are selected."
    },
    {
      "id": "timestamps",
      "label": "Original pre-trade timestamps",
      "proof": "Stable signal IDs and original publication times that precede the claimed market movement."
    },
    {
      "id": "history",
      "label": "Edit, deletion, and cancellation history",
      "proof": "Version or tombstone records that make later changes and removals visible."
    },
    {
      "id": "reconciliation",
      "label": "Complete status reconciliation",
      "proof": "Wins, losses, break-even, open, no-fill, cancelled, invalidated, and duplicate records sum to the population."
    },
    {
      "id": "fills",
      "label": "Entry and fill model",
      "proof": "Venue, bid or ask convention, order type, latency, entry-range rule, partial fills, and missed-entry handling."
    },
    {
      "id": "exits",
      "label": "Exit and target allocation",
      "proof": "Target weights, stop movement, remaining position, forced close, expiry, and open-trade cutoff."
    },
    {
      "id": "risk",
      "label": "Sizing, leverage, and concurrency",
      "proof": "Capital allocation, margin mode, leverage ceiling, simultaneous exposure, re-entry, and compounding rules."
    },
    {
      "id": "costs",
      "label": "Execution and service costs",
      "proof": "Fees, spread, slippage, funding, borrow, copier or tool cost, and subscription cost applied consistently."
    },
    {
      "id": "account-path",
      "label": "Equity curve and drawdown",
      "proof": "Starting capital, account-level path, open-equity policy, maximum drawdown, losing streak, and recovery time."
    }
  ],
  "claimCompatibilityLab": {
    "label": "Advertised-rate arithmetic compatibility lab",
    "defaultFixtureId": "RATE-001",
    "supportedDecimals": [
      0,
      1,
      2
    ],
    "maxPublishedRecords": 100000,
    "roundingRule": "For non-negative percentages, multiply the exact wins-over-denominator rate by the selected decimal scale and round to the nearest integer, with half values rounded up.",
    "boundary": "A compatible integer denominator shows only that the displayed percentage can be reproduced from the entered win count under one rounding rule. It does not establish that the denominator is complete, that exclusions are justified, that records are authentic, or that the claim represents profitability.",
    "fixtures": [
      {
        "fixtureId": "RATE-001",
        "label": "Unique denominator",
        "publishedRecords": 12,
        "wins": 4,
        "claimedRatePercent": 57.1,
        "displayedDecimals": 1,
        "expected": {
          "status": "unique",
          "compatibleDenominators": [
            7
          ],
          "denominatorMin": 7,
          "denominatorMax": 7,
          "eligibleNonWinsMin": 3,
          "eligibleNonWinsMax": 3,
          "outsidePopulationMin": 5,
          "outsidePopulationMax": 5,
          "closestDenominators": [
            7
          ],
          "closestDenominatorMin": 7,
          "closestDenominatorMax": 7,
          "closestRatePercentMin": 57.142857,
          "closestRatePercentMax": 57.142857,
          "closestGapPercentagePoints": 0.042857
        }
      },
      {
        "fixtureId": "RATE-002",
        "label": "Rounding ambiguity",
        "publishedRecords": 120,
        "wins": 50,
        "claimedRatePercent": 50,
        "displayedDecimals": 0,
        "expected": {
          "status": "ambiguous",
          "compatibleDenominators": [
            100,
            101
          ],
          "denominatorMin": 100,
          "denominatorMax": 101,
          "eligibleNonWinsMin": 50,
          "eligibleNonWinsMax": 51,
          "outsidePopulationMin": 19,
          "outsidePopulationMax": 20,
          "closestDenominators": [
            100
          ],
          "closestDenominatorMin": 100,
          "closestDenominatorMax": 100,
          "closestRatePercentMin": 50,
          "closestRatePercentMax": 50,
          "closestGapPercentagePoints": 0
        }
      },
      {
        "fixtureId": "RATE-003",
        "label": "No compatible denominator",
        "publishedRecords": 4,
        "wins": 4,
        "claimedRatePercent": 80,
        "displayedDecimals": 1,
        "expected": {
          "status": "none",
          "compatibleDenominators": [],
          "denominatorMin": null,
          "denominatorMax": null,
          "eligibleNonWinsMin": null,
          "eligibleNonWinsMax": null,
          "outsidePopulationMin": null,
          "outsidePopulationMax": null,
          "closestDenominators": [
            4
          ],
          "closestDenominatorMin": 4,
          "closestDenominatorMax": 4,
          "closestRatePercentMin": 100,
          "closestRatePercentMax": 100,
          "closestGapPercentagePoints": 20
        }
      }
    ]
  },
  "syntheticLedger": {
    "label": "Synthetic denominator example",
    "boundary": "These twelve records are invented only to demonstrate denominator changes. They are not provider results, market observations, recommendations, or a performance forecast.",
    "riskUnit": "R is a synthetic per-trade risk unit and is not an account return.",
    "records": [
      {
        "recordId": "SYN-001",
        "status": "win",
        "grossR": 2.5,
        "includedInWinLossRate": true,
        "includedInResolvedRate": true
      },
      {
        "recordId": "SYN-002",
        "status": "loss",
        "grossR": -1,
        "includedInWinLossRate": true,
        "includedInResolvedRate": true
      },
      {
        "recordId": "SYN-003",
        "status": "break_even",
        "grossR": 0,
        "includedInWinLossRate": false,
        "includedInResolvedRate": true
      },
      {
        "recordId": "SYN-004",
        "status": "cancelled",
        "grossR": null,
        "includedInWinLossRate": false,
        "includedInResolvedRate": false
      },
      {
        "recordId": "SYN-005",
        "status": "open",
        "grossR": null,
        "includedInWinLossRate": false,
        "includedInResolvedRate": false
      },
      {
        "recordId": "SYN-006",
        "status": "win",
        "grossR": 1.2,
        "includedInWinLossRate": true,
        "includedInResolvedRate": true
      },
      {
        "recordId": "SYN-007",
        "status": "loss",
        "grossR": -1,
        "includedInWinLossRate": true,
        "includedInResolvedRate": true
      },
      {
        "recordId": "SYN-008",
        "status": "no_fill",
        "grossR": null,
        "includedInWinLossRate": false,
        "includedInResolvedRate": false
      },
      {
        "recordId": "SYN-009",
        "status": "win",
        "grossR": 3.1,
        "includedInWinLossRate": true,
        "includedInResolvedRate": true
      },
      {
        "recordId": "SYN-010",
        "status": "loss",
        "grossR": -1,
        "includedInWinLossRate": true,
        "includedInResolvedRate": true
      },
      {
        "recordId": "SYN-011",
        "status": "win",
        "grossR": 0.6,
        "includedInWinLossRate": true,
        "includedInResolvedRate": true
      },
      {
        "recordId": "SYN-012",
        "status": "duplicate_update",
        "grossR": null,
        "includedInWinLossRate": false,
        "includedInResolvedRate": false
      }
    ],
    "expectedMetrics": {
      "publishedRecords": 12,
      "wins": 4,
      "losses": 3,
      "breakEven": 1,
      "open": 1,
      "cancelledOrNoFill": 2,
      "duplicateUpdates": 1,
      "enteredRecords": 9,
      "winLossDenominator": 7,
      "resolvedDenominator": 8,
      "winLossRatePercent": 57.1,
      "resolvedWinnerSharePercent": 50,
      "publishedWinnerSharePercent": 33.3,
      "grossResolvedR": 4.4
    },
    "metrics": {
      "publishedRecords": 12,
      "wins": 4,
      "losses": 3,
      "breakEven": 1,
      "open": 1,
      "cancelledOrNoFill": 2,
      "duplicateUpdates": 1,
      "enteredRecords": 9,
      "winLossDenominator": 7,
      "resolvedDenominator": 8,
      "winLossRatePercent": 57.1,
      "resolvedWinnerSharePercent": 50,
      "publishedWinnerSharePercent": 33.3,
      "grossResolvedR": 4.4
    }
  },
  "boundaries": [
    "A reproducible calculation is not the same as independent verification of the underlying records.",
    "A win rate can describe classification accuracy while hiding payoff size, costs, leverage, drawdown, and account survivability.",
    "Missing evidence means the claim remains unresolved from the available record; it is not proof that the claim is false or that a provider committed misconduct.",
    "No method can turn past or hypothetical results into a guarantee of future profitability.",
    "This guide is educational due diligence, not financial, legal, tax, or investment advice."
  ]
}
