股票历史数据采集,附年历史数据和源代码mbffb的技术博客

原始需求:想分析某些股票的历史天交易数据里面满足某些条件的股票。

初步分析:需要股票的基础数据,如名称,编码,交易所等信息,然后就是每天的开票收盘的价格,涨幅等信息。

以为很简单,起始搞起来越滚越大,刚开始以为2个表就够了,没想到搞来搞去,有6个表了。

还好,我们有强大的XCode组件,数据库设计,开发都极其简单,总共零零散散也就10个小时不到就完工了。主要的时间不是写代码,其实60%的时间都是在找资料,分析接口和想怎么设计上面,以及跑数据,还好源数据都保存下来了,重写跑起来很快。

这次开工之前,心里也很忐忑,会不会很复杂,反正是自己想玩和想看,所以抱着试一试的心态,没想到比我想的要简单很多。

此处。。。。。。。。。。。。省略1万字,因为搜索和找了很多资源,最终用的是下面的接口,简单,实测速度快,18年的数据不到20分钟刷刷刷搞下来了。

里面包括了上证和深圳交易所的所有股票代码信息,只需要直接采集即可,速度很快。

如果要做实时,每天更新一次即可,注意:我开始也没注意,股票代码有很多含义,除了交易所之外,还有啥创业板,基金之类的,我没仔细研究,我只把我需要的类型进行了标记。 ​

股票基础数据结构比较简单:

编码(唯一),名称,交易所,类型1是要分析 ,0是暂时忽略的,上市日期

股票历史天数据刚开始想应该很大,找了一些结构才发现,基本每天的主要指标也就10个字段左右,计算一下,每只股票就算20年,也就6000条而已。

即使10000支股票,最多也就6000万而已,所以刚开始的时候直接全部撸到一个表里面了,实际上后面在分析的时候,极其不合理。分析的比较很复杂,搜索非常慢,所以后来我把历史数据进行了拆分,然后分析的时候多线程,速度瞬间提升10倍。由于XCode组件天生对分表分库和数据库反向工程的支持,所以开发起来非常快。

股票历史数据找了很多,最早用的是搜狐的一个接口:​​javascript:void(0)​​

它的格式很简单,拼接股票代码和起始结束日期即可,后来还发现它还能查询指数信息:

返回的json格式很标准,使用了Newlife组件的JsonParser类,轻松搞定。根据返回的数据信息,找了几支股票核对一下,就知道其意义了。在后面的数据库设计中会详细描述。说明:采集的时候我是先用临时表统一把返回的结果保存,防止程序有bug,下次又去请求,浪费人家的流量。也是保存在sqliet数据库。

在后面分析的时候,我还用到了板块信息,相当于给每支股票加一个类型,属于什么板块,这样分析的时候有针对性。板块有类型,然后每个类型下面又有一些股票代码,有2个表,数据来源也是搜狐的:

当然如果还要做复杂和完善一点,还有很多数据要采集,比如公司的一些基本信息,我暂时没有用到,后面我会把代码开源,大家随意折腾。

数据库设计我们采用XCode开发的设计规范,都用xml文件,可以自动生成实体类,后面有时间我会针对XCode写一篇开发实践的文章,再一次带大家温习了XCode,在这里感谢@大石头,10多年码农,X组件博大精深,极大的提高了开发效率,简单,简单,简单到你有时候怀疑人生。

10

11

12

13

14

​​<​​​​Table​​ ​​Name="StockBaseInfo" Description="股票基础信息" ConnName="stock_base">​​

​​<​​​​Columns​​​​>​​

​​<​​​​Column​​ ​​Name="Code" DataType="String" PrimaryKey="True" Description="股票编码" />​​

​​<​​​​Column​​ ​​Name="Name" DataType="String" Master="True" Description="名称" />​​

​​<​​​​Column​​ ​​Name="Exchange" DataType="String" Description="交易所" />​​

​​<​​​​Column​​ ​​Name="Kind" DataType="Int32" Description="类型。1是要分析股票,0是暂时不分析" />​​

​​<​​​​Column​​ ​​Name="StartDate" DataType="DateTime" Description="上市日期" />​​

​​<​​​​Column​​ ​​Name="CreateDate" DataType="DateTime" Description="创建时间" />​​

​​</​​​​Columns​​​​>​​

​​<​​​​Indexes​​​​>​​

​​<​​​​Index​​ ​​Columns="Name" />​​

​​<​​​​Index​​ ​​Columns="StartDate" />​​

​​</​​​​Indexes​​​​>​​

​​</​​​​Table​​​​>​​

其实在项目代码的xml文件表结构中,还有一个历史信息,就是一次性获取所有历史Josn文本存储,避免重复抓取Josn数据。结构很简单,就不贴了。

10

11

12

13

14

15

16

17

​​<​​​​Table​​ ​​Name="StockDayData" Description="股票日数据" ConnName="stock_day">​​

​​<​​​​Columns​​​​>​​

​​<​​​​Column​​ ​​Name="ID" DataType="String" PrimaryKey="True" Description="编号。code+日期" />​​

​​<​​​​Column​​ ​​Name="Code" DataType="String" Description="股票编码" />​​

​​<​​​​Column​​ ​​Name="StatDate" DataType="DateTime" Description="数据日期" />​​

​​<​​​​Column​​ ​​Name="StartPrice" DataType="Double" Description="开盘价格" />​​

​​<​​​​Column​​ ​​Name="EndPrice" DataType="Double" Description="收盘价格" />​​

