As a former SEO Director at Nasdaq, I spent quite a bit of time thinking about optimizing financial data and tickerized content for search. Although I was pretty successful in doing that, it would have been nice to have some clear documentation to help me along the way.
It’s probably a small group of people who are interested in the confluence of SEO, Schema.org, and stock market data, but for that small group who might find it helpful, I thought I’d share a straightforward method I’ve used for applying structured markup to stock symbols mentioned in an article.
But first a little background on what could have been an interesting extension of Schema.org: FinancialQuote.
Google Finance’s Undocumented Schema.org Extension
Schema.org was something that came along toward the end of my tenure at Nasdaq. I was excited at the time about how it might potentially be extended to address financial data, a space with plenty of structured data sets in place already.
While poking around Google Finance a few years back, I noticed some interesting markup in the source code:
<div id="sharebox-data" itemscope="itemscope" itemtype="http://schema.org/Intangible/FinancialQuote">
<meta itemprop="name" content="Buffalo Wild Wings"/>
<meta itemprop="url" content="https://www.google.com/finance?cid=688538"/>
<meta itemprop="imageUrl" content="https://www.google.com/finance/chart?cht=g&q=NASDAQ:BWLD&tkr=1&p=1d&enddatetime=2013-07-30T20:00:00Z"/>
<meta itemprop="tickerSymbol" content="BWLD"/>
<meta itemprop="exchange" content="NASDAQ"/>
<meta itemprop="exchangeTimezone" content="America/New_York"/>
<meta itemprop="price" content="97.69"/>
<meta itemprop="priceChange" content="-0.70"/>
<meta itemprop="priceChangePercent" content="-0.71"/>
<meta itemprop="isAfterHours" content="true">
<meta itemprop="afterHoursPrice" content="98.50">
<meta itemprop="afterHoursPriceChange" content="+0.81">
<meta itemprop="afterHoursPriceChangePercent" content="0.83">
<meta itemprop="afterHoursQuoteTime" content="2013-07-30T23:59:46Z">
<meta itemprop="quoteTime" content="2013-07-30T20:00:00Z"/>
<meta itemprop="dataSource" content="NASDAQ real-time data"/>
<meta itemprop="dataSourceDisclaimerUrl" content="//www.google.com/help/stock_disclaimer.html#realtime"/>
<meta itemprop="priceCurrency" content="USD"/>
I was excited to find this little honeypot of finance-specific microdata, mainly because I thought I’d stumbled upon some little-known new settings that would give me an edge in search. Unfortunately I couldn’t find these properties documented anywhere, and my initial tests with them didn’t produce any observable benefit.
In my later research, I found that Aaron Bradley (a must-follow resource for all things Schema.org) had also observed Google Finance’s experimental extension of Schema.org, and noted a more common and useful approach than what Schema.org had already published for the tickerSymbol property.
Since Google got rid of its portfolio feature, and Google Finance is now much more streamlined than it used to be, I suspect there won’t be any further development of the FinancialQuote vocabulary by them. I mention it here, however, to ensure Google’s previous approach can be found easily by others looking to do something similar.
The Corporation Object in Schema
Since we don’t have a FinancialQuote object in Schema.org, the only object available for tickerSymbol to be associated with is Corporation.
I personally think this association is flawed since not all ticker symbols represent Corporations (tickers can represent ETFs, mutual funds, etc.). I’m also not clear on whether a Corporation can have a one-to-many relationship with tickerSymbol, which is an important feature, since corporations often have multiple classes of shares denoted by separate stock symbols (eg. GOOG and GOOGL).
The ever-helpful Aaron Bradley also points out here that, although Schema.org recommends using Market Identifier Codes (MIC), it’s not a format commonly used by publishers in practice, nor was it the format used by Google Finance. They also recommend using a space separator, where most folks would probably use a colon. To be clear, for Alphabet Inc.’s Class A Common Stock, GOOGL, Schema.org recommends using this:
"tickerSymbol": "XNAS GOOGL"
But a more intuitive (and probably acceptable) format would be:
"tickerSymbol": "NASDAQ:GOOGL"
The fact that Schema.org states “we reccommend [sic] using the controlled vocaulary [sic] of Market Identifier Codes” leads me to believe it’s not a hard requirement, and other commonly used formats that disambiguate the symbol across exchanges should work as well (the typos also suggest they haven’t spent a lot of time thinking about this particular entry).
A tickerSymbol Example in JSON-LD
There are many use cases for including ticker symbols in Schema.org markup, but the most common one I encounter with my publisher clients is when stocks are mentioned in the context of an article.
Since the primary CreativeWork in that case is an Article or NewsArticle, the “mentions” property seems most appropriate since it “Indicates that the CreativeWork contains a reference to, but is not necessarily about a concept.”
Stringing all that together, here’s a complete example in JSON-LD for an Article (or NewsArticle) that mentions a handful of stocks:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://www.example.com/article/article-title"
},
"headline": "Top Stocks for Today: AAPL, KO, TSLA, and NVDA",
"image": {
"@type": "ImageObject",
"url": "https://www.example.com/finance01.jpg",
"width": 696,
"height": 250
},
"datePublished": "2018-02-19T08:23:54-05:00",
"dateModified": "2018-02-19T08:25:04-05:00",
"author": {
"@type": "Person"
"name": "Jim Robinson"
},
"mentions": [
{
"@type": "Corporation",
"name": "Apple Inc.",
"tickerSymbol": "NASDAQ:AAPL",
"url": "https://www.example.com/symbol/aapl"
},
{
"@type": "Corporation",
"name": "The Coca-Cola Company",
"tickerSymbol": "NYSE:KO",
"url": "https://www.example.com/symbol/ko"
},
{
"@type": "Corporation",
"name": "Telsa, Inc.",
"tickerSymbol": "NASDAQ:TSLA",
"url": "https://www.example.com/symbol/tsla"
},
{
"@type": "Corporation",
"name": "The Coca-Cola Company",
"tickerSymbol": "NASDAQ:NVDA",
"url": "https://www.example.com/symbol/nvda"
}
],
"publisher": {
"@type": "Organization",
"name": "The Example Times",
"logo": {
"@type": "ImageObject",
"url": "https://www.example.com/images/logo.png"
}
},
"description": "This is a great article about a great day in the stock market."
}
</script>
Clearly there’s more than one way to skin a cat, but this code makes sense intuitively, it validates in Google’s Structured Data Testing Tool, and it’s been used successfully on a large-scale production site. Use and modify as you wish, but use at your own risk and your mileage may vary.
Ticker Symbols in Google News Sitemaps
This has nothing to do with Schema.org, but if you’re a publisher who wants to implement the Schema.org markup above on your site, there’s a good chance you already have (or want to have) a Google News XML Sitemap. The XML for that happens to have a <news:stock_tickers> field you can populate with the same data you used for the tickerSymbol property(ies). The fact that the Google News Sitemap spec uses the “NASDAQ:GOOGL” format instead of “XNAS GOOGL” is another good reason to stick with the more common format, and doing so should make it a little easier for developers.
In the end, I’m not breaking any new ground with this post. I really just wanted to pull together the breadcrumb trail left by Aaron Bradly into a single resource, and to offer an easy copy-n-paste example for someone who needs serviceable JSON-LD markup for articles that mention stock symbols. That said, I encourage you to leave any additional insight you might have in the comments, and perhaps contribute to some of the semi-recent discussion that’s taken place around this topic.
If you’re a publisher looking to do more with Schema and other aspects of SEO, check out my publisher SEO services and don’t hesitate to get in touch.