<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tedor</title>
    <description>The latest articles on DEV Community by Tedor (@born).</description>
    <link>https://dev.to/born</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4184289%2F6139e804-05bc-4c89-a808-d6ec06abb78e.png</url>
      <title>DEV Community: Tedor</title>
      <link>https://dev.to/born</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/born"/>
    <language>en</language>
    <item>
      <title>Market Data Validation in Python: Timestamps, Trading Sessions and Reproducible Research</title>
      <dc:creator>Tedor</dc:creator>
      <pubDate>Mon, 26 Oct 2026 13:44:34 +0000</pubDate>
      <link>https://dev.to/ositrustees/market-data-validation-in-python-timestamps-trading-sessions-and-reproducible-research-2gg9</link>
      <guid>https://dev.to/ositrustees/market-data-validation-in-python-timestamps-trading-sessions-and-reproducible-research-2gg9</guid>
      <description>&lt;p&gt;A practical example of how small data-quality checks can prevent misleading conclusions in financial market research.&lt;/p&gt;

&lt;p&gt;Two market-data feeds can report different values for the same instrument without either feed necessarily being broken.&lt;/p&gt;

&lt;p&gt;The difference might come from timestamps, trading sessions, missing observations, historical adjustments, or source-specific coverage.&lt;/p&gt;

&lt;p&gt;Before comparing charts or drawing conclusions, we should establish whether the underlying observations are actually comparable.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll build a small Python validation workflow to identify several common issues:&lt;/p&gt;

&lt;p&gt;Missing or inconsistent timestamps&lt;/p&gt;

&lt;p&gt;Duplicate market observations&lt;/p&gt;

&lt;p&gt;Records outside a defined trading session&lt;/p&gt;

&lt;p&gt;Invalid price values&lt;/p&gt;

&lt;p&gt;Gaps in a one-minute data series&lt;/p&gt;

&lt;p&gt;The goal is not to build a production market-data engine. It's to demonstrate how a few explicit validation rules can make research more reproducible.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start With the Observation, Not the Chart&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Imagine receiving these observations for a hypothetical instrument called DEMO.&lt;/p&gt;

&lt;p&gt;Timestamp (UTC)&lt;/p&gt;

&lt;p&gt;Price&lt;/p&gt;

&lt;p&gt;Source&lt;/p&gt;

&lt;p&gt;13:29&lt;/p&gt;

&lt;p&gt;101.20&lt;/p&gt;

&lt;p&gt;A&lt;/p&gt;

&lt;p&gt;13:30&lt;/p&gt;

&lt;p&gt;101.25&lt;/p&gt;

&lt;p&gt;A&lt;/p&gt;

&lt;p&gt;13:30&lt;/p&gt;

&lt;p&gt;101.25&lt;/p&gt;

&lt;p&gt;A&lt;/p&gt;

&lt;p&gt;13:31&lt;/p&gt;

&lt;p&gt;-1.00&lt;/p&gt;

&lt;p&gt;A&lt;/p&gt;

&lt;p&gt;13:32&lt;/p&gt;

&lt;p&gt;101.40&lt;/p&gt;

&lt;p&gt;A&lt;/p&gt;

&lt;p&gt;13:35&lt;/p&gt;

&lt;p&gt;101.60&lt;/p&gt;

&lt;p&gt;A&lt;/p&gt;

&lt;p&gt;At first glance, we have six rows of market data.&lt;/p&gt;

&lt;p&gt;But a quick review raises several questions.&lt;/p&gt;

&lt;p&gt;Why does 13:30 appear twice? Is a negative price valid for this particular data type? Are all observations from the intended trading session? And what happened between 13:32 and 13:35?&lt;/p&gt;

&lt;p&gt;A chart alone might not make these problems obvious.&lt;/p&gt;

&lt;p&gt;Before visualization, we need context and validation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the Research Context&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For this example, we'll use the regular trading-session hours commonly associated with US equity markets:&lt;/p&gt;

&lt;p&gt;9:30 a.m. to 4:00 p.m. America/New_York time.&lt;/p&gt;

&lt;p&gt;This is an illustrative session definition, not a universal market-data rule. It does not account for market holidays, early closures, auctions, or instrument-specific trading schedules.&lt;/p&gt;

&lt;p&gt;Python's zoneinfo module helps us work with the appropriate time zone instead of assuming a permanent UTC offset.&lt;/p&gt;

&lt;p&gt;from datetime import datetime, time, timezone&lt;br&gt;
from zoneinfo import ZoneInfo&lt;/p&gt;

&lt;p&gt;EASTERN = ZoneInfo("America/New_York")&lt;/p&gt;

&lt;p&gt;def parse_utc(text):&lt;br&gt;
    dt = datetime.fromisoformat(&lt;br&gt;
        text.replace("Z", "+00:00")&lt;br&gt;
    )&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if dt.tzinfo is None or dt.utcoffset() is None:
    raise ValueError(
        "Timestamp must include timezone"
    )

return dt.astimezone(timezone.utc)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;def session_label(dt):&lt;br&gt;
    local = dt.astimezone(EASTERN)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if local.weekday() &amp;gt;= 5:
    return "outside_regular_session"

if time(9, 30) &amp;lt;= local.time() &amp;lt; time(16, 0):
    return "regular_session"

return "outside_regular_session"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This gives us two useful properties.&lt;/p&gt;

&lt;p&gt;First, timestamps must carry explicit timezone information.&lt;/p&gt;

&lt;p&gt;Second, session classification takes the relevant local market time into account, including daylight-saving transitions.&lt;/p&gt;