​​<​​​​Column​​ ​​Name="ChangePrice" DataType="Double" Description="涨跌金额" />​​

​​<​​​​Column​​ ​​Name="ChangeRatio" DataType="Double" Description="涨跌幅度" />​​

​​<​​​​Column​​ ​​Name="LowPrice" DataType="Double" Description="最低价格" />​​

​​<​​​​Column​​ ​​Name="HighPrice" DataType="Double" Description="最高价格" />​​

​​<​​​​Column​​ ​​Name="TotalHand" DataType="Int32" Description="总手" />​​

​​<​​​​Column​​ ​​Name="TotalAmount" DataType="Double" Description="总金额(万)" />​​

​​<​​​​Column​​ ​​Name="HandRate" DataType="Double" Description="换手率" />​​

​​<​​​​Column​​ ​​Name="UpdateDate" DataType="DateTime" Description="更新日期" />​​

​​</​​​​Columns​​​​>​​

​​</​​​​Table​​​​>​​

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

​​<​​​​Table​​ ​​Name="GroupKind" Description="板块分类" ConnName="stock_base">​​

​​<​​​​Columns​​​​>​​

​​<​​​​Column​​ ​​Name="ID" DataType="String" PrimaryKey="True" Description="编码。url相关" />​​

​​<​​​​Column​​ ​​Name="Name" DataType="String" Master="True" Description="板块名称" />​​

​​<​​​​Column​​ ​​Name="Kind" DataType="String" Description="分类。1.行业,2地域,3.概念" />​​

​​<​​​​Column​​ ​​Name="Total" DataType="Int32" Description="总数" />​​

​​<​​​​Column​​ ​​Name="CreateDate" DataType="DateTime" Description="创建时间" />​​

​​</​​​​Columns​​​​>​​

​​<​​​​Indexes​​​​>​​

​​<​​​​Index​​ ​​Columns="Kind" />​​

​​<​​​​Index​​ ​​Columns="Name" />​​

​​</​​​​Indexes​​​​>​​

​​</​​​​Table​​​​>​​

​​<​​​​Table​​ ​​Name="StockGroup" Description="股票板块信息" ConnName="stock_base">​​

​​<​​​​Columns​​​​>​​

​​<​​​​Column​​ ​​Name="ID" DataType="String" PrimaryKey="True" Description="编号。groupid+stockid" />​​

​​<​​​​Column​​ ​​Name="GroupID" DataType="String" Description="板块ID" />​​

​​<​​​​Column​​ ​​Name="Kind" DataType="String" Description="分类。1.行业,2地域,3.概念" />​​

​​<​​​​Column​​ ​​Name="Code" DataType="String" Description="股票代码" />​​

​​<​​​​Column​​ ​​Name="StockName" DataType="String" Description="股票名称" />​​

​​<​​​​Column​​ ​​Name="CreateDate" DataType="DateTime" Description="创建时间" />​​

​​</​​​​Columns​​​​>​​

​​<​​​​Indexes​​​​>​​

​​<​​​​Index​​ ​​Columns="GroupID" />​​

​​<​​​​Index​​ ​​Columns="Code" />​​

​​</​​​​Indexes​​​​>​​

​​</​​​​Table​​​​>​​

下面我们把数据采集过程简单分析一下,然后把源代码和数据库共享给大家。套路很简单,熟悉起来很快就可以搞定。

我的博客中,前几年,写过好几篇关于C#数据采集的方法,套路都比较通用,主要是:HtmlAgilityPack + XCode

​​C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)​​

HtmlAgilityPack是.NET 下的一个强大的HTML 解析类库,支持用 XPath 。配合上自带的HAPExplorer,很快就可以解决问题。

我们发现上海和深圳交易所的列表分别在下面位置:

​​/html[1]/body[1]/div[9]/div[2]/div[1]/ul[1]​​

​​/html[1]/body[1]/div[9]/div[2]/div[1]/ul[2]​​

还往下一个层级就是li标签列表,在HtmlAgilityPack中有现成的方法获取整个列表,并进行解析,如下面代码:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

​​/// 获取所有股票代码和名称基础信息​​

​​public​​ ​​static​​ ​​void​​ ​​ReadAllStockBaseInfo()​​

​​{​​

​​//上海:/html[1]/body[1]/div[9]/div[2]/div[1]/ul[1]​​

​​//下级是li列表 ,Text值就是股票名称和代码  XXX()​​

​​//深圳:上海:/html[1]/body[1]/div[9]/div[2]/div[1]/ul[2]​​

​​HtmlWeb htmlweb = ​​​​new​​ ​​HtmlWeb();​​

​​Dictionary<​​​​string​​​​, ​​​​string​​​​> dic = ​​​​new​​ ​​Dictionary<​​​​string​​​​, ​​​​string​​​​>()​​

​​{​​

​​{​​​​"上海"​​​​,​​​​@"/html[1]/body[1]/div[9]/div[2]/div[1]/ul[1]"​​ ​​},​​

​​{​​​​"深圳"​​​​,​​​​@"/html[1]/body[1]/div[9]/div[2]/div[1]/ul[2]"​​ ​​}​​

​​};​​

​​#region 获取​​

​​Dictionary<String, StockBaseInfo> list = ​​​​new​​ ​​Dictionary<​​​​string​​​​, StockBaseInfo>();​​

​​foreach​​ ​​(​​​​var​​ ​​item ​​​​in​​ ​​dic)​​

​​{​​

​​//获取所有子节点​​

​​{​​

​​foreach​​ ​​(​​​​var​​ ​​node ​​​​in​​ ​​res)​​

​​{​​

​​//获取名称和代码​​

​​StockBaseInfo et = ​​​​new​​ ​​StockBaseInfo()​​

​​{​​

​​Code = str[1],​​

​​Name = str[0],​​

​​StartDate = ​​​​new​​ ​​DateTime(2000, 1, 1),​​

​​};​​

​​{​​

​​}​​

​​}​​

​​}​​

​​}​​

​​#endregion​​

​​}​​

