Howwise RSS
Trading Software7 min read

Alpha Vantage Asian Stock Exchanges: Symbol Suffixes

Short answer

Alpha Vantage Asian stock exchanges are only partly covered: Shanghai (.SHH) and Shenzhen (.SHZ) are documented suffixes, while Tokyo and Hong Kong are not documented, so verify each ticker with SYMBOL_SEARCH before relying on it.

Key takeaways
  • Alpha Vantage uses a suffix format (SYMBOL.EXCHANGE, such as 600104.SHH), so prefix forms like TYO.4446 or HKG:0700 always fail.
  • Only .SHH (Shanghai) and .SHZ (Shenzhen) are documented for Asia; Tokyo and Hong Kong support must be tested per ticker and can change over time.
  • SYMBOL_SEARCH returns the exact symbol, region, currency and market hours, so it is the authoritative way to check whether a ticker exists in the API.
  • Invalid API call, an Information notice and an empty JSON object are three different failures: bad symbol, limit or premium gating, and no data.
  • When a market is unsupported, yfinance (.T, .HK, .SS, .SZ), Twelve Data, EODHD or Stooq are common fallbacks, each with licensing and adjustment trade-offs.

Which Asian stock exchanges does Alpha Vantage support?

Coverage of Asian markets is uneven. The documented examples for international equities include London (.LON), Toronto (.TRT and .TRV), XETRA (.DEX), India BSE (.BSE), Shanghai (.SHH) and Shenzhen (.SHZ). Those are the only Asian suffixes with documented examples for the daily time series endpoints.

Tokyo (.T or .TYO) and Hong Kong (.HK) are not in that documented list. A ticker from those markets may return an error, an empty object, or occasionally data, depending on what the vendor currently carries. Treat them as unverified until a probe says otherwise.

This is why a setup that works for London, India and Australia can fail for Japan and Hong Kong. The code path is identical, but the symbol universe behind it is not.

MarketSuffix to tryStatusExample
Shanghai.SHHDocumented600104.SHH
Shenzhen.SHZDocumented000002.SHZ
India (BSE).BSEDocumentedRELIANCE.BSE
London.LONDocumentedTSCO.LON
Tokyo.T / .TYONot documented, test it7203.T
Hong Kong.HKNot documented, test it0700.HK
Warning: Coverage changes over time and old forum answers go stale. Do not assume a market works because another exchange does; confirm with SYMBOL_SEARCH and the vendor's current documentation, and re-check periodically.

What is the correct symbol format for Alpha Vantage?

The format is the local ticker followed by a dot and the exchange suffix: SYMBOL.EXCHANGE. Prefix forms such as TYO.4446, HKG:0700 or SHA:600104 are not parsed as exchange qualifiers. The API treats the whole string as an unknown symbol and returns an error.

MIC codes (XTKS, XHKG, XSHG, XSHE) are also wrong. They are ISO market identifiers, not Alpha Vantage suffixes.

Each Asian market has its own ticker rules, and getting the digits wrong is as common as getting the suffix wrong.

MarketCode ruleRightWrong
Japan4-digit numeric (newer codes may include a letter)7203.TTYO.7203, XTKS:7203
Hong KongNumeric, commonly zero-padded to 4 digits by Yahoo-style feeds0700.HK (also try 700.HK)HKG:0700, XHKG:700
Shanghai6 digits starting with 6600104.SHHSHA:600104, 600104.SS
Shenzhen6 digits starting with 0 or 3000002.SHZSZ:000002, 000002.SZ
Tip: Mainland China codes tell you the exchange: 6xxxxx is Shanghai, 0xxxxx and 3xxxxx are Shenzhen. Yahoo-style suffixes (.SS, .SZ) differ from Alpha Vantage's (.SHH, .SHZ), so do not copy symbols between providers unchanged.

How do I verify a symbol with SYMBOL_SEARCH?