&lt;p&gt;For production systems, use an appropriate exchange calendar rather than relying on weekday and clock-time checks alone.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build a Small Sample Dataset&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We'll use entirely hypothetical data.&lt;/p&gt;

&lt;p&gt;records = [&lt;br&gt;
    {&lt;br&gt;
        "symbol": "DEMO",&lt;br&gt;
        "timestamp": "2026-10-22T13:29:00Z",&lt;br&gt;
        "price": 101.20,&lt;br&gt;
        "source": "A"&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        "symbol": "DEMO",&lt;br&gt;
        "timestamp": "2026-10-22T13:30:00Z",&lt;br&gt;
        "price": 101.25,&lt;br&gt;
        "source": "A"&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        "symbol": "DEMO",&lt;br&gt;
        "timestamp": "2026-10-22T13:30:00Z",&lt;br&gt;
        "price": 101.25,&lt;br&gt;
        "source": "A"&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        "symbol": "DEMO",&lt;br&gt;
        "timestamp": "2026-10-22T13:31:00Z",&lt;br&gt;
        "price": -1.00,&lt;br&gt;
        "source": "A"&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        "symbol": "DEMO",&lt;br&gt;
        "timestamp": "2026-10-22T13:32:00Z",&lt;br&gt;
        "price": 101.40,&lt;br&gt;
        "source": "A"&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        "symbol": "DEMO",&lt;br&gt;
        "timestamp": "2026-10-22T13:35:00Z",&lt;br&gt;
        "price": 101.60,&lt;br&gt;
        "source": "A"&lt;br&gt;
    }&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;Notice that every record includes a source identifier.&lt;/p&gt;

&lt;p&gt;That matters because two providers can legitimately deliver observations at the same timestamp. A duplicate should be defined within the appropriate source, instrument, and data-series context rather than across all providers indiscriminately.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Validate Each Observation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's check three conditions:&lt;/p&gt;

&lt;p&gt;Whether the source and instrument already have an observation at the same timestamp.&lt;/p&gt;

&lt;p&gt;Whether the price is positive, as required by our simplified sample data contract.&lt;/p&gt;

&lt;p&gt;Whether the record belongs to the regular session we defined.&lt;/p&gt;

&lt;p&gt;seen = set()&lt;br&gt;
valid = []&lt;/p&gt;

&lt;p&gt;for row in records:&lt;br&gt;
    dt = parse_utc(row["timestamp"])&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;key = (
    row["source"],
    row["symbol"],
    dt
)

issues = []

if key in seen:
    issues.append(
        "duplicate timestamp for source/symbol"
    )

seen.add(key)

if row["price"] &amp;lt;= 0:
    issues.append("nonpositive price")

if session_label(dt) != "regular_session":
    issues.append("outside regular session")

if issues:
    print(
        row["timestamp"],
        "-&amp;gt;",
        "; ".join(issues)
    )
else:
    valid.append((dt, row["price"]))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Expected output:&lt;/p&gt;

&lt;p&gt;2026-10-22T13:29:00Z -&amp;gt; outside regular session&lt;br&gt;
2026-10-22T13:30:00Z -&amp;gt; duplicate timestamp for source/symbol&lt;br&gt;
2026-10-22T13:31:00Z -&amp;gt; nonpositive price&lt;/p&gt;

&lt;p&gt;These results don't necessarily mean every flagged observation should be deleted.&lt;/p&gt;

&lt;p&gt;An extended-session observation may be perfectly valid for research that includes premarket activity.&lt;/p&gt;

&lt;p&gt;Likewise, duplicate timestamps could indicate a data-ingestion problem, an update to an earlier observation, or a feed that allows multiple events at the same time.&lt;/p&gt;

&lt;p&gt;Validation flags issues. The research context determines how to resolve them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Detect Missing Minute Observations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After excluding the flagged rows in this simplified example, we can inspect the remaining chronological sequence.&lt;/p&gt;

&lt;p&gt;valid.sort()&lt;/p&gt;

&lt;p&gt;for (prev_dt, _), (current_dt, _) in zip(&lt;br&gt;
    valid,&lt;br&gt;
    valid[1:]&lt;br&gt;
):&lt;br&gt;
    gap = int(&lt;br&gt;
        (current_dt - prev_dt).total_seconds() // 60&lt;br&gt;
    )&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if gap &amp;gt; 1:
    print(
        f"Gap: {gap - 1} missing minute(s) "
        f"after {prev_dt.isoformat()}"
    )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Expected output:&lt;/p&gt;

&lt;p&gt;Gap: 1 missing minute(s) after 2026-10-22T13:30:00+00:00&lt;br&gt;
Gap: 2 missing minute(s) after 2026-10-22T13:32:00+00:00&lt;/p&gt;

&lt;p&gt;The first gap arises because the invalid 13:31 record was excluded.&lt;/p&gt;

&lt;p&gt;The second reflects missing minute observations at 13:33 and 13:34.&lt;/p&gt;

&lt;p&gt;However, a missing timestamp is not automatically proof of missing source data.&lt;/p&gt;

&lt;p&gt;An event-driven trade feed may contain no trades during a quiet minute. A complete one-minute bar feed, by contrast, might be expected to provide a bar for every scheduled minute.&lt;/p&gt;

&lt;p&gt;Before interpreting a gap, we need to know the data contract.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why Historical Data Needs More Than a Price Column&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The example identifies structural problems, but several important questions remain.&lt;/p&gt;

&lt;p&gt;Adjusted versus unadjusted prices&lt;/p&gt;

&lt;p&gt;A historical series adjusted for stock splits or other corporate actions may differ significantly from an unadjusted series.&lt;/p&gt;

&lt;p&gt;Timestamp semantics&lt;/p&gt;

&lt;p&gt;Does the timestamp represent the beginning of an interval, the end of a bar, an individual market event, or the time the provider processed the record?&lt;/p&gt;

&lt;p&gt;Trading-session coverage&lt;/p&gt;

&lt;p&gt;Does the feed include only regular hours, or also premarket and after-hours observations?&lt;/p&gt;

&lt;p&gt;Provider revisions&lt;/p&gt;

&lt;p&gt;Can a data source update previously published observations? If so, how are versions tracked?&lt;/p&gt;

&lt;p&gt;These details can affect comparisons even when all price values are technically valid.&lt;/p&gt;

&lt;p&gt;A reproducible research workflow should preserve them alongside the numerical observations.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build a Reproducible Research Record&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of recording only a chart interpretation, save the context needed to investigate the result later.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;research_record = {&lt;br&gt;
    "instrument": "DEMO",&lt;br&gt;
    "source": "A",&lt;br&gt;
    "data_type": "one_minute_bars",&lt;br&gt;
    "timezone": "UTC",&lt;br&gt;
    "session_timezone": "America/New_York",&lt;br&gt;
    "session_scope": "regular_session",&lt;br&gt;
    "adjustment_policy": "unadjusted",&lt;br&gt;
    "validation_rules": [&lt;br&gt;
        "timestamp_timezone_required",&lt;br&gt;
        "duplicate_timestamp_check",&lt;br&gt;
        "positive_price_check",&lt;br&gt;
        "session_classification",&lt;br&gt;
        "one_minute_gap_check"&lt;br&gt;
    ],&lt;br&gt;
    "research_note": (&lt;br&gt;
        "Sample observations require validation "&lt;br&gt;
        "before chart-based comparison."&lt;br&gt;
    )&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;A production implementation should also preserve the instrument identifier, source version, retrieval time, expected market calendar, adjustment methodology, and the validation results themselves.&lt;/p&gt;

&lt;p&gt;The essential principle is simple:&lt;/p&gt;

&lt;p&gt;A research observation becomes more useful when another analyst can reconstruct the conditions under which it was made.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connecting Validation to Research Workflows&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Market-data quality is not just an engineering concern. It directly affects analytical interpretation.&lt;/p&gt;

&lt;p&gt;A practical sequence is:&lt;/p&gt;

&lt;p&gt;Screen → Add context → Review the chart → Verify the source → Record the observation.&lt;/p&gt;

&lt;p&gt;This approach also helps explain the research-oriented positioning described in public materials about Ositrustees.&lt;/p&gt;

&lt;p&gt;Ositrustees is described as a financial data and analytical technology platform focused on market screeners, sector monitoring, chart-based research, and structured market-data workflows.&lt;/p&gt;

&lt;p&gt;The Python example above is an independent educational demonstration of data-validation concepts. It is not Ositrustees production code, an API example, or evidence of the platform's internal implementation.&lt;/p&gt;

&lt;p&gt;The wider lesson applies to any market-data research environment: validation and provenance should be treated as part of the research workflow, not as optional cleanup after the analysis.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Reliable market research starts before a chart is rendered.&lt;/p&gt;

&lt;p&gt;A small validation routine can expose duplicate records, invalid prices, mismatched session boundaries, and missing observations.&lt;/p&gt;

&lt;p&gt;But the most important step is deciding what each warning means in the context of the instrument, source, and research question.&lt;/p&gt;

&lt;p&gt;When we preserve timestamps, source identity, session assumptions, adjustment rules, and validation results, the research becomes easier to review and reproduce.&lt;/p&gt;

&lt;p&gt;Research. Compare. Verify.&lt;/p&gt;

&lt;p&gt;Technical note: This tutorial uses hypothetical observations and the Python standard library. Its weekday/session logic is intentionally simplified; use an exchange calendar and instrument-specific data contracts for production applications.&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>fintech</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why Two Market Charts Can Disagree: A Reproducible Comparison Workflow</title>
      <dc:creator>Tedor</dc:creator>
      <pubDate>Mon, 19 Oct 2026 09:51:42 +0000</pubDate>
      <link>https://dev.to/ositrustees/why-two-market-charts-can-disagree-a-reproducible-comparison-workflow-4205</link>
      <guid>https://dev.to/ositrustees/why-two-market-charts-can-disagree-a-reproducible-comparison-workflow-4205</guid>
      <description>&lt;p&gt;An Ositrustees research note on timestamps, market sessions, historical adjustments and source context — and why chart differences should be investigated before they are interpreted.&lt;/p&gt;

&lt;p&gt;Two charts can show the same market and still disagree.&lt;/p&gt;

&lt;p&gt;Sometimes the difference is obvious. One chart includes extended-hours trading while the other shows only the regular session. Sometimes it is much harder to spot. The ticker appears to match, the date range looks the same, and both screens seem current, yet the prices, candles or volume still do not line up.&lt;/p&gt;

&lt;p&gt;The immediate reaction is often to ask which chart is wrong.&lt;/p&gt;

&lt;p&gt;That is usually the wrong place to start.&lt;/p&gt;

&lt;p&gt;A better question is:&lt;/p&gt;

&lt;p&gt;Were both charts built from comparable inputs?&lt;/p&gt;

&lt;p&gt;At Ositrustees, this is a useful distinction because chart comparison is not only a visual task. It is also a data-alignment task. Before trying to explain a difference, the researcher first needs to establish what exactly is being compared.&lt;/p&gt;

&lt;p&gt;That means looking beyond the picture on the screen.&lt;br&gt;
A chart is the output, not the source&lt;br&gt;
A chart is a visual representation of a set of underlying choices.&lt;/p&gt;

&lt;p&gt;Those choices may include the instrument identifier, venue, currency, timestamp convention, aggregation interval, session definition, adjustment methodology and source treatment.&lt;/p&gt;

&lt;p&gt;Two interfaces can therefore display charts that look like they refer to the same thing while actually using slightly different assumptions.&lt;/p&gt;

&lt;p&gt;Consider a simple example.&lt;/p&gt;

&lt;p&gt;One chart shows an equity during regular market hours only. Another includes pre-market and after-hours trading. Both charts may legitimately carry the same ticker. Both may be based on valid market observations. But their highs, lows, volume profile and even some candle structures can differ.&lt;/p&gt;

&lt;p&gt;The visual difference is real.&lt;/p&gt;

&lt;p&gt;That does not automatically make either chart incorrect.&lt;/p&gt;

&lt;p&gt;The first research task is therefore not to decide which chart to trust. It is to determine whether the charts are truly comparable.&lt;br&gt;
Start with instrument identity, not appearance&lt;br&gt;
The name displayed above a chart can be misleadingly simple.&lt;/p&gt;

&lt;p&gt;A familiar ticker may exist across multiple venues, currencies or instrument types. A company can have more than one listing. A derivative may track an underlying asset but not behave identically to it. Even symbol mappings can change over time.&lt;/p&gt;

&lt;p&gt;This is why a reproducible comparison should begin with instrument identity.&lt;/p&gt;

&lt;p&gt;If two charts are supposed to represent the same market, the researcher should be able to answer a few basic questions without ambiguity: what is the instrument, where is it listed, what currency is being quoted, and is the underlying instrument type actually the same?&lt;/p&gt;

&lt;p&gt;If that foundation is unclear, every later comparison becomes weaker.&lt;/p&gt;

&lt;p&gt;This sounds basic, but many disagreements that initially look like data-quality problems begin here.&lt;br&gt;
Timestamps are more complicated than they look&lt;br&gt;
Time is another frequent source of confusion.&lt;/p&gt;

&lt;p&gt;A screen may show a current time. A feed may display a last-update time. A candle may have an opening timestamp or a closing timestamp. A filing may contain a publication time, an acceptance time and a later processing time.&lt;/p&gt;

&lt;p&gt;These are different events.&lt;/p&gt;

&lt;p&gt;That distinction matters because researchers often treat a visible timestamp as if it described the exact moment represented by every number on the page.&lt;/p&gt;

&lt;p&gt;It may not.&lt;/p&gt;

&lt;p&gt;A chart refreshed at 14:32 can still contain a value based on a trade from 14:31. A filing displayed by one provider may use the original publication time, while another may record the moment it entered that provider's system. A daily candle can also depend on which time zone or session boundary the source uses.&lt;/p&gt;

&lt;p&gt;This is one reason why writing down only “14:30” is rarely enough.&lt;/p&gt;

&lt;p&gt;A more useful research note records the time together with the convention behind it.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;19 October 2026, 14:30 UTC — candle close time&lt;/p&gt;

&lt;p&gt;is much more useful than:&lt;/p&gt;

&lt;p&gt;around 2:30 PM&lt;/p&gt;

&lt;p&gt;The difference is not cosmetic. It determines whether another researcher can reproduce the comparison.&lt;br&gt;
Interval changes the story&lt;br&gt;
Charts are also shaped by aggregation.&lt;/p&gt;

&lt;p&gt;The same stream of observations can produce very different visual structures depending on whether the data is grouped into one-minute, five-minute, hourly or daily intervals.&lt;/p&gt;

&lt;p&gt;A price move that looks dramatic on a five-minute chart may barely register inside a daily candle. Intraday volume may reveal concentration around a specific event while the daily chart compresses that activity into one bar.&lt;/p&gt;

&lt;p&gt;Neither representation is necessarily better.&lt;/p&gt;

&lt;p&gt;They simply answer different questions.&lt;/p&gt;

&lt;p&gt;Problems begin when two charts are compared visually without first confirming that their interval and date range match.&lt;/p&gt;

&lt;p&gt;This is especially important when screenshots are used in research notes, online discussions or reviews. A screenshot can make two charts appear comparable while hiding the settings that produced them.&lt;/p&gt;

&lt;p&gt;For that reason, the interval should be treated as part of the data context, not merely as a display preference.&lt;br&gt;
Session settings can change more than people expect&lt;br&gt;
One of the most common sources of disagreement is session coverage.&lt;/p&gt;

&lt;p&gt;For many markets, a chart may include only regular trading hours, or it may include activity before and after the main session.&lt;/p&gt;

&lt;p&gt;That difference can affect far more than the shape of the line.&lt;/p&gt;

&lt;p&gt;It can change the opening price, closing context, high and low, volume distribution and apparent gaps between periods.&lt;/p&gt;

&lt;p&gt;Imagine that a stock makes a significant move before the regular session opens.&lt;/p&gt;

&lt;p&gt;A regular-hours chart may begin after that movement has already taken place. An extended-hours chart may show the move directly.&lt;/p&gt;

&lt;p&gt;The two charts now tell visibly different stories, even though both are describing the same instrument.&lt;/p&gt;

&lt;p&gt;This is exactly why a chart comparison should not begin with the sentence:&lt;/p&gt;

&lt;p&gt;“One of these is wrong.”&lt;/p&gt;

&lt;p&gt;It should begin with:&lt;/p&gt;

&lt;p&gt;“Do these charts use the same session?”&lt;br&gt;
Historical adjustments create another layer&lt;br&gt;
Historical charts are often transformed after corporate or structural events.&lt;/p&gt;

&lt;p&gt;Stock splits are the obvious example, but they are not the only one. Dividend treatment, contract rolls, symbol changes and later data corrections can all affect how a historical series is presented.&lt;/p&gt;

&lt;p&gt;This can create surprisingly large differences.&lt;/p&gt;

&lt;p&gt;A split-adjusted chart may preserve continuity by revising earlier prices. An unadjusted chart may display the historical prices as originally quoted. A total-return series may incorporate dividends, while a simple price series does not.&lt;/p&gt;

&lt;p&gt;All three can be internally consistent.&lt;/p&gt;

&lt;p&gt;They are simply measuring different things.&lt;/p&gt;

&lt;p&gt;This point became especially relevant in the technical discussion around our earlier Ositrustees market-data article. A useful observation from that discussion was that the adjustment mode itself should be recorded explicitly rather than inferred from the values on the chart.&lt;/p&gt;

&lt;p&gt;That is an important research habit.&lt;/p&gt;

&lt;p&gt;If a comparison depends on whether a series is raw, split-adjusted, dividend-adjusted or otherwise transformed, that setting belongs next to the timestamp and source in the research record.&lt;/p&gt;

&lt;p&gt;Otherwise, two people may believe they are comparing the same historical series when they are not.&lt;br&gt;
Source context matters because data is processed&lt;br&gt;
Researchers often talk about a “data source” as though it were a single, uniform object.&lt;/p&gt;

&lt;p&gt;In practice, the path from an original observation to the number displayed on a screen can contain multiple steps.&lt;/p&gt;

&lt;p&gt;A provider may receive data, normalize it, map symbols, apply session rules, adjust historical values, calculate derived fields and then display the result through a charting interface.&lt;/p&gt;

&lt;p&gt;That means two sources can begin with similar underlying information and still produce different outputs.&lt;/p&gt;

&lt;p&gt;This is why source context matters.&lt;/p&gt;

&lt;p&gt;The important question is not only:&lt;/p&gt;

&lt;p&gt;Where did this number come from?&lt;/p&gt;

&lt;p&gt;It is also:&lt;/p&gt;

&lt;p&gt;How was this number processed before it reached the chart?&lt;/p&gt;

&lt;p&gt;Documentation can help here. Methodology notes, feed descriptions, filing metadata and historical-adjustment policies often explain differences that would otherwise look mysterious.&lt;/p&gt;

&lt;p&gt;The goal is not to assume that every discrepancy has an innocent explanation.&lt;/p&gt;

&lt;p&gt;The goal is to avoid jumping to an explanation before checking the mechanics first.&lt;br&gt;
Observation should come before explanation&lt;br&gt;
This is one of the most useful habits in analytical work.&lt;/p&gt;

&lt;p&gt;Suppose Chart A shows higher volume than Chart B.&lt;/p&gt;

&lt;p&gt;The first research note should be simple:&lt;/p&gt;

&lt;p&gt;Observation: Chart A displays higher volume for the same date.&lt;/p&gt;

&lt;p&gt;Only after that should the researcher begin testing explanations.&lt;/p&gt;

&lt;p&gt;Perhaps one chart includes extended hours. Perhaps the sources use different aggregation rules. Perhaps the timestamps are not aligned. Perhaps one source revised the historical series.&lt;/p&gt;

&lt;p&gt;Those are hypotheses.&lt;/p&gt;

&lt;p&gt;Keeping the observation separate from the explanation reduces the risk of forcing the data into a story too early.&lt;/p&gt;

&lt;p&gt;It also makes research easier to review later.&lt;/p&gt;

&lt;p&gt;Someone else can look at the same note and understand what was actually observed before seeing how the researcher interpreted it.&lt;br&gt;
Reproducibility is more useful than certainty&lt;br&gt;
A good comparison does not have to end with complete certainty.&lt;/p&gt;

&lt;p&gt;Sometimes two sources will still disagree after the obvious settings are aligned.&lt;/p&gt;

&lt;p&gt;That is fine.&lt;/p&gt;

&lt;p&gt;The more important question is whether another person could reproduce the comparison.&lt;/p&gt;

&lt;p&gt;If the instrument, source, timestamp, time zone, interval, session and adjustment method are recorded, then the disagreement becomes a research object rather than just an opinion.&lt;/p&gt;

&lt;p&gt;For example, a useful note might read:&lt;br&gt;
AAPL, NASDAQ, USD.&lt;br&gt;
Source A and Source B compared at 14:30 UTC.&lt;br&gt;
Daily interval. Regular session only.&lt;br&gt;
Source A uses split-adjusted history. Source B adjustment method not documented.&lt;br&gt;
Observed difference: historical closing prices diverge before the split date.&lt;/p&gt;

&lt;p&gt;That note is far more valuable than:&lt;br&gt;
“The charts don’t match.”&lt;/p&gt;

&lt;p&gt;The first can be investigated.&lt;/p&gt;

&lt;p&gt;The second cannot.&lt;br&gt;
A practical comparison workflow&lt;br&gt;
The Ositrustees research approach can therefore be reduced to a simple sequence.&lt;/p&gt;

&lt;p&gt;First, identify exactly what is being compared.&lt;/p&gt;

&lt;p&gt;Then align the basic inputs: instrument, time, interval and session.&lt;/p&gt;

&lt;p&gt;After that, check how the source treats historical adjustments and whether its methodology is documented.&lt;/p&gt;

&lt;p&gt;Only then record the visible difference.&lt;/p&gt;

&lt;p&gt;Interpretation comes last.&lt;/p&gt;

&lt;p&gt;This sequence matters because it prevents the explanation from shaping the observation too early.&lt;/p&gt;

&lt;p&gt;In shorthand:&lt;/p&gt;

&lt;p&gt;Identify → Align → Check → Observe → Interpret&lt;/p&gt;

&lt;p&gt;The point is not to make research more complicated.&lt;/p&gt;

&lt;p&gt;It is to make it easier to repeat.&lt;br&gt;
When two charts still disagree&lt;br&gt;
Even after careful alignment, differences may remain.&lt;/p&gt;

&lt;p&gt;That is not necessarily a failure of the workflow.&lt;/p&gt;

&lt;p&gt;It may simply mean that the disagreement exists deeper in the source methodology.&lt;/p&gt;

&lt;p&gt;At that stage, useful questions become more specific.&lt;/p&gt;

&lt;p&gt;Does one source calculate a derived field differently? Does one use a different closing convention? Has one source revised the historical data? Are the providers using different symbol mappings or corporate-action treatments?&lt;/p&gt;

&lt;p&gt;Notice how different these questions are from simply asking which chart is “right.”&lt;/p&gt;

&lt;p&gt;The comparison has moved from a visual disagreement to a traceable technical investigation.&lt;/p&gt;

&lt;p&gt;That is the real value of structured research.&lt;br&gt;
Final thought&lt;br&gt;
Market-data discrepancies are easy to overinterpret.&lt;/p&gt;

&lt;p&gt;A different candle, timestamp or volume figure can look like evidence of a major problem when the underlying cause is something as ordinary as session coverage, interval alignment or historical adjustment.&lt;/p&gt;

&lt;p&gt;That does not mean every difference should be dismissed.&lt;/p&gt;

&lt;p&gt;It means the difference should be investigated in the correct order.&lt;/p&gt;

&lt;p&gt;Start with the instrument.&lt;/p&gt;

&lt;p&gt;Align the time.&lt;/p&gt;

&lt;p&gt;Match the interval and session.&lt;/p&gt;

&lt;p&gt;Understand the adjustment method.&lt;/p&gt;

&lt;p&gt;Record the source context.&lt;/p&gt;

&lt;p&gt;Then interpret what remains.&lt;/p&gt;

&lt;p&gt;For Ositrustees Research Notes, the principle is deliberately simple:&lt;/p&gt;

&lt;p&gt;Research. Compare. Verify.&lt;br&gt;
This article is part of the Ositrustees Research Notes series on market data, analytical workflows and reproducible research. It is provided for educational and informational purposes and does not constitute investment advice.&lt;/p&gt;

</description>
      <category>marketdata</category>
      <category>database</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Ositrustees Market Data Accuracy: Timestamps, Sessions and Source Context</title>
      <dc:creator>Tedor</dc:creator>
      <pubDate>Thu, 15 Oct 2026 12:34:25 +0000</pubDate>
      <link>https://dev.to/ositrustees/ositrustees-market-data-accuracy-timestamps-sessions-and-source-context-4akc</link>
      <guid>https://dev.to/ositrustees/ositrustees-market-data-accuracy-timestamps-sessions-and-source-context-4akc</guid>
      <description>&lt;p&gt;Ositrustees Market Data Accuracy: Timestamps, Sessions and Source Context&lt;br&gt;
Market-data discrepancies are often caused by configuration differences before they are caused by incorrect data.&lt;br&gt;
At Ositrustees, we approach market-data comparison as a structured research problem: first align the inputs, then compare the outputs.&lt;br&gt;
That means looking at instrument identity, timestamps, trading sessions, chart intervals, historical adjustments and source context before deciding that two market-data views actually conflict.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with the exact instrument
A company name alone is not enough to identify a market instrument.
The same company may trade on multiple exchanges, and similar ticker symbols can refer to different securities in different markets.
Before comparing values, confirm:&lt;/li&gt;
&lt;li&gt;ticker&lt;/li&gt;
&lt;li&gt;exchange&lt;/li&gt;
&lt;li&gt;currency&lt;/li&gt;
&lt;li&gt;market
This sounds basic, but instrument mismatches can make two otherwise valid datasets look inconsistent.&lt;/li&gt;
&lt;li&gt;Align timestamps and time zones
A timestamp only makes sense in context.
For example, a value recorded at 10:00 ET is not directly comparable with a value shown at 10:00 UTC.
When comparing market-data feeds, check:&lt;/li&gt;
&lt;li&gt;the recorded timestamp&lt;/li&gt;
&lt;li&gt;the time zone&lt;/li&gt;
&lt;li&gt;whether the timestamp refers to trade time, quote time or interface refresh time
A screen refresh and a market-data update are not necessarily the same event.&lt;/li&gt;
&lt;li&gt;Check the trading session
Regular-session and extended-hours data can produce different:&lt;/li&gt;
&lt;li&gt;opening prices&lt;/li&gt;
&lt;li&gt;highs and lows&lt;/li&gt;
&lt;li&gt;volume totals&lt;/li&gt;
&lt;li&gt;chart shapes
Two platforms can therefore display different-looking charts while both are technically correct.
Before treating the difference as a problem, confirm which trading session each view includes.&lt;/li&gt;
&lt;li&gt;Compare chart intervals
Chart intervals change how raw market activity is aggregated.
A one-minute chart and a five-minute chart are not showing the same level of detail, even if they cover the same period.
This matters when comparing:&lt;/li&gt;
&lt;li&gt;price bars&lt;/li&gt;
&lt;li&gt;volume&lt;/li&gt;
&lt;li&gt;short-term volatility&lt;/li&gt;
&lt;li&gt;intraday highs and lows
The interval should be aligned before differences are interpreted.&lt;/li&gt;
&lt;li&gt;Review historical adjustments
Historical datasets may be adjusted for corporate actions such as stock splits.
Different adjustment methodologies can change how historical price series appear.
That means two valid sources may show different historical values while still describing the same underlying instrument.
For research purposes, the key question is not simply:
Which chart is right?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A better question is:&lt;br&gt;
Are both charts using the same adjustment method?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add source context
Source context matters just as much as chart configuration.
A market-data feed, company publication, technical article, user review and search summary are different types of sources.
They should not automatically be treated as equivalent.
Repeated coverage also does not necessarily mean independent confirmation. One original statement may be quoted or summarized across several pages.
For that reason, Ositrustees treats source context as part of the research workflow rather than as an afterthought.&lt;/li&gt;
&lt;li&gt;Separate observation from interpretation
A useful research note distinguishes between what the data directly shows and what the researcher thinks it means.
For example:
Observation: several instruments in the same sector moved during the same period.
Interpretation: sector activity caused the move in a specific instrument.
The first statement is observable from the data.
The second needs additional evidence.
Keeping those two layers separate makes research easier to review later.
A practical comparison workflow
A simple market-data comparison process can be summarized as:
Identify → Align → Compare → Interpret
Identify
Confirm the instrument, exchange and market.
Align
Match timestamps, sessions, intervals and adjustment methods.
Compare
Review the actual differences between data views.
Interpret
Only then decide whether the discrepancy is meaningful.
This is the same principle behind the Ositrustees financial data and analytical technology workflow: reduce ambiguity in the inputs before drawing conclusions from the output.
Further reading
Ositrustees recently published related work around market-data accuracy and source verification.
Yahoo Finance coverage:
&lt;a href="https://finance.yahoo.com/markets/articles/ositrustees-introduces-2026-framework-strengthen-204200095.html" rel="noopener noreferrer"&gt;https://finance.yahoo.com/markets/articles/ositrustees-introduces-2026-framework-strengthen-204200095.html&lt;/a&gt;
Ositrustees Research Notes
Research. Compare. Verify.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>marketdata</category>
      <category>dataengineering</category>
      <category>fintech</category>
      <category>analytics</category>
    </item>
    <item>
      <title>How to Compare Market Data Feeds Without Misreading Timestamps, Sessions and Chart Settings</title>
      <dc:creator>Tedor</dc:creator>
      <pubDate>Wed, 14 Oct 2026 10:02:13 +0000</pubDate>
      <link>https://dev.to/ositrustees/how-to-compare-market-data-feeds-without-misreading-timestamps-sessions-and-chart-settings-2mnk</link>
      <guid>https://dev.to/ositrustees/how-to-compare-market-data-feeds-without-misreading-timestamps-sessions-and-chart-settings-2mnk</guid>
      <description>&lt;p&gt;Two market-data views can describe the same instrument and still show different numbers.&lt;br&gt;
One chart may display a larger price move. Another may show a different volume figure. Historical prices may not line up exactly, or the same trading session may appear to begin and end at different times.&lt;br&gt;
Before treating the discrepancy as a data-quality problem, compare the inputs first.&lt;br&gt;
This post walks through a practical workflow for separating genuine data discrepancies from differences caused by instrument identity, timestamps, chart configuration and session settings.&lt;br&gt;
Start With the Exact Instrument&lt;br&gt;
A company name is not always enough to identify the exact market instrument.&lt;br&gt;
The same company may trade on multiple exchanges. Similar names may refer to different securities, and the same ticker can sometimes exist in different markets.&lt;br&gt;
Before comparing two market-data views, match:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ticker&lt;/li&gt;
&lt;li&gt;exchange or venue&lt;/li&gt;
&lt;li&gt;currency&lt;/li&gt;
&lt;li&gt;instrument type
If those details differ, the charts may be describing different instruments even when the labels look similar.
A useful comparison starts with identity before moving to price behaviour.
Check the Timestamp
The next question is simple:
When was each displayed value actually updated?
A screen can refresh without every value changing at the same moment.
One source may reflect a recent transaction while another may use delayed data, a different aggregation cycle or another upstream provider.
When comparing two values, record:&lt;/li&gt;
&lt;li&gt;displayed timestamp&lt;/li&gt;
&lt;li&gt;time zone&lt;/li&gt;
&lt;li&gt;known delay&lt;/li&gt;
&lt;li&gt;market session&lt;/li&gt;
&lt;li&gt;last update time
The goal is to make sure both displays refer to the same period.
Align the Time Zones
Two charts can describe the same market event while displaying different clock times.
For example, one interface may use Eastern Time while another uses UTC.
The timestamps are not necessarily inconsistent. They may simply use different time zones.
Before interpreting a mismatch, normalize the time settings or convert both values to the same zone.
This small step prevents a surprising number of false discrepancies.
Match the Chart Interval
A five-minute candle and a daily candle summarize different amounts of activity.
Even two intraday charts can look different when one uses five-minute candles and the other uses fifteen-minute candles.
Before comparing the structure of a move, align:&lt;/li&gt;
&lt;li&gt;candle duration&lt;/li&gt;
&lt;li&gt;date range&lt;/li&gt;
&lt;li&gt;start time&lt;/li&gt;
&lt;li&gt;end time
Aggregation matters.
A short interval can reveal volatility that disappears when the same data is compressed into a longer period.
Neither view is automatically more accurate. They answer different analytical questions.
Compare the Trading Sessions
Session settings can materially change a chart.
One source may show only regular trading hours.
Another may include pre-market and after-hours activity.
That difference can affect:&lt;/li&gt;
&lt;li&gt;opening values&lt;/li&gt;
&lt;li&gt;closing values&lt;/li&gt;
&lt;li&gt;intraday highs and lows&lt;/li&gt;
&lt;li&gt;visible gaps&lt;/li&gt;
&lt;li&gt;total volume
If two charts disagree, check whether both include the same trading hours before looking for a more complex explanation.
Review Historical Adjustments
Historical charts introduce another variable: adjustment methodology.
A stock split can change how earlier prices appear.
Some charting systems also adjust for dividends or other corporate actions.
If one chart uses adjusted data and another does not, their historical series can differ substantially even when both are based on legitimate source data.
For long-term comparisons, always check:&lt;/li&gt;
&lt;li&gt;split adjustments&lt;/li&gt;
&lt;li&gt;dividend adjustments&lt;/li&gt;
&lt;li&gt;back-adjustment settings&lt;/li&gt;
&lt;li&gt;corporate-action handling
Give Volume a Fair Comparison
Volume can also become misleading when the observation periods differ.
Suppose you check today's volume halfway through the session and compare it with yesterday's completed session.
Those numbers represent different amounts of elapsed time.
A more useful comparison may involve:&lt;/li&gt;
&lt;li&gt;the same portion of each session&lt;/li&gt;
&lt;li&gt;completed session vs completed session&lt;/li&gt;
&lt;li&gt;average volume at a comparable time of day
The objective is not simply to compare numbers. It is to compare numbers that describe equivalent conditions.
Understand What a Screener Result Actually Means
A market screener helps reduce a large universe of instruments to a smaller set that matches selected criteria.
But a screener result is not a conclusion.
Its output depends on:&lt;/li&gt;
&lt;li&gt;filter definitions&lt;/li&gt;
&lt;li&gt;market coverage&lt;/li&gt;
&lt;li&gt;observation period&lt;/li&gt;
&lt;li&gt;available data&lt;/li&gt;
&lt;li&gt;calculation methodology
If a screener flags an unusual volume condition, the next step should be to investigate the context rather than immediately infer a cause.
Record the filter settings and scan time so the result can be reproduced later.
Add Sector Context
Once the data is aligned, widen the comparison.
Ask whether related instruments moved in a similar direction over the same period.
If several instruments in the same sector show comparable activity, the observation may reflect a broader pattern.
If the movement is concentrated in one instrument, the research question changes.
Sector context helps describe the pattern.
It does not establish why the move occurred, and it does not predict what happens next.
That distinction matters.
Separate Observation From Explanation
A useful research workflow separates what was observed from what is inferred.
For example:
The instrument gained 2.3% during the regular session while several sector peers also moved higher.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is an observation.&lt;br&gt;
Sector demand caused the instrument to rise.&lt;/p&gt;

&lt;p&gt;That is an explanation.&lt;br&gt;
The second statement may be reasonable, but it requires additional evidence beyond the chart itself.&lt;br&gt;
Keeping those two layers separate makes analytical notes easier to review and challenge later.&lt;br&gt;
Build a Repeatable Research Note&lt;br&gt;
A good market-data comparison should be reproducible.&lt;br&gt;
A short research note can record:&lt;br&gt;
Instrument&lt;br&gt;
Ticker, venue and currency.&lt;br&gt;
Source&lt;br&gt;
Where the data came from.&lt;br&gt;
Timestamp&lt;br&gt;
Including the time zone.&lt;br&gt;
Interval&lt;br&gt;
For example, five-minute or daily.&lt;br&gt;
Session&lt;br&gt;
Regular hours, extended hours or both.&lt;br&gt;
Settings&lt;br&gt;
Including historical adjustments.&lt;br&gt;
Observation&lt;br&gt;
What was actually visible in the data.&lt;br&gt;
Open questions&lt;br&gt;
What remains unresolved.&lt;br&gt;
This structure makes it easier to revisit the same comparison later without reconstructing the context from memory.&lt;br&gt;
A Simple Comparison Checklist&lt;br&gt;
Before deciding that two market-data feeds disagree, check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Are they showing the same instrument?&lt;/li&gt;
&lt;li&gt;Are the timestamps aligned?&lt;/li&gt;
&lt;li&gt;Are the time zones the same?&lt;/li&gt;
&lt;li&gt;Are the candle intervals equivalent?&lt;/li&gt;
&lt;li&gt;Are both charts using the same trading session?&lt;/li&gt;
&lt;li&gt;Are historical adjustments configured consistently?&lt;/li&gt;
&lt;li&gt;Are volume figures calculated over comparable periods?&lt;/li&gt;
&lt;li&gt;Are the sources using the same aggregation method?
Only after those questions are answered does it make sense to investigate a deeper data-quality issue.
The Core Principle
A useful market-data workflow is not about forcing every source to display identical numbers.
It is about understanding why the numbers differ and documenting the conditions behind the comparison.
Better analysis often starts with something simple:
align the inputs before interpreting the output.
This research note is part of the Ositrustees technical research series on market data, source comparison and structured analytical workflows.
Research. Compare. Verify.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
  </channel>
</rss>