获取到子节点后,解析名称,然后用批量Insert到数据库。

用XCode默认都是使用Sqlite数据库,轻量级,非常方便,数据库表结构都是自动新建。

这里对老司机来说,其实没多少难度,就是拼接URL,请求获取json数据,然后解析json格式,我解析用了Newlife的JsonParser,用起来很简单有空我单独讲一下,就是把Json用字典和List<Object>保存下来,知道结构后,直接强制转换和取值即可。上代码:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

​​public​​ ​​static​​ ​​void​​ ​​GetHistoryFromWeb(​​​​string​​ ​​stockCode, DateTime start, DateTime end,​​​​string​​ ​​type=​​​​"cn"​​​​)​​

​​{​​

​​WebClientX client = ​​​​new​​ ​​WebClientX();​​

​​var​​ ​​doc = ​​​​new​​ ​​HtmlDocument();​​

​​var​​ ​​et = ​​​​new​​ ​​StockHisText()​​

​​{​​

​​Code = stockCode,​​

​​Start = start,​​

​​End = end,​​

​​HisText = value​​

​​};​​

​​try​​

​​{​​

​​}​​

​​catch​​​​(Exception err)​​

​​{​​

​​}​​

​​}​​

上面是获取单个股票其指定日期范围内的历史数据,直接到历史表,下面是解析部分,外面套的循环就不贴代码了,可以下载源代码看。

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

​​public​​ ​​static​​ ​​void​​ ​​PraseHistoryData()​​

​​{​​

​​var​​ ​​all = FindAll();​​

​​int​​ ​​index = 1;​​

​​{​​

​​#region 单个文本解析​​

​​JsonParser jp = ​​​​new​​ ​​JsonParser(all[i].HisText);​​

​​var​​ ​​main = (Dictionary<​​​​string​​​​, ​​​​object​​​​>)decode[0];​​​​//字典​​

​​{​​

​​var​​ ​​obj = (List<​​​​object​​​​>)main[​​​​"hq"​​​​];​​

​​{​​

​​List<StockDayData> res = ​​​​new​​ ​​List<StockDayData>();​​

​​foreach​​ ​​(​​​​var​​ ​​item ​​​​in​​ ​​obj)​​

​​{​​

​​#region 单条记录解析​​

​​//item是一个10个元素的数组​​

​​//日期,今开价格,今天收盘价格,涨跌金额,涨跌幅度,最低价格,最高价格,总手,总金额(万),换手率​​

​​var​​ ​​list = (List<​​​​object​​​​>)item;​​

​​StockDayData sd = ​​​​new​​ ​​StockDayData()​​

​​{​​

​​Code = all[i].Code,​​

​​StatDate = list[0].ToDateTime(),​​

​​StartPrice = list[1].ToDouble(),​​

​​EndPrice = list[2].ToDouble(),​​

​​ChangePrice = list[3].ToDouble(),​​

​​ChangeRatio = ((​​​​string​​​​)list[4]).Replace(​​​​"%"​​​​, ​​​​""​​​​).ToDouble(),​​

​​LowPrice = list[5].ToDouble(),​​

​​HighPrice = list[6].ToDouble(),​​

​​TotalHand = list[7].ToInt(),​​

​​TotalAmount = list[8].ToDouble(),​​

​​HandRate = ((​​​​string​​​​)list[9]).Replace(​​​​"%"​​​​, ​​​​""​​​​).ToDouble(),​​

​​};​​

​​#endregion​​

​​}​​

​​}​​

​​}​​

​​#endregion​​

​​});​​

​​}​​

原始需求:想分析某些股票的历史天交易数据里面满足某些条件的股票。

初步分析:需要股票的基础数据,如名称,编码,交易所等信息,然后就是每天的开票收盘的价格,涨幅等信息。

以为很简单,起始搞起来越滚越大,刚开始以为2个表就够了,没想到搞来搞去,有6个表了。

还好,我们有强大的XCode组件,数据库设计,开发都极其简单,总共零零散散也就10个小时不到就完工了。主要的时间不是写代码,其实60%的时间都是在找资料,分析接口和想怎么设计上面,以及跑数据,还好源数据都保存下来了,重写跑起来很快。

这次开工之前,心里也很忐忑,会不会很复杂,反正是自己想玩和想看,所以抱着试一试的心态,没想到比我想的要简单很多。

此处。。。。。。。。。。。。省略1万字,因为搜索和找了很多资源,最终用的是下面的接口,简单,实测速度快,18年的数据不到20分钟刷刷刷搞下来了。

里面包括了上证和深圳交易所的所有股票代码信息,只需要直接采集即可,速度很快。

股票基础数据结构比较简单:

编码(唯一),名称,交易所,类型1是要分析 ,0是暂时忽略的,上市日期

股票历史天数据刚开始想应该很大,找了一些结构才发现,基本每天的主要指标也就10个字段左右,计算一下,每只股票就算20年,也就6000条而已。

