
2009年全国金融标准化技术委员会采标ISO 10383:2003 (Market Identification Code)为国家标准《证券和相关金融工具交易所和市场识别码》(GB/T23696-2009)
其中XSHG 代表 Shan(g)hai,XSHE 代表 Sh(e)nzhen。用来区别只使用6位代码的时候出现代码重名的问题。例如代码 000001,在上交所代表上证指数,在深交所则代表平安银行。
而按照此国家标准,代码全称 000001.XSHE 则代表深交所的平安银行,000001.XSHG 则代表上证指数。
为此常见的量化平台,例如聚宽提供了 API 函数 ,来进行常规的‘sh000001’,‘600519’等证券代码向ISO 10383:2003 (Market Identification Code)的归一化处理。
def normalize_code(code):
"""
归一化证券代码
:param code 如000001
:return 证券代码的全称 如000001.XSHE
"""
return JQDataClient.instance().normalize_code(**locals())
但是调用它需要登录聚宽账户,免费试用账户还有每天调用1000万次数据查询请求的限制。超过了会这样提示:
Exception: 您当天的查询条数超过了每日最大查询限制:1000万条;
付费可增加流量权限,详情请咨询管理员,微信号:马赛克马赛克
转换效果如下图所示:

幸亏它其实规则不复杂,所以我重新自己用本地Python代码实现了一遍。
class EXCHANGE(_const):
XSHG = 'XSHG'
SSE = 'XSHG'
SH = 'XSHG'
XSHE = 'XSHE'
SZ = 'XSHE'
SZE = 'XSHE'
def normalize_code(symbol, pre_close=None):
"""
归一化证券代码
:param code 如000001
:return 证券代码的全称 如000001.XSHE
"""
if (not isinstance(symbol, str)):
return symbol
if (symbol.startswith('sz') and (len(symbol) == 8)):
ret_normalize_code = '{}.{}'.format(symbol[2:8], EXCHANGE.SZ)
elif (symbol.startswith('sh') and (len(symbol) == 8)):
ret_normalize_code = '{}.{}'.format(symbol[2:8], EXCHANGE.SH)
elif (symbol.startswith('00') and (len(symbol) == 6)):
if ((pre_close is not None) and (pre_close > 2000)):
# 推断是上证指数
ret_normalize_code = '{}.{}'.format(symbol, EXCHANGE.SH)
else:
ret_normalize_code = '{}.{}'.format(symbol, EXCHANGE.SZ)
elif ((symbol.startswith('399') or symbol.startswith('159') or
symbol.startswith('150')) and (len(symbol) == 6)):
ret_normalize_code = '{}.{}'.format(symbol, EXCHANGE.SH)
elif ((len(symbol) == 6) and (symbol.startswith('399') or
symbol.startswith('159') or symbol.startswith('150') or
symbol.startswith('16') or symbol.startswith('184801') or
symbol.startswith('201872'))):
ret_normalize_code = '{}.{}'.format(symbol, EXCHANGE.SZ)
elif ((len(symbol) == 6) and (symbol.startswith('50') or
symbol.startswith('51') or symbol.startswith('60') or
symbol.startswith('688') or symbol.startswith('900') or
(symbol == '751038'))):
ret_normalize_code = '{}.{}'.format(symbol, EXCHANGE.SH)
elif ((len(symbol) == 6) and (symbol[:3] in ['000', '001', '002',
'200', '300'])):
ret_normalize_code = '{}.{}'.format(symbol, EXCHANGE.SZ)
else:
print(symbol)
ret_normalize_code = symbol
return ret_normalize_code
这是我的个人专栏《35岁程序员的退路:量化投资学习笔记》中的外篇内容。