SYMBOL_SEARCH is a fuzzy search over the vendor's symbol universe. If a ticker is not returned there, TIME_SERIES_DAILY will not work for it either, which makes this the fastest first check.

Search by company name or code, then read the matches. Each match includes the exact symbol string to use, plus the name, type, region, marketOpen, marketClose, timezone, currency and a matchScore.

  1. Call SYMBOL_SEARCH with keywords set to the company name (for example toyota) and, separately, the code (for example 7203).
  2. Read the 2. name and 4. region fields to confirm the match is the right company and market.
  3. Copy the 1. symbol value exactly as returned, including the suffix, and use it in your data call.
  4. Check 8. currency (JPY, HKD, CNY) so you do not mix currencies in a portfolio.
  5. If bestMatches is empty for both the name and the code, treat the market as unsupported for that ticker.
https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=tencent&apikey=YOUR_KEY

# Response shape (fields abbreviated)
{
  "bestMatches": [
    {
      "1. symbol": "600104.SHH",
      "2. name": "...",
      "3. type": "Equity",
      "4. region": "Shanghai",
      "5. marketOpen": "09:30",
      "6. marketClose": "15:00",
      "7. timezone": "UTC+08",
      "8. currency": "CNY",
      "9. matchScore": "..."
    }
  ]
}
Tip: Pass parameters through a dict in requests rather than building the URL by hand. Dots in symbols do not need encoding, and requests escapes spaces in keywords correctly.

Why do I get an error, an empty response or an Information message?

Alpha Vantage returns HTTP 200 for almost everything, including failures. Checking the status code tells you nothing, so you have to inspect the JSON body keys.

Each body pattern points to a different cause, and the fix differs for each.

Body you receiveLikely causeFix
"Error Message": "Invalid API call..."Symbol not recognized: wrong suffix, prefix form, MIC code or unsupported marketRun SYMBOL_SEARCH, copy the exact symbol, or move to another provider
"Information": "... rate limit ..."Free key daily limit (commonly 25 requests per day) or per-minute burst limit reachedWait, cache results, or upgrade the plan
"Information": "... premium ..."Endpoint or parameter gated, such as outputsize=full or the adjusted daily seriesUse outputsize=compact or a premium key
{} or no time series keySymbol resolves but has no data, or a transient backend problemRetry once, then search for the symbol; if still empty treat it as unsupported
Warning: A probe loop burns quota. On a 25-requests-per-day free key, testing five suffixes for five tickers uses the whole day. Probe one representative ticker per market, not your full watchlist.

Python probe: which suffix returns data?

This script tries a code against several candidate suffixes and classifies each response by body, not by status code. It stops early if the quota is exhausted so it does not waste calls.

Run it once per market with a known liquid ticker, then record the results with the date, since coverage can change.

import time, requests

API = "https://www.alphavantage.co/query"
KEY = "YOUR_KEY"

def classify(body):
    if "Error Message" in body:
        return "invalid_symbol"
    if "Information" in body or "Note" in body:
        msg = (body.get("Information") or body.get("Note")).lower()
        return "premium" if "premium" in msg else "rate_limit"
    if "Time Series (Daily)" in body:
        return "ok"
    return "empty"

def probe(code, suffixes, function="TIME_SERIES_DAILY"):
    results = {}
    for sfx in suffixes:
        sym = f"{code}{sfx}"
        r = requests.get(API, params={
            "function": function, "symbol": sym,
            "outputsize": "compact", "apikey": KEY}, timeout=30)
        r.raise_for_status()
        body = r.json()
        status = classify(body)
        results[sym] = status
        if status == "ok":
            ts = body["Time Series (Daily)"]
            last = max(ts)
            print(sym, "last bar", last, ts[last]["4. close"])
        if status == "rate_limit":
            print("Quota hit, stopping")
            break
        time.sleep(1.2)  # stay under burst limits
    return results