即使10000支股票,最多也就6000万而已,所以刚开始的时候直接全部撸到一个表里面了,实际上后面在分析的时候,极其不合理。分析的比较很复杂,搜索非常慢,所以后来我把历史数据进行了拆分,然后分析的时候多线程,速度瞬间提升10倍。由于XCode组件天生对分表分库和数据库反向工程的支持,所以开发起来非常快。

它的格式很简单,拼接股票代码和起始结束日期即可,后来还发现它还能查询指数信息:

返回的json格式很标准,使用了Newlife组件的JsonParser类,轻松搞定。根据返回的数据信息,找了几支股票核对一下,就知道其意义了。在后面的数据库设计中会详细描述。说明:采集的时候我是先用临时表统一把返回的结果保存,防止程序有bug,下次又去请求,浪费人家的流量。也是保存在sqliet数据库。

在后面分析的时候,我还用到了板块信息,相当于给每支股票加一个类型,属于什么板块,这样分析的时候有针对性。板块有类型,然后每个类型下面又有一些股票代码,有2个表,数据来源也是搜狐的:

当然如果还要做复杂和完善一点,还有很多数据要采集,比如公司的一些基本信息,我暂时没有用到,后面我会把代码开源,大家随意折腾。

数据库设计我们采用XCode开发的设计规范,都用xml文件,可以自动生成实体类,后面有时间我会针对XCode写一篇开发实践的文章,再一次带大家温习了XCode,在这里感谢@大石头,10多年码农,X组件博大精深,极大的提高了开发效率,简单,简单,简单到你有时候怀疑人生。

10

11

12

13

14

​​<​​​​Table​​ ​​Name="StockBaseInfo" Description="股票基础信息" ConnName="stock_base">​​

​​<​​​​Columns​​​​>​​

​​<​​​​Column​​ ​​Name="Code" DataType="String" PrimaryKey="True" Description="股票编码" />​​

​​<​​​​Column​​ ​​Name="Name" DataType="String" Master="True" Description="名称" />​​

​​<​​​​Column​​ ​​Name="Exchange" DataType="String" Description="交易所" />​​

​​<​​​​Column​​ ​​Name="Kind" DataType="Int32" Description="类型。1是要分析股票,0是暂时不分析" />​​

​​<​​​​Column​​ ​​Name="StartDate" DataType="DateTime" Description="上市日期" />​​

​​<​​​​Column​​ ​​Name="CreateDate" DataType="DateTime" Description="创建时间" />​​

​​</​​​​Columns​​​​>​​

​​<​​​​Indexes​​​​>​​

​​<​​​​Index​​ ​​Columns="Name" />​​

​​<​​​​Index​​ ​​Columns="StartDate" />​​

​​</​​​​Indexes​​​​>​​

​​</​​​​Table​​​​>​​

其实在项目代码的xml文件表结构中,还有一个历史信息,就是一次性获取所有历史Josn文本存储,避免重复抓取Josn数据。结构很简单,就不贴了。

10

11

12

13

14

15

16

17

​​<​​​​Table​​ ​​Name="StockDayData" Description="股票日数据" ConnName="stock_day">​​

​​<​​​​Columns​​​​>​​

​​<​​​​Column​​ ​​Name="ID" DataType="String" PrimaryKey="True" Description="编号。code+日期" />​​

​​<​​​​Column​​ ​​Name="Code" DataType="String" Description="股票编码" />​​

​​<​​​​Column​​ ​​Name="StatDate" DataType="DateTime" Description="数据日期" />​​

​​<​​​​Column​​ ​​Name="StartPrice" DataType="Double" Description="开盘价格" />​​

​​<​​​​Column​​ ​​Name="EndPrice" DataType="Double" Description="收盘价格" />​​

​​<​​​​Column​​ ​​Name="ChangePrice" DataType="Double" Description="涨跌金额" />​​

​​<​​​​Column​​ ​​Name="ChangeRatio" DataType="Double" Description="涨跌幅度" />​​

​​<​​​​Column​​ ​​Name="LowPrice" DataType="Double" Description="最低价格" />​​

​​<​​​​Column​​ ​​Name="HighPrice" DataType="Double" Description="最高价格" />​​

​​<​​​​Column​​ ​​Name="TotalHand" DataType="Int32" Description="总手" />​​

​​<​​​​Column​​ ​​Name="TotalAmount" DataType="Double" Description="总金额(万)" />​​

​​<​​​​Column​​ ​​Name="HandRate" DataType="Double" Description="换手率" />​​

​​<​​​​Column​​ ​​Name="UpdateDate" DataType="DateTime" Description="更新日期" />​​

​​</​​​​Columns​​​​>​​

​​</​​​​Table​​​​>​​

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

​​<​​​​Table​​ ​​Name="GroupKind" Description="板块分类" ConnName="stock_base">​​

​​<​​​​Columns​​​​>​​

​​<​​​​Column​​ ​​Name="ID" DataType="String" PrimaryKey="True" Description="编码。url相关" />​​

​​<​​​​Column​​ ​​Name="Name" DataType="String" Master="True" Description="板块名称" />​​

​​<​​​​Column​​ ​​Name="Kind" DataType="String" Description="分类。1.行业,2地域,3.概念" />​​

​​<​​​​Column​​ ​​Name="Total" DataType="Int32" Description="总数" />​​

​​<​​​​Column​​ ​​Name="CreateDate" DataType="DateTime" Description="创建时间" />​​

​​</​​​​Columns​​​​>​​

​​<​​​​Indexes​​​​>​​

​​<​​​​Index​​ ​​Columns="Kind" />​​

