分析家数据读取及转换工具V0.7及C#源码

Discussion in 'Wealth-Lab Developer' started by zwz, Mar 27, 2006.

  1. zwz

    zwz

    增加了C#完整源码(能力所限未优化)下载,请批评指正。


    分析家数据读取及转换工具使用说明

    V0.7新增功能:

    分析家数据读取及转换工具V0.7版增加了以下功能:(1) 可以象读取其它数据一样方便地读取复权行情和收盘收益率;(2)增加了一个命令行工具fxj2txt.exe,可以将分析家数据转换为文本,供个别不方便调用DLL组件的软件(如SAS等)调用;(3)提供了一个直接读取分析家数据的SAS程序(下载);(4)提供了一个利用FinData.dll创建Wealth-lab数据读取插件的实例程序(源代码及安装程序下载)。

    V0.6新增功能:

    分析家数据读取及转换工具V0.6版增加了以下功能:(1)可以读取用户板块和股票评级数据;(2)可以读取板块指数各类数据;(3)可以读取市场代码和名称、表名,生成创建对应SAS数据表的PROC SQL语句;(4)将分析家数据读取器整合到组件中,可以在语言中直接调用,同时增加了将读取出来的数据保存为文本文件的功能;(5)增加了一个分析家数据转换工具(也可以在程序中直接调用),该转换工具可以一次性将各类分析家数据直接转换为文本文件(字段间的分隔符可以自定义,可以生成容易被EXCEL等读取的格式);(6)修正了读取基金、权证报价时存在的一个BUG;基金、权证的报价保存三位小数位。

    简介:

    用户一般采取两种方法读取分析家软件的各类数据:一种是先使用数据转换工具将分析家数据转换为某种格式,然后在软件中读取转换后的数据,这种方法无需要编写数据读取程序,操作简单,但难以灵活控制数据读取;另一种办法是通过编程直接读取分析家数据,这种方式较为灵活,但要求深入了解分析家数据存储结构,且熟悉文件I/O操作编程知识。“分析家数据读取 及转换组件”不仅提供了数据转换工具——“分析家数据转换器”,还提供了介于上述两种方法之间的另一选择——“分析家数据读取及转换组件”。分析家数据读取及转换组件是一个DLL,它可以通过方便地在各种语言中直接调用而读取分析家数据,用户不需要了解分析家数据存储结构,不需要自己编写数据读取程序,只需要少量编程知识就可以获得所需数据并进行加工处理 ;它还可以在各种语言中直接调用分析家数据转换工具将各类数据转换为文本文件。分析家数据读取组件采用C#开发,安装程序时会自动注册成为COM组件,可以在支持COM和.NET的语言中(如VB、Office VBA、VBS、Delphi、C#、VB.NET、C++.NET、J#、SAS、Matlab等)直接调用。该组件工具是免费的。源码可从http://www.sasfans.com/bbs/dispbbs.asp?boardid=2&ID=97下载。
    主要功能:

    1、既可以读取分析家一般数据,如证券代码表、日线数据、复权行情数据及收益率、当日分笔数据、历史分笔数据、当前最新行情、5分钟线行情、除权数据、财务数据 、板块数据等,也可以读取专业数据,如资产负债表数据、损益表数据、现金流量表数据、财务分析指标、股本结构、分红送配、十大股东、基金周报、基金投资组合 、股票评级等数据;

    2、可读取沪、深、港等各个市场的已安装数据;读取时无须关闭正在运行的分析家软件;

    3、可以从注册表中读取出市场代码及名称,也可以以表格形式列出数据表名及对应文件名、字段信息(如字段名和字段说明),以便于程序自动处理 ;可以生成创建SAS表的语句;

    4、提供了分析家数据读取器和数据转换器,可以直接在程序中调用读取器和转换器;

    5、提供了一个用于演示和测试调用结果的工具;同时提供VBA、VBS、SAS等语言调用实例(SAS调用实例见http://www.sasfans.com)。
    版本说明:

    目前组件最新版本为0.6版,主要支持分析家6.0。如果分析家版本为6.0以下,则部分功能无法使用。
    下载安装方法:

    (如果已安装了旧版本请先用提供的Uninstall工具删除!)
    首先,访问http://www.sasfans.com等网站下载安装文件FinDataToolsV0.7.rar。 解压后,双击安装文件开始安装,安装程序会自动检测系统是否已安装了.NET框架2.0中文版(.NET Framework 2.0),如果未安装则安装程序会提示安装(安装程序会.NET Framework 2.0下载页面;或者从这里直接下载:http://www.microsoft.com/Downloads/...dll(组件)、FinData.tlb(COM类型库)、FinDataTools.exe( 分析家数据读取及转换工具) 、Fxj2Txt.exe(分析家数据转换命令行工具)、FinDataTools.xls(EXCEL调用例子)、FinDataTools.vbs(VBScript调用例子)等,同时将在“程序”菜单中创建一个名为“FinData”的菜单,包括“FinDataTools数据工具”、“卸载”等快捷方式。
    使用方法:

    调用方法与其它COM/.NET组件一样。

    例如,安装后要测试一下是否注册成功为COM组件,可以创建一个VBS文件(扩展名为.VBS),键入以下两行:
    set fxj = createobject("findata.fxjdata")
    fxj.ShowFxjReader()

    执行时如果正确显示分析家数据读取器窗口,说明注册成功。把上面第二行换为fxj.ShowFxjConverter()则可以打开分析家数据转换器,等等。

    再举一个在EXCEL VBA中的调用例子:打开EXCEL Visual Basic编辑器,双击打开“工程”中的“ThisWorkBook”,点击“工具”、“引用”,在“可使用的引用”列表中找到并选择“FinData金融数据 工具”后确定。在ThisWorkBook代码区输入如下代码:
    Sub ReadFxjData()
    '调用组件,读取数据保存在变量X中
    Dim x As Variant
    Dim fxj As New FinData.FxjData
    x = fxj.GetData("hq", "SZ000001") ‘读取数据保存在X中
    '以下语句将数据保存在工作表中
    For i = 0 To UBound(x, 1)
    For j = 0 To UBound(x, 2)
    ThisWorkbook.Worksheets(1).Cells(i + 1, j + 1) = x(i, j)
    Next
    Next
    End Sub
    按F5运行。其中关键语句是x = fxj.GetData("hq", "SZ000001"),只要改变方法GetData中的参数就可以读取到不同的数据,返回的X是一个二维 字符串数组。
    在.NET语言中调用方法也很简单,主要语句如下:
    FinData.FxjData fxj = new FinData.FxjData();
    string[,] s = fxj. GetData("hq", "SZ000001");

     

    上面只是一些例子,具体功能的使用见以下说明。
    组件方法和属性说明:
    (1)方法GetData
    语法:public string[,] GetData(string dataType, string code) 或 public string[,] GetData(string dataType, string code, string newFileName)
    功能:读取各类数据
    参数说明:
    •dataType为数据类型,目录允许的值如下:
    “dm”——代码表,对应分析家文件stkinfo51.dat
    “hq”——日行情,对应分析家文件day.dat
    “hqmb”——每笔成交,对应分析家文件report.dat或*.prp
    “hq0”——最新行情,对应分析家文件stkinfo51.dat
    “hq5”——五分钟线,对应分析家文件min.dat
    “fp”——分红送配,对应分析家文件exprof.fdt
    “gb”——股本结构,对应分析家文件capital.dat
    “gd”——十大股东,对应分析家文件stkhold.dat
    “cq”——除权数据,对应分析家文件stkinfo51.dat
    “cw”——专业财务数据,对应分析家文件finance.fdt
    “cw0”——最新财务数据,对应分析家文件stkinfo51.dat
    “jjjz”——基金周报,对应分析家文件fundweek.fdt(V0.5中该代码为jjzb,现改为jjjz,“基金净值”拼音首字母)
    “jjzh”——基金投资组合;对应分析家文件funddiv.fdt

    “bk”——板块;对应分析家文件*.blk

    “pj”——评级;对应分析家文件:评级.str

    “hqfq”——复权行情。复权计算方法与一般行情软件有所不同:只对日线数据中的开盘价、最高价、最低价、收盘价进行复权处理,成交量未作复权处理;先根据价格和除权数据计算出每日总收益率,然后用“向前复权”方法计算出复权价格(优点是:假设了分红再投资,任何两点间的收益率不受分红送配时间的影响,便于分析比较);提供根据收盘价计算的收益率。

     

     

    •code为证券代码 ,格式如“SH000001”、“SZ000001”、“HK0001”等,其中板块指数的代码如“$$AA01”、“$$AA02”等;当dataType为“dm”时,为市场代码“SH”或“SZ”等,板块指数的市场代码为“$$”。
    如:GetData("hq","SZ399001") 读取SZ399001(深成指)的所有行情数据;GetData("hq","$$AA01")读取板块指数$$AA01行情。
    GetData(“dm”,”SH”) 读取沪市证券代码表

    •newFileName为不含路径的文件名,例如:读取沪市代码表时默认从分析家目录安装目录下的DATA\SH\StkInfo51.Dat文件中读取,但可以指定从其它文件读取,如GetData(“dm”,”SH”,”stkinfo88888.dat”)将从stkinfo8888.dat文件读取代码表(当然前提是该文件结构与stkinfo51.dat相同)。该功能主要用于读取历史分笔数据,如GetData(“hqmb”,”SZ000001”,”20060322.PRP”)将读取深发展2006年3月22日的分笔成交数据。


    返回值:返回一个二维字符串数组,每一列为一字段,每一行为一数据记录。注意,这里返回的是一个字符串数组,一般需要根据需要类型转换。


    (2)方法GetFields
    语法:public string[,] GetFields(string dataType)
    功 能:读取各种数据类型的字段名、字段含义、类型。
    参数说明:dataType为指定数据类型同GetData。

    返回值:一个二维数组

    (3)方法GetTables
    调用格式:public string[,] GetTables()

    功 能:读取各表的表名、中文说明、 对应文件。

    返回值:一个二维数组
    (4)方法GetMarkets
    语法:public string[,] GetMarkets()
    功 能:从注册表中读取市场列表:代码、简称、名称,如:SH、沪、上海证券交易所;SZ、深、深圳证券交易所。

    返回值:一个二维数组
    (5)方法GetTableDef
    语法:public string GetTableDef(string dataType, string descDataType, bool delOldTable)
    功 能:生成创建SAS表的PROC SQL语句。

    参数:dataType为“dm”等数据表名,descDataType目前只能为“SAS”,delOldTable是否同时生成删除同名数据表的语句。

    返回值:一个字符串
    (6)方法GetCodeType
    语法:public string GetCodeType(string code)
    功 能:根据证券代码获取证券品种,如:GetCodeType("SZ000001")将返回"gp"表示这是股票代码;GetCodeType("SH000001")将返回"zs”(指数);GetCodeType("SZ184688")将返回"jj"(基金),等。

    参数:code为证券代码。

    返回值:一个字符串:gp(股票)、zq(债券)、jj(基金)、qz(权证)、zs(指数)。

    (7)方法ShowAboutBox
    语法:public void ShowAboutBox()
    功 能:显示组件的“关于”窗口。

    (8)方法ShowFxjConverter
    语法:public void ShowFxjConverter()
    功 能: 显示“分析家数据转换器”窗口。可以读取各类数据,不过一般每次只能读取一只证券的数据;可以读取各字段信息;可以将读取出来的数据保存为文本文件。

    (9)方法ShowFxjReader
    语法:public void ShowFxjReader()
    功 能:显示“分析家数据读取器”窗口。可以将各类数据转换为文本文件,字段间的分隔符可以自定义;

    (10)属性FxjDataPath
    功能:字符串型,可读写,返回分析家数据目录(一般为c:\fxj\data\),如果组件无法自动获取正确的分析家数据目录,可以设置该属性指定分析家数据目录。

    (11)属性FxjPath
    功能:字符串型,返回分析家安装目录(一般为c:\fxj\)。
    (12)属性Error
    功能:整型,只读,返回上一步操作是否出现错误。若该属性为0,表示没有错误发生,若为1则表示发生了错误,具体错误信息可以通过MSG属性获得。
    (13)属性Msg
    功能:字符串型,只读,返回上一步操作的错误信息。
    (14)属性Version
    功能:实型,返回组件当前版本号。

    Fxj2Txt.exe使用说明:

    功能:生成以逗号为分隔符的文本。

    调用格式: fxj2txt.exe methodname args ... methodname可以是getdata、getfields、gettabledef、gettables、getmarkets、getcodetype,args为相应参数。如在DOS窗口下健入fxj2txt.exe getdata hq sz000001 将生成SZ000001(深发展)的行情数据等。可以用重定向符将生成的数据保存在一文本文件中:fxj2txt.exe getdata hq sz000001 > hqsz000001.txt。

    SAS通过fxj2txt.exe读取分析家数据的例子见http://www.sasfans.com/bbs/dispbbs.asp?boardid=2&ID=69&replyID=172:
     
  2. 好东西,将你的站点收藏了 8)
     
  3. zwz:
    以后安装软件最好还是搞成EXE吧,现在的MSI需要下载。NET2。X和WINDOWS INSTALLER 3。X,需要几十M多,而且WINDOWS INSTALLER 3。X下载需要正版认证,麻烦啊
     
  4. zwz

    zwz

  5. 谢谢分享
     
  6. zwz

    zwz

    工具中附带的分析家数据转换工具可以将以下数据转换为文本格式:
    证券代码表、日线数据、复权行情数据、当日分笔数据、历史分笔数据、当前最新行情、5分钟线行情、除权数据、财务数据 、板块数据、专业财务数据(资产负债表数据、损益表数据、现金流量表数据、财务分析指标)、股本结构、分红送配、十大股东、基金周报、基金投资组合 、股票评级等。
    操作界面如附图所示。左侧选择要转换的数据(自动判断系统所安装的数据),列表项分析表示数据类型中文名称、市场、数据类型代码、拟生的文件名、所读取的分析家文件;右侧选择目标目录、分隔符等。
    本工具转换速度较慢,由于精力能力所限,近期内不准备优化,有兴趣的请自行优化代码(源码已发布上面)。
     
  7. 谢谢版主先 有几个问题请教
    1 是否必须安装分析家 ?分笔数据 分钟数据是否必须先导入分析家中?
    还是说可将从网上下载的分笔数据 分钟数据直接转换为文本数据?
    2 amkr1015在以下帖子中提到的问题,版主是否也能解决?
    http://www.hylt.net/club/viewtopic.php?t=4160
    3版主的论坛不能注册,提示:提交外部数据 不合法 关掉防火墙也无济于事 如何注册
    4贵论坛中findata文本数据是否有指数的分笔数据 或5分钟数据?
    谢谢
     
  8. zwz

    zwz

    谢谢!
    1)需要安装分析家。数据必须安装或导入分析家。
    2)目前工具不支持。可以自行修改源码解决。
    3)可能与IE设置(如JAVASCRIPT)有关? 近日未修改过注册页面,刚刚还有人注册成功。
    4)findata文本数据目前没有分笔数据或5钟数据。
     
  9. 谢谢
    我再试试
    希望能有深沪300 上证指数的分钟或分时文本数据,版主能帮个忙么?
    不好意思,我这个要求有点过了。谢谢

    还是不能登陆,估计是我装的Sun java的原因。
     
  10. zwz

    zwz

    www.fxj.net.cn或bbs.macd.cn等网站下载分钟或分时数据,然后转换可得。深沪300的代码有两个:000300(上证发布)和399300(深证发布),一个读不出来试一下另一个。

    网站没有用到任何JAVA东东。
     
  11. 感谢楼主提供的组件!

    现有个问题想向楼主请教:

    我用VS2005重新生成项目时有以下错误,调试无法通过,其原因何在。

    错误 1 无法注册程序集“$:\StockOpenSource\Fxj2xx\FinData\FinData\bin\Debug\FinData.dll”-- 访问被拒绝。对注册表项“HKEY_CLASSES_ROOT\FinData.FxjData”的访问被拒绝。 FinData
    错误 2 无法在证书存储区中找到清单签名证书。 FinDataTools
    警告 3 无法创建名为“FinData.tlb”的文件的注册信息 $:\StockOpenSource\Fxj2xx\FinData\Setup\Setup.vdproj FinDataSetup
    错误 4 未能找到文件“$:\StockOpenSource\Fxj2xx\FinData\FinData.Tools\obj\Debug\FinDataTools.exe” '系统找不到指定的文件。' $:\StockOpenSource\Fxj2xx\FinData\Setup\Setup.vdproj FinDataSetup
     
  12. zwz

    zwz

    未碰过这种情况。
    无法判断问题所在,SORRY。
     
  13. 试一下清理解决方案,然后重新生成.
     
  14. 感谢两位大侠的回复!
    Fisher大侠的HyltAdapter已编译通过!
    zwz大侠FinData0.7还没能通过编译!Fisher大侠的建议我也做了,编译还是没通过。打开项目就有一个“无法在证书存储区中找到清单签名证书。 FinDataTools ”的警告。
     
  15. zwz

    zwz

    试一下:用记事本打开项目的.csproj文件,删除类似以下几行后再编译

    <ManifestCertificateThumbprint>978D2D9CD6446E8E4472F377264FCFCD4FBB6DCC</ManifestCertificateThumbprint>
    <ManifestKeyFile>FxjDataReader_TemporaryKey.pfx</ManifestKeyFile>
    <GenerateManifests>true</GenerateManifests>
    <SignManifests>true</SignManifests>
     
  16. 谢谢了,楼主!
     
  17. zwz版主,打扰了,我用baidu搜索发现您曾经说过在原来的sasfans论坛里有可以读取大智慧level2逐单(不是分笔)的方法,由于sasfans上不去了,所以可否请您在这里告知一二?谢谢
     
  18. zwz

    zwz

    写过一个SAS程序,好象只能读出保存到本地的一小部分数据,没啥用处。
    Code:
    options nosource nonumber nodate nonotes nomprint nomlogic noxwait error=10;
    %macro DzhL2(filename);
    	%put %sysfunc(putn(%sysfunc(time()),time.)) 开始读取,请稍候...;
    	%if %sysfunc(fileexist(&filename))=0 %then
    		%do; %put 文件 &filename 不存在!;%return;%abort ABEND; %end;
    	filename DzhFile "&filename";
    	data bidask;
    		infile DzhFile recfm=n end=eof;
    		format code $12. dt datetime.;
    		input  @7 code $6. @5 market $2. @21 dt ib4.
    				@61 AvgBidPrice float4. @65 AllBidVol float4. @69 AllAskPrice float4. @73 AllAskVol float4.
    				@77 bidprice6 float4. @81 bidprice7 float4. @85 bidprice8 float4. @89 bidprice9 float4. @93 bidprice10 float4.
    				@97 bidvol6 float4. @101 bidvol7 float4. @105 bidvol8 float4. @109 bidvol9 float4. @113 bidvol10 float4.
    				@117 askprice6 float4. @121 askprice7 float4. @125 askprice8 float4. @129 askprice9 float4. @133 askprice10 float4.
    				@137 askvol6 float4. @141 askvol7 float4. @145 askvol8 float4. @149 askvol9 float4. @153 askvol10 float4.
    				@677 TickCount ib4. ;
    		array nvar{*} _numeric_;     
    		do j=1 to dim(nvar);
    			nvar{j}=round(nvar{j},0.001);
    		end;
    		code=trim(code)||"."||trim(market);
    		dt = dt + (DHMS(MDY(1,1,1970),0,0,0)-DHMS(MDY(1,1,1960),0,0,0) );
    		output;
    		drop market j;
    		stop;
    	run;
    	data ticks;
    		format dt datetime.;
    		attrib dt label='时间' price label='价格' vol label='成交股数' mm label='内外盘';
    		infile DzhFile recfm=n end=eof;
    		input @681 numTicks ib4.;
    		do i = 0 to numTicks-1 ;
    			p=685+i*20;
    			input @p dt ib4. @p+4 price float4. @p+8 vol ib4.;/*p+12,p+16 未知*/
    			dt = dt + (DHMS(MDY(1,1,1970),0,0,0)-DHMS(MDY(1,1,1960),0,0,0) );
    			price=round(price,0.001);
    			if vol>0 then do;mm='外盘';end;
    			else do;vol=abs(vol);mm='内盘';end;
    			output;
    		end;
    		keep dt price vol mm;
    		stop;
    	run;
    
    	filename dzhfile;
    	%put %sysfunc(putn(%sysfunc(time()),time.)) 读取结束,结果保存在Bidask,Ticks!;
    %mend;
    %DzhL2(D:\dzh2\data\sz\TEMP\000001.L2D);
    
    options source number date notes;
    
    
     
  19. 感谢版主,那么晚了还回帖,再次感谢。不过还有一个小小的不情之请,因为我不懂sas,看您的程序好像是读取本地文件,可否将格式告知?如有不便,可否加msn:bbbird886@hotmail.com谢谢