print(probe("7203", [".T", ".TYO"]))
print(probe("0700", [".HK"]))
print(probe("600104", [".SHH", ".SHZ"]))
print(probe("000002", [".SHZ", ".SHH"]))
Tip: Cross-check any "ok" result: compare the last close with a second source and confirm the currency from SYMBOL_SEARCH. A returned series does not prove the data is current, complete or in the currency you expect.

Daily vs adjusted data, currency and end-of-day caveats

TIME_SERIES_DAILY returns raw open, high, low, close and volume. TIME_SERIES_DAILY_ADJUSTED adds an adjusted close plus dividend and split columns, but it has been a premium-gated endpoint, so a free key may return an Information notice instead of data. Without adjusted prices, backtests will show false jumps at splits and distort returns on dividend-paying stocks.

The free outputsize=compact returns roughly the latest 100 daily bars. Full history (outputsize=full) is a premium parameter on many plans, so long backtests may require a paid key.

Data is end-of-day. Asian sessions close before Europe and the US open, so a bar may appear hours later than the local close, and it can be missing on local holidays. Timestamps are plain dates in the exchange's local calendar; do not join them against US-calendar data without aligning trading days.

Each series is in the local currency (JPY, HKD, CNY). Convert with a separate FX series if you aggregate across markets, and keep the conversion date aligned to the bar date to avoid look-ahead.

What are the alternatives when a market is unsupported?

If the probe shows no Tokyo or Hong Kong data, move that market to a provider that covers it explicitly. Keep a small adapter layer that maps your internal ticker to each vendor's format, so switching costs one function instead of a rewrite.

Licensing matters as much as coverage. Scraped or unofficial feeds are fine for research but are risky in anything redistributed or commercial.

SourceSuffixes / formatStrengthsTrade-offs
yfinance (Yahoo).T, .HK, .SS, .SZFree, wide Asian coverage, adjusted pricesUnofficial, personal-use terms, can break or throttle without notice
Twelve DataSymbol plus exchange or MIC parameterOfficial API, structured exchange handlingAsian coverage and history depend on plan tier
EODHD.TSE (Tokyo), .HK, .SHG, .SHEEnd-of-day history with adjusted data, official APIPaid for meaningful volume; confirm exchange codes in its list
StooqLowercase codes such as 7203.jp, 0700.hkFree CSV downloadsLimited fields, no formal SLA, adjustment handling varies
Exchange or vendor feedsNative codesAuthoritative, licensedCost, contracts, heavier integration
Tip: Whichever provider you use, pick a handful of tickers with known splits or dividends and compare adjusted closes across two sources before trusting a backtest.

Common questions

Is the Alpha Vantage Tokyo Stock Exchange symbol .T or .TYO?

Neither is documented for the daily endpoints. Test both with SYMBOL_SEARCH and the probe script, for example 7203.T and 7203.TYO, and only use the one that actually returns data and a JPY currency field.

Should the Alpha Vantage Hong Kong ticker be 0700.HK or 700.HK?

Try both forms. Many feeds zero-pad to four digits while others do not, and the form the API accepts, if any, is the one SYMBOL_SEARCH returns. If neither returns anything, Hong Kong is not covered for that symbol.

Why does the same Shanghai code fail with .SHZ?

The suffix must match the listing exchange. Codes starting with 6 are Shanghai (.SHH), while codes starting with 0 or 3 are Shenzhen (.SHZ), so 600104.SHZ is invalid even though 600104.SHH works.

Does a 200 status mean my Alpha Vantage request worked?

No. Rate limits, premium notices and invalid symbols all arrive as HTTP 200 with a JSON body containing Error Message or Information. Always check for the expected time series key before parsing.

Can I use yfinance symbols directly in Alpha Vantage?

Not reliably. Yahoo uses .SS and .SZ for China, while Alpha Vantage documents .SHH and .SHZ, and Tokyo and Hong Kong support is unconfirmed. Map symbols per provider and verify each one.

Related topics:alpha vantageasian marketssymbol searchmarket data apipython