​​<​​​​Index​​ ​​Columns="Name" />​​

​​</​​​​Indexes​​​​>​​

​​</​​​​Table​​​​>​​

​​<​​​​Table​​ ​​Name="StockGroup" Description="股票板块信息" ConnName="stock_base">​​

​​<​​​​Columns​​​​>​​

​​<​​​​Column​​ ​​Name="ID" DataType="String" PrimaryKey="True" Description="编号。groupid+stockid" />​​

​​<​​​​Column​​ ​​Name="GroupID" DataType="String" Description="板块ID" />​​

​​<​​​​Column​​ ​​Name="Kind" DataType="String" Description="分类。1.行业,2地域,3.概念" />​​

​​<​​​​Column​​ ​​Name="Code" DataType="String" Description="股票代码" />​​

​​<​​​​Column​​ ​​Name="StockName" DataType="String" Description="股票名称" />​​

​​<​​​​Column​​ ​​Name="CreateDate" DataType="DateTime" Description="创建时间" />​​

​​</​​​​Columns​​​​>​​

​​<​​​​Indexes​​​​>​​

​​<​​​​Index​​ ​​Columns="GroupID" />​​

​​<​​​​Index​​ ​​Columns="Code" />​​

​​</​​​​Indexes​​​​>​​

​​</​​​​Table​​​​>​​

下面我们把数据采集过程简单分析一下,然后把源代码和数据库共享给大家。套路很简单,熟悉起来很快就可以搞定。

我的博客中,前几年,写过好几篇关于C#数据采集的方法,套路都比较通用,主要是:HtmlAgilityPack + XCode

​​C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)​​

HtmlAgilityPack是.NET 下的一个强大的HTML 解析类库,支持用 XPath 。配合上自带的HAPExplorer,很快就可以解决问题。

我们发现上海和深圳交易所的列表分别在下面位置:

​​/html[1]/body[1]/div[9]/div[2]/div[1]/ul[1]​​

​​/html[1]/body[1]/div[9]/div[2]/div[1]/ul[2]​​

还往下一个层级就是li标签列表,在HtmlAgilityPack中有现成的方法获取整个列表,并进行解析,如下面代码:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

​​/// 获取所有股票代码和名称基础信息​​

​​public​​ ​​static​​ ​​void​​ ​​ReadAllStockBaseInfo()​​

​​{​​

​​//上海:/html[1]/body[1]/div[9]/div[2]/div[1]/ul[1]​​

​​//下级是li列表 ,Text值就是股票名称和代码  XXX()​​

​​//深圳:上海:/html[1]/body[1]/div[9]/div[2]/div[1]/ul[2]​​

​​HtmlWeb htmlweb = ​​​​new​​ ​​HtmlWeb();​​

​​Dictionary<​​​​string​​​​, ​​​​string​​​​> dic = ​​​​new​​ ​​Dictionary<​​​​string​​​​, ​​​​string​​​​>()​​

​​{​​

​​{​​​​"上海"​​​​,​​​​@"/html[1]/body[1]/div[9]/div[2]/div[1]/ul[1]"​​ ​​},​​

​​{​​​​"深圳"​​​​,​​​​@"/html[1]/body[1]/div[9]/div[2]/div[1]/ul[2]"​​ ​​}​​

​​};​​

​​#region 获取​​

​​Dictionary<String, StockBaseInfo> list = ​​​​new​​ ​​Dictionary<​​​​string​​​​, StockBaseInfo>();​​

​​foreach​​ ​​(​​​​var​​ ​​item ​​​​in​​ ​​dic)​​

​​{​​

​​//获取所有子节点​​

​​{​​

​​foreach​​ ​​(​​​​var​​ ​​node ​​​​in​​ ​​res)​​

​​{​​

​​//获取名称和代码​​

​​StockBaseInfo et = ​​​​new​​ ​​StockBaseInfo()​​

​​{​​

​​Code = str[1],​​

​​Name = str[0],​​

​​StartDate = ​​​​new​​ ​​DateTime(2000, 1, 1),​​

​​};​​

​​{​​

​​}​​

​​}​​

​​}​​

​​}​​

​​#endregion​​

​​}​​

获取到子节点后,解析名称,然后用批量Insert到数据库。

用XCode默认都是使用Sqlite数据库,轻量级,非常方便,数据库表结构都是自动新建。

这里对老司机来说,其实没多少难度,就是拼接URL,请求获取json数据,然后解析json格式,我解析用了Newlife的JsonParser,用起来很简单有空我单独讲一下,就是把Json用字典和List<Object>保存下来,知道结构后,直接强制转换和取值即可。上代码:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

​​public​​ ​​static​​ ​​void​​ ​​GetHistoryFromWeb(​​​​string​​ ​​stockCode, DateTime start, DateTime end,​​​​string​​ ​​type=​​​​"cn"​​​​)​​

​​{​​

​​WebClientX client = ​​​​new​​ ​​WebClientX();​​

​​var​​ ​​doc = ​​​​new​​ ​​HtmlDocument();​​

​​var​​ ​​et = ​​​​new​​ ​​StockHisText()​​

​​{​​

​​Code = stockCode,​​

​​Start = start,​​

​​End = end,​​

​​HisText = value​​

​​};​​

​​try​​

​​{​​

​​}​​

​​catch​​​​(Exception err)​​

​​{​​

​​}​​

​​}​​

上面是获取单个股票其指定日期范围内的历史数据,直接到历史表,下面是解析部分,外面套的循环就不贴代码了,可以下载源代码看。

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

