七天学会「股票数据分析软件」的开发(上)

前几天写了一篇介绍股票交易策略的图文「赚钱是刚需,如何正确的交易股票?」,引起一些关注者的兴趣,时不时在后台留言 “今天沪深300分位数” 到达什么位置了?授人与鱼不如授人与渔,所以我写了另外一篇图文「如何通过Matlab验证自己的交易策略」,开源了相应代码。众所周知 Matlab 是一个大部头软件,安装下来大概需要 3.6G 左右的硬盘空间,仅仅计算一下 沪深300历史交易数据 的分位数却要安装一套Matlab,得不偿失。怎么办呢?


掌握一种技能,相当于为自己增加一个竞争维度。遇到问题就是促成自己成长的机会。

想不想自己写代码来实现一下呢?

如果你愿意在接下来的七天暑假时间里暂时离开舒适区,来扩展自己的竞争维度。就跟我一起来开发一套「股票数据分析软件」吧。

我坚信:一件事情如果无法证明其是错误的,就要坚持去做,上天不会欺负“傻子”!这是技术人员的信仰!


好了,我们先规划一下,这套分析软件要满足的功能:

  • 数据的获取。从新浪财经把股票的数据爬取下来,存入数据库中。
  • 数据的分析。对数据库中的数据进行分析,并把计算结果更新到数据库中。
  • 数据的可视化。从数据库中读取分析的结果,并绘制蜡烛图、折线图、直方图等。

今天,我带着大家做「数据的获取」部分,主要内容为 数据的爬取 和 数据的存储。

首先,看看 沪深300(000300)历史交易数据 的URL地址。

http://vip.stock.finance.sina.com.cn/corp/go.php/vMS_MarketHistory/stockid/000300/type/S.phtml?year=2018&jidu=3

我们对比一下 上证指数(000001)历史交易数据 的URL地址。

http://vip.stock.finance.sina.com.cn/corp/go.php/vMS_MarketHistory/stockid/000001/type/S.phtml?year=2018&jidu=3

可以发现,/stockid/000300/stockid/000001中的数字部分是股票代码。参数year=2018jidu=3是数据的时间范围。

这样我们就可以写一个函数,把 股票代码 以及 年份季度 作为参数得到不同股票,不用年份和季度的历史交易数据。

private IHtmlDocument GetHtmlDocument(string stockid, int year, int jidu)
{
    string url = "http://vip.stock.finance.sina.com.cn/corp/go.php/vMS_MarketHistory/stockid/"
                    + stockid + "/type/S.phtml?year=" + year + "&jidu=" + jidu;
    IHtmlDocument document;
    try
    {
        document = new JumonyParser().LoadDocument(url);
    }
    catch
    {
        document = null;
    }
    return document;
}

沪深300历史交易数据的网页如下:

沪深300历史数据

我们可以看到,年份和季度都需要从下拉列表中选择。但不同股票可选择的年份不同,原因很简单,不同股票上市的时间不同,所以起始年份必然不同。这样,我们就需要写一个方法,先把年份下拉列表中的数据得到,从而得到爬取数据的时间范围。

private int[] GetYears(string stockid)
{
    DateTime dt = DateTime.Now;
    int year = dt.Year;
    IHtmlDocument doc = GetHtmlDocument(stockid, year, GetCurrentJiDu());
    List<IHtmlElement> lists = doc.Find("select[name=year] option").ToList();

    int count = lists.Count;
    List<int> years = new List<int>();

    for (int i = 0; i < count; i++)
    {
        int a = int.Parse(lists[i].InnerHtml());
        years.Add(a);
    }
    return years.ToArray();
}

private int GetCurrentJiDu()
{
    DateTime dt = DateTime.Now;
    int month = dt.Month;
    int jidu = 1;
    switch (month)
    {
        case 4:
        case 5:
        case 6:
            jidu = 2;
            break;
        case 7:
        case 8:
        case 9:
            jidu = 3;
            break;
        case 10:
        case 11:
        case 12:
            jidu = 4;
            break;
    }
    return jidu;
}

注明:我这里用的 HTML 解析器是 Jumony Core。可以到 https://github.com/Ivony/Jumony 下载。
这个解析器非常简单,给一个网址进去,就能够得到该网址请求的 DOM Tree,利用 JQuery 选择器语法,很方便地定位到要爬取的数据内容。

以上,数据的爬取就搞定了,下面介绍数据的存储。

为了避免数据的重复存储,除了建立 沪深300_000300 这张数据表来存储爬取的数据外,还需要建立一张数据表 Stock_InputLog 用来存储数据导入的日志。

Stock_InputLog 包含字段:

  • 股票代码
  • 年份
  • 季度
  • 开始日期
  • 结束日期
  • 备注

沪深300_000300 包含字段:

  • 日期
  • 年份
  • 季度
  • 开盘价
  • 最高价
  • 收盘价
  • 最低价
  • 平均价1 [=(开盘价+最高价+收盘价+最低价)/4]
  • 交易量
  • 交易金额
  • 平均价2 [=交易金额/交易量]
  • 分位数25
  • 分位数40
  • 分位数50
  • 分位数60
  • 分位数75
  • 当前分位数

数据爬取下来之后,进行导入的流程如下:

  1. 根据 Stock_InputLog 日志选出要导入的数据,即只导入仍未导入的数据。
  2. 把未导入的数据导入沪深300_000300表中。
  3. 更新 Stock_InputLog 日志。

我做了一个简单的 Demo 如下:

爬取:根据选定的年份和季度,从sina财经把沪深300的数据爬取下来。如下图所示:

爬取数据

保存入库:把未保存的数据保存到数据库中。

查看日志:查看保存数据的日志。如下图所示:

查看日志

查看数据:查看导入的数据是否完整。如下图所示:

查看数据

导出数据:把爬取的数据导出到EXCEL中。如下图所示:

导出数据

到这里,「数据的获取」部分就结束了。大家可以尝试着写写这块的代码,遇到问题给我留言,我给大家解答。下次,介绍分析部分。See You!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容

  • 美豹金融的美股大学--https://www.usmeibao.com/knowledge.html 一、基础篇 ...
    格式化_001阅读 2,543评论 1 5
  • 面,起源于中国。暖暖的太阳洒在了平原上,农民在金色的秋天中,收割着一季的小麦,在丰收的喜悦中把粒粒谷物磨成粉后,或...
    欧小欧字清照阅读 1,175评论 0 1
  • 文/Jamie焦 春节的一天,趁午后人少,我们三个好朋友选了一家火锅店聚餐,我挑了个特别有安全感的位置带她俩坐下来...
    Jamie焦阅读 355评论 0 2
  • 亲爱的孩子: 最近,你的生活规律都打乱了。黑白颠倒,凌晨三四点睡觉。吃饭无规律,饥一顿饱一顿。无节制的看手机,屏特...
    山东笑笑爸阅读 148评论 0 0
  • 时光会把我们这段相遇的日子慢慢推远,很高兴遇见你,让我的生命中多了一份迷人的色彩。 这是跟你们第一次见面的地方,也...
    晴天_efc0阅读 603评论 1 7