文:fasiondog
来源:http://fasiondog.blog.163.com/blog/static/24979514200941594053924
昨日,因要从大智慧5中导入证券代码名称,被折腾了半天,最主要的原因是这个证券代码表中没有指明该证券代码属于哪个交易所(上证还是深证?)。大智慧5的证券名称代码表格式,参见水瓶星系的博客:《大智慧5.60经典版数据格式分析与程序接口开发(1)》。 下面摘录于此:
证券名称列表对应文件为 dzh安装目录 internet tcpipdata init.dat 文件,该文件在大智慧每次启动时被删除,并重新从服务器上下载。
文件结构描述如下:
(1)文件大小 = 头部字段28字节 + 证券数量 × 32字节(每个证券占用 32 字节)
(2)头部字段
(2.1) 1~8字节:大智慧最后一次联网的日期,8字节ASCII字符串
(2.2) 9~10字节:未知
(2.3)11~12字节:证券数量
(2.4)13~28字节:未知
(3)每个证券内容描述
(3.1)1~8字节:证券名称
(3.2)9~14字节:证券代码
(3.3)15~16字节:证券代码类型
(3.3.1)0x1F 0x00一般证券(场内交易的股票和基金等)
(3.3.2)0x1E 0x00 证券指数(上证指数、深圳)
(3.3.3) 0x20 0x00 证券指数(沪深300指数等
(3.4)17~32字节:未知
水星系博客中介绍了一种区分重复证券代码属于哪个交易所的方法,意思是如果证券代码存在重复,则判定证券代码类型,如果类型为偶数则为上证,否则为深证。详见:《大智慧5.60经典版数据格式分析与程序接口开发(2)》
不过,上面的方法需要先找出重复的代码再判断,我嫌麻烦,于是仔细研究了一下证券代码分配规则,这下可惹火上身,才发现所谓的分配规则中似乎还有不少不符合规则的代码,估计是历史遗留问题?主要是一些基金和债券的类别混乱。在大智慧的证券代码名称列表中,证券代码类型只有三种:30、31、32。30都是指数;31是A股、B股还有基金;32按理应该都是债券,不过还包含了少量的指数(如沪深300,中证100等)。因我之要导入我需要的证券,其他的不管,部分不符合证券代码分配规则的股票大部分都已不需要,为了方便我也没剔除,反正不影响我后续的使用即可。最后,总结了下面的规则简单的判断该代码是上证还是深证:
<span style="color: #0000ff">if</span> stocktype == 30: #指数,少量指数在32类别中 <span style="color: #0000ff">if</span> stockcode[:3] == '000': #上证指数 marketid = 1 elif stockcode[:2] == '39': #深证指数 marketid = 2 elif stocktype == 31: #A股、B股、基金 <span style="color: #0000ff">if</span> stockcode[0] <span style="color: #0000ff">in</span> ('6', '9', '5'): marketid = 1 elif stockcode[0] <span style="color: #0000ff">in</span> ('0', '2', '1'): marketid = 2 elif stocktype == 32: #债券及少量指数 <span style="color: #0000ff">if</span> stockcode[0]=='0' or stockcode[:2]=='12': #少量上证指数'000' 和 上证国债‘0’、 上证债券'12' marketid = 1 elif stockcode[:2]=='10' or stockcode[:2]=='11': #深证国债和深证债券 marketid = 2