​​public​​ ​​static​​ ​​void​​ ​​PraseHistoryData()​​

​​{​​

​​var​​ ​​all = FindAll();​​

​​int​​ ​​index = 1;​​

​​{​​

​​#region 单个文本解析​​

​​JsonParser jp = ​​​​new​​ ​​JsonParser(all[i].HisText);​​

​​var​​ ​​main = (Dictionary<​​​​string​​​​, ​​​​object​​​​>)decode[0];​​​​//字典​​

​​{​​

​​var​​ ​​obj = (List<​​​​object​​​​>)main[​​​​"hq"​​​​];​​

​​{​​

​​List<StockDayData> res = ​​​​new​​ ​​List<StockDayData>();​​

​​foreach​​ ​​(​​​​var​​ ​​item ​​​​in​​ ​​obj)​​

​​{​​

​​#region 单条记录解析​​

​​//item是一个10个元素的数组​​

​​//日期,今开价格,今天收盘价格,涨跌金额,涨跌幅度,最低价格,最高价格,总手,总金额(万),换手率​​

​​var​​ ​​list = (List<​​​​object​​​​>)item;​​

​​StockDayData sd = ​​​​new​​ ​​StockDayData()​​

​​{​​

​​Code = all[i].Code,​​

​​StatDate = list[0].ToDateTime(),​​

​​StartPrice = list[1].ToDouble(),​​

​​EndPrice = list[2].ToDouble(),​​

​​ChangePrice = list[3].ToDouble(),​​

​​ChangeRatio = ((​​​​string​​​​)list[4]).Replace(​​​​"%"​​​​, ​​​​""​​​​).ToDouble(),​​

​​LowPrice = list[5].ToDouble(),​​

​​HighPrice = list[6].ToDouble(),​​

​​TotalHand = list[7].ToInt(),​​

​​TotalAmount = list[8].ToDouble(),​​

​​HandRate = ((​​​​string​​​​)list[9]).Replace(​​​​"%"​​​​, ​​​​""​​​​).ToDouble(),​​

​​};​​

​​#endregion​​

​​}​​

​​}​​

​​}​​

​​#endregion​​

​​});​​

​​}​​

在Python中,根据历史数据进行预测通常会用到统计分析和机器学习的方法。这里我给你一个简单的例子,展示如何使用Python中的时间序列预测方法来根据历史数据进行预测。我们将使用statsmodels库来进行时间序列分析,使用ARIMA模型(自回归积分滑动平均模型)进行预测。首先,你需要安装statsmodels和pandas库,如果你还没有安装,可以使用以下命令:pip install sta

作为​​Python​​开发者,我们经常遇到需要从各种来源和格式(如 PDF、CSV、HTML等)中提取数据的情况。在这篇文章中,我们将深入研究从PDF文件中解析数据,并介绍一些对解析其他数据格式有用的 Python 包。用Python解析PDF文件PDF是一种标准文件格式,广泛用于共享和打印文件。不幸的是,由于其复杂的结构,当涉及到数据提取时,它并不是最容易的格式。幸运的是,Python提供了几个库,可以帮助我们从PDF文件中提取数据,比如PyPDF2和PDFMiner。

一、引子在05篇中我们学习了如何使用流程变量,如果业务需求为固定的内容,其实流程变量就可以当“表单”使用的,K-V的结构几乎天然支持了这部分。但是,如果你的业务需求需要用户灵活定制流程变量,这里用文字说明可能有的同学不太理解,具体案例大家可以去参考钉钉的工作流,用户可以在每个节点自己定义和管理变量,这种场景流程变量就无法很好地支持了,就需要用到Flowable提供的表单来操作了。上述的内容

# Hadoop 历史数据采集:从理论到实践## 引言随着大数据时代的到来,数据采集和处理成为了企业和开发者关注的焦点。Hadoop作为大数据处理的基石,其历史数据采集功能尤为重要。本文将从理论到实践,探讨如何利用Hadoop进行历史数据采集,并提供代码示例和状态图、旅行图来帮助读者更好地理解。## Hadoop 简介Hadoop是一个开源的分布式存储和计算框架,由Hadoop分布

# MySQL 中的历史数据管理在现代数据库系统中,历史数据的管理是一个不可或缺的部分。历史数据是指不再经常改变的数据,但对于业务分析和决策制定依然具有重要价值。MySQL 作为流行的关系数据库管理系统,提供了一些工具和功能来有效管理和查询历史数据。## 什么是历史数据?历史数据是系统在特定时间点的状态快照。这些数据可用于各种用途,如审计、趋势分析和报告生成。在许多行业,如金融、电商和

各种股票软件,例如通达信、同花顺、大智慧,都可以实时查看股票价格和走势,做一些简单的选股和定量分析,但是如果你想做更复杂的分析,例如回归分析、关联分析等就有点捉襟见肘,所以最好能够获取股票历史及实时数据并存储到数据库,然后再通过其他工具,例如SPSS、SAS、EXCEL或者其他高级编程语言连接数据库获取股票数据进行定量分析,

# Python爬取所有股票历史数据在金融行业,股票历史数据对于分析和预测市场趋势至关重要。借助Python,我们可以轻松爬取所有股票的历史数据。接下来,我将通过一个详细的示例,指导您如何使用Python来实现这一目标。## 环境准备在开始之前,确保您已经安装了以下库:```bashpip install requests pandas beautifulsoup4```-

清理脚本#!/bin/bashDate=`date -d $(date -d "-30 day" +%Y%m%d) +%s`/usr/local/mysql/bin/mysql --login-path=zabbix -e"use zabbix;DELETE FROM h

项目上线不到一个月,zabbix数据居然快100G,监控项太多,数据量太大,zabbix负载重,暂时不想升级硬件,只好内部挖掘下,清除下历史数据;一般保留1个月的数据,zabbix这个项目只是做监控报警用,数据保留太多没太大参考意义;    一般都是这几个表太大, history, history_uint,history_log

获取openfalcon历史数据

# MongoDB历史数据转存在实际应用中,我们经常需要对MongoDB中的历史数据进行转存或者备份,以便后续的数据分析、报表生成或者数据迁移等操作。本文将介绍如何使用Python和MongoDB的客户端工具来实现MongoDB历史数据的转存操作。## MongoDB历史数据转存的场景在实际应用中,我们可能会遇到以下场景需要对MongoDB历史数据进行转存:1. 数据备份:定期将M

# 使用 MongoDB 存储历史数据的指南在现代应用开发中,存储历史数据是一个常见需求。在这篇文章中,我将告诉你如何使用 MongoDB 来存储历史数据。接下来,我们将通过一系列步骤帮助你理解整个过程。## 流程概述我们将按照以下步骤来存储历史数据:| 步骤 | 描述 ||------|------

一 应用场景描述前面介绍了两种处理Zabbix历史数据的解决办法,但是如果当监控数据继续增长的话是不足以解决问题的。办法一适合在没有做表分区的情况下,只保留一段时间的数据,比如一个月,然后把老的数据删除再使用方法二,这种操作执行时间长。办法二是使用MySQL自带的表分区功能,将history等表按照日期进行分区,然后只保留一段时间的数据。但是即使使用表分区功能定期删除不用的分区数据,也会有瓶颈产生

由于量化策略研究需要用到尽量全的历史数据,包括:股票、外汇、期货、基金等等的分钟、小时、日历史数据,而且数据尽量全,最好能从九几年起。所以我在网上做了较多的搜查以找到可用的数据源。以下分别列出几个方案,并讨论其优缺,最后总结出一条可行的路。 Tushare 数据接口:该接口基本是使用新浪的数据源做一个python的封装。而且目前只针对股票,能获取到日线数据较为完整。分钟线和小时

在实际业务中,累计5年的历史业务数据可能比较大,比如可能超过1T的数据,这时可能就会影响业务处理 OLTP的运行效率,一般是将5年以上的数据归档的其他地方,同时从当前业务系统中删除。 有各位哥们对这个过程比较熟悉,ORACLE ERP时什么策略呢? 请高手指点。 DBX archiver的功能就是把历史数据放在另一个数据库中,如果在prod中的查询涉及到历史数据,就会到历史库中取数据,实现对客户的

读取ExecuteReader 写入SqlBulkCopy 创建归档临时表和非归档临时表 读取源表,按归档日期分别写入归档临时表和非归档临时表,记录首条数据 读取源表(写入期间入库的数据),写入非归档临时表 非归档临时表创建索引、分区 非归档临时表改为源表 Drop源表 读取归档临时表写入指定服务器 ...

zabbix监控中在对创建项目时,需要设置两个属性:Historyandtrends(历史数据和趋势数据的保存时间,以天数为单位)如下图所示:历史数据和趋势数据是zabbix存储数据的两种方式,它们都是以天数为单位的。历史数据:zabbix监控到的数据在数据库中保存的天数,过去这个时间便会自动的被zabbix的管理机制删除,所以强烈建议历史数据保存所允许的尽可能小的天数,这样是为了防止数据库负载太

THE END
0.13国语言综合交易所股票源码13国语言综合交易所股票源码/美股印度股源码/前端uniapp纯源码+后端Java纯源码 前端h5+pc+后端admin页面都是uniapp纯源码,后端api是java语言,开源的,自带的简单搭建教程 语种倒是很多,看样子应该是去年那套修复后的版本,不过我在本地跑的时候,没有搭建后端api,用的源码里面自带的api,所以算不上是测试,就只是想看jvzquC41yy}/|n{wp4dqv464;890qyon
1.自学python一个简单的股票工具,源代码分享[通俗易懂]项目名称:股票工具 想要的功能: 1 获取数据 实时某支股票的 ‘买一量’ ‘卖一量’ #获取数据 2 数据分析 对’买一量’ ‘卖一量’的判断 进入时候提醒 2.1 买一量,大于、小于 多少时,提示买入卖出 2.2 卖一量,大于、小于 多少时,提示买入卖出 2.3 涨幅计算 行动效果图: 后面是源代码: 代码语言:javajvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk0498;897
2.富汇交易所V3.0版源码区块链证券股票期货交易所虚拟交易代理简介: 富汇交易所V3.0版源码区块链证券股票 期货交易所虚拟交易代理系统源码 富汇交易所V3.0版源码/区块链 证券股票/期货交易所/虚拟交易/代理系统源码下载 前端均为VUE为编译源码,需要的拿 图片: 源码 下载资源jvzquC41yy}/zrfocygoi7hqo1=::B81
3.富汇区块链证券股票交易所源码指数科创期货交易所+虚拟交易+另外有独立代理推广后台,这玩意市面上基本没流出来过,只要有客户,随便几万还是很轻松卖的,懂的人自然懂 170724.html" data-original-title="点击复制链接">--> 区块链源码下载 9.9币 普通用户购买价格 :9.9币 VIP会员购买价格 :1.98币 终身VIP购买价格 :免费 jvzquC41yy}/j~icpygoi7hqo1>92@61
4.股票基金模拟盘源码,两融配资股票交易交易所系统源码简介:股票基金模拟盘源码,两融配资股票交易交易所系统源码测试环境 php7.2+mysql5.6修改数据库配置文件\config\database.php设置public 运行目录设置 thinkphp 伪静态 图片:jvzquC41yy}/ftjyn0ipo8hqfg5eg}fkn47467mvon
5.股票交易接口源码哪里可以获取?获取时需要注意哪些法律风险在很多正规的股票交易平台或者金融机构,它们可能会提供部分交易接口的源码示例。这些官方渠道提供的源码通常是符合相关规定且较为安全可靠的。比如一些大型的证券交易所,为了方便开发者进行一些合规的二次开发,可能会放出有限的接口源码。这种源码往往经过了严格的测试和审核,有助于保证交易的稳定性和安全性。 jvzquC41dnuh0lxfp0tfv8xqjqwr1jwvkerf1mjvckrt1:9933:8:<
6.Java综合交易所源码下载|13国语言支持股票区块链外汇+永续合约C2C这款运营级Java交易所源码集成13国语言国际化支持,原生适配股票、区块链、外汇三大金融交易品类,采用PC端与H5移动端一体化架构设计,用户无需重复开发即可实现全终端覆盖。系统自带嵌入式客服系统,虽采用经典架构但功能完备,支持实时在线咨询与工单跟踪,显著提升用户交易体验。核心金融模块包含C2C场外交易、理财产品发售、资jvzquC41yy}/gƒ;80et06?<470nuou
7.股票基金模拟盘源码/两融配资股票交易交易所系统源码股票基金模拟盘源码,两融配资股票交易交易所系统源码 测试环境 php7.2+mysql5.6 修改数据库配置文件configdatabase.php 设置public 运行目录 设置thinkphp 伪静态 文件下载: 您需要登录/注册后才能查看相关资源 》许可协议授权。 版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处jvzquC41yy}/e~cz0ipo8Drquz>3<<2
8.技术接口|上海证券交易所2025-10-24IS120_上海证券交易所行情网关STEP数据接口规范0.59版_20251017 2025-10-24IS120_上海证券交易所行情网关BINARY数据接口规范0.59版_20251017 2025-10-24IS118_上海证券交易所特定参与者接口规格说明书(基金公司卷)2.2版_20251017 2025-10-24IS105_上海证券交易所综合业务平台市场参与者接口规格说明书1.57版jvzquC41yy}/u|j0eqs/ew4ugt|jenx1vtgekwlvgen0fjyc1
9.综合交易所开源版/外汇/虚拟币/股票/黄金/期权秒合约/杠杆合约/多综合交易所开源版/外汇/虚拟币/股票/黄金/期权秒合约/杠杆合约/多语言 贷款服务/理财产品/AI量化交易/IEO/新币发行 质押理财等 和之前那个版本功能一样jvzquC41yy}/ut5540ipo8:577
10.运营版交易所/富汇交易所源码/区块链证券两融/股票/指数/配资交易未测试需要的拿,别人发的运营、接单的版本,好友还在用这个正常的接单,四语言,K线什么的 全部正常 1.带web、wap端;均有高端k线和委托档位 2.币币交易推荐单和委托单,方便快速成交。 3.usdt支付完美运营版+完整数据+K线正常+4种语言jvzquC41yy}/so~c0eun1=>990nuou
11.逃顶命令技术指标源码博客中国财经门户网站东方财富网(blog.eastmoney.com)博客频道——东方财富博客,拥有实时的推荐评论股市的博文,最具人气的财经博客排行榜,还有最热门财经名人博主人气榜。东方财富博客万博园中名人博主为您指点股市,评述财经新闻。jvzquC41dnuh0nfuvouog‚3eqo5n69:92;:54;<;77771kqqia;92B9599=/j}rn
12.运营版交易所/富汇交易所源码/区块链证券两融/股票/指数/配资交易运营版交易所/富汇交易所源码/区块链证券两融/股票/指数/配资交易所|虚拟交易+多语言 未测试需要的拿,别人发的运营、接单的版本,好友还在用这个正常的接单,四语言,K线什么的 全部正常 1.带web、wap端;均有高端k线和委托档位 2.币币交易推荐单和委托单,方便快速成交。 jvzquC41yy}/|qjpilobzr3eqo5kr‚r1dln1B:;5:4ivvq
13.【商业/互换】富汇交易所源码/区块链证券两融/股票/期货/指数/【商业/互换】富汇交易所源码/区块链证券两融/股票/期货/指数/配资交易所|虚拟交易|合约币行情交易+代理系统 题外话,我实在是气不过一些人整天装13,然后还要说一堆。我真的是很少很少封号的。 从现在开始,只要被我系统自动封号的别来找我,系统能封你,自然你干了不该干的事。jvzquC41yy}/|qjpilobzr3eqo5kr‚r1dln1A58984ivvq
14.股票交易系统股票交易系统 基于Java的安卓在线炒股 App 完整源码框架,包含核心功能模块。这个框架提供了一个基础结构,你可以根据实际需求进行扩展和完善。 --- ## 安卓在线炒股App完整源码框架 ### 1. 项目结构 ``` StockTradingApp/ ├── app/ │├── src/jvzquC41dnuh0lxfp0tfv8mcpanbphiqwajpw8ftvkimg8igvcomu86768775<6