Alpha Vantage Asian Stock Exchanges: Symbol Suffixes
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.
- 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.
| Market | Suffix to try | Status | Example |
|---|---|---|---|
| Shanghai | .SHH | Documented | 600104.SHH |
| Shenzhen | .SHZ | Documented | 000002.SHZ |
| India (BSE) | .BSE | Documented | RELIANCE.BSE |
| London | .LON | Documented | TSCO.LON |
| Tokyo | .T / .TYO | Not documented, test it | 7203.T |
| Hong Kong | .HK | Not documented, test it | 0700.HK |
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.
| Market | Code rule | Right | Wrong |
|---|---|---|---|
| Japan | 4-digit numeric (newer codes may include a letter) | 7203.T | TYO.7203, XTKS:7203 |
| Hong Kong | Numeric, commonly zero-padded to 4 digits by Yahoo-style feeds | 0700.HK (also try 700.HK) | HKG:0700, XHKG:700 |
| Shanghai | 6 digits starting with 6 | 600104.SHH | SHA:600104, 600104.SS |
| Shenzhen | 6 digits starting with 0 or 3 | 000002.SHZ | SZ:000002, 000002.SZ |
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.
- Call SYMBOL_SEARCH with keywords set to the company name (for example toyota) and, separately, the code (for example 7203).
- Read the 2. name and 4. region fields to confirm the match is the right company and market.
- Copy the 1. symbol value exactly as returned, including the suffix, and use it in your data call.
- Check 8. currency (JPY, HKD, CNY) so you do not mix currencies in a portfolio.
- 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": "..."
}
]
}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 receive | Likely cause | Fix |
|---|---|---|
| "Error Message": "Invalid API call..." | Symbol not recognized: wrong suffix, prefix form, MIC code or unsupported market | Run 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 reached | Wait, cache results, or upgrade the plan |
| "Information": "... premium ..." | Endpoint or parameter gated, such as outputsize=full or the adjusted daily series | Use outputsize=compact or a premium key |
| {} or no time series key | Symbol resolves but has no data, or a transient backend problem | Retry once, then search for the symbol; if still empty treat it as unsupported |
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"]))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.
| Source | Suffixes / format | Strengths | Trade-offs |
|---|---|---|---|
| yfinance (Yahoo) | .T, .HK, .SS, .SZ | Free, wide Asian coverage, adjusted prices | Unofficial, personal-use terms, can break or throttle without notice |
| Twelve Data | Symbol plus exchange or MIC parameter | Official API, structured exchange handling | Asian coverage and history depend on plan tier |
| EODHD | .TSE (Tokyo), .HK, .SHG, .SHE | End-of-day history with adjusted data, official API | Paid for meaningful volume; confirm exchange codes in its list |
| Stooq | Lowercase codes such as 7203.jp, 0700.hk | Free CSV downloads | Limited fields, no formal SLA, adjustment handling varies |
| Exchange or vendor feeds | Native codes | Authoritative, licensed | Cost, contracts, heavier integration |
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.