NumPy学习笔记 二

《NumPy学习笔记》系列将记录学习NumPy过程中的动手笔记,前期的参考书是《Python数据分析基础教程 NumPy学习指南》第二版、《数学分析》第四版(华东师范大学数学系)、《概率论与数理统计》(陈希孺,中科大出版)、《概率论与数理统计》第二版(茆诗松、程依明等编)、《组合最优化:理论与方法》(现代数学译丛23)。笔记二主要记录数据获取,沪深证券市场的A股股票数据。

获取的股票数据周期包括5分钟、15分钟、30分钟、60分钟、日、周、月、45日、季度、年;股票数据内容包括日期时间、开盘价、最高价、最低价、收盘价、成交量、成交金额。

获取数据的途径有很多种,上交所、深交所、各大财经网站上均有数据,利用爬虫技术基本均可信手拈来;还有一些公开的财经API可以利用;再者就是编写证券行情软件的插件来获取。本随笔就主要讲述用C++语言开发选股插件来转储数据,证券行情软件采用通达信软件,该种方式稳定可靠、数据精确。

通达信的官方网站提供了免费行情软件的下载(http://www.tdx.com.cn/page_83.html)

下载最新免费版金融终端V7.37,安装后下载自1990年1月1日至今的所有数据(沪深日线、沪深分钟线):

(通达信最新的免费版在windows 10操作系统上显示日期有bug)

然后在帮助中心--用户红宝书(http://help.tdx.com.cn/book.asp)下载最新的通达信插件选股编程规范。

压缩包内包含示例程序MyPlugin及插件选股编程规范文档。

MyPlugin是用古老的VC6编写的,可以用vs2010或以上版本打开,修改一个历史编译缺陷(VC6编译器是可以编过的):

WORD   AfxRightData(float*pData,WORD nMaxData) //获取有效数据位置

{

for(WORD nIndex=0;nIndex<nMaxData&&!memcmp(&pData[nIndex],g_nAvoidMask,4);nIndex++);

return(nIndex);

}

该插件工程比较简单,通过示例代码及文档可以快速了解如何编写通达信插件,在此不赘述。

主要讲下转载数据的思路:

  1. 首先创建转储数据的文件夹
struct DataPeriodDesc

{

int iPeriod;          //数据周期

const char* desc;    //周期描述

const char*  Suffix; //文件后缀

};

static  DataPeriodDesc periodDescArray[] =

{

{PER_MIN5,"5分钟"   ,"\\5min"},

{PER_MIN15,"15分钟" ,"\\15min"},

{PER_MIN30,"30分钟" ,"\\30min"},

{PER_HOUR,"小时"    ,"\\h"},

{PER_DAY,"日"       ,"\\d"},

{PER_WEEK,"周"      ,"\\w"},

{PER_MONTH,"月"     ,"\\m"},

{PER_DAYN,"45日"    ,"\\45d"},  

{PER_SEASON,"季"    ,"\\s"},

{PER_YEAR,"年"      ,"\\y"},

};

if(bFirstTime)

{

bFirstTime = FALSE;

        BOOL bCallReturn = FALSE;

//构建新的目录结构

bCallReturn = CreateDirectoryA(pSavePath,NULL);

for (int i=;i<ARRAYSIZE(periodDescArray);i++)

{

CHAR subFolderName [MAX_PATH] = {};

StringCchCopyA(subFolderName,MAX_PATH,pSavePath);

StringCchCatA(subFolderName,MAX_PATH,periodDescArray[i].Suffix);

bCallReturn = CreateDirectoryA(subFolderName,NULL);

}

        //转储大盘数据

nRet = InputInfoThenCalc1("", , Value, DataType, nDataNum, nTQ, unused);

}

屏蔽InputInfoThenCalc2,转储的范围是本地全部数据。

BOOL InputInfoThenCalc2(char * Code,short nSetCode,int Value[],short DataType,NTime time1,NTime time2,BYTE nTQ,unsigned long unused)  //选取区段

{

BOOL nRet = FALSE;

nRet = InputInfoThenCalc1(Code,nSetCode,Value,DataType,,nTQ,unused);

return nRet;

}

设置两个二值输入参数,控制插件转储数据的级别。分钟级转储日线级别以下的数据;日级转储日线及以上的数据。

InputInfoThenCalc1函数种根据选定的级别,遍历本地数据,将数据存储到文件。

LPHISDAT pHisDat = NULL;

CHAR buf[] = {};

for (int index_p=;index_p<ARRAYSIZE(periodDescArray);index_p++)

{

long lnum = g_pFuncCallBack(Code,nSetCode,periodDescArray[index_p].iPeriod,NULL,-,tmpTime,tmpTime,nTQ,);

if (lnum <)

{

goto Exit;

}

            if (periodDescArray[index_p].iPeriod>= PER_DAY && Value[] == )

            {

continue;

            }

else if (periodDescArray[index_p].iPeriod< PER_DAY && Value[] == )

{

continue;

}

//读取数据

SafeDeletes(pHisDat);

pHisDat = new HISDAT[lnum];

long readnum = g_pFuncCallBack(Code,nSetCode,periodDescArray[index_p].iPeriod,pHisDat,lnum,tmpTime,tmpTime,nTQ,);

            //保存到文件夹中            

CHAR subFolderName [MAX_PATH] = {};

StringCchCopyA(subFolderName,MAX_PATH,pSavePath);

StringCchCatA(subFolderName,MAX_PATH,periodDescArray[index_p].Suffix);

StringCchCatA(subFolderName,MAX_PATH,"\\");

StringCchCatA(subFolderName,MAX_PATH,Code);

            if (nTQ==) //精确复权

            {

StringCchCatA(subFolderName,MAX_PATH,"_fq");

            }

else if (nTQ == )

{

StringCchCatA(subFolderName,MAX_PATH,"_bfq");

}

StringCchCatA(subFolderName,MAX_PATH,".csv");

HANDLE hFile =  CreateFileA(subFolderName,                // name of the write

GENERIC_WRITE|GENERIC_READ,          // open for writing

,                      // do not share

NULL,                   // default security

CREATE_ALWAYS,          

FILE_ATTRIBUTE_NORMAL,  // normal file

NULL);                  // no attr. template

if (hFile != INVALID_HANDLE_VALUE)

{

NTime timeLastDay = {};

                 for(int index=;index<readnum;index++)

 {

                     if(periodDescArray[index_p].iPeriod>=PER_DAY)

 {

 //if (pHisDat[index].Time>timeLastDay)

 {

 StringCchPrintfA(buf,ARRAYSIZE(buf),"%4d%02d%02d,%f,%f,%f,%f,%f,%f\n",

 pHisDat[index].Time.year,

 pHisDat[index].Time.month,

 pHisDat[index].Time.day,

 pHisDat[index].Open,

 pHisDat[index].High,

 pHisDat[index].Low,

 pHisDat[index].Close,

 pHisDat[index].fVolume,

 pHisDat[index].Amount

 );

 }

/*  else

 {

                             continue;

 }*/

 }

 else if(periodDescArray[index_p].iPeriod < PER_DAY)

 {

 StringCchPrintfA(buf,ARRAYSIZE(buf),"%4d%02d%02d %02d%02d,%f,%f,%f,%f,%f,%f\n",

 pHisDat[index].Time.year,pHisDat[index].Time.month,pHisDat[index].Time.day,pHisDat[index].Time.hour,pHisDat[index].Time.minute,

 pHisDat[index].Open,

 pHisDat[index].High,

 pHisDat[index].Low,

 pHisDat[index].Close,

 pHisDat[index].fVolume,

 pHisDat[index].Amount

  );

 }

  size_t len = ;

  StringCbLengthA(buf,ARRAYSIZE(buf),&len);                 

  WriteFile(hFile,buf,len,NULL,NULL);

 }

}

            SafeCloseHandle(hFile);

SafeDeletes(pHisDat);

}

Exit:

SafeDeletes(pHisDat);

return nRet;

成功转载数据后,利用numpy读取指数最低价及收盘价:

l,c=np.loadtxt(‘999999_fq.csv’,delimiter=’,’,usecols=(3,4),unpack=True)

NumPy学习笔记 二的更多相关文章

  1. NumPy学习笔记 一

    NumPy学习笔记 一 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  2. numpy 学习笔记

    numpy 学习笔记 导入 numpy 包 import numpy as np 声明 ndarray 的几种方法 方法一,从list中创建 l = [[1,2,3], [4,5,6], [7,8,9 ...

  3. Numpy学习笔记(下篇)

    目录 Numpy学习笔记(下篇) 一.Numpy数组的合并与分割操作 1.合并操作 2.分割操作 二.Numpy中的矩阵运算 1.Universal Function 2.矩阵运算 3.向量和矩阵运算 ...

  4. Numpy学习笔记(上篇)

    目录 Numpy学习笔记(上篇) 一.Jupyter Notebook的基本使用 二.Jpuyter Notebook的魔法命令 1.%run 2.%timeit & %%timeit 3.% ...

  5. tensorflow学习笔记二:入门基础 好教程 可用

    http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础   TensorFlow用张量这种数据结构来表示所有的数据.用一 ...

  6. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  7. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  8. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  9. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

随机推荐

  1. 使用anyproxy 来抓取手机的数据包

    简单介绍Anyproxy Anyproxy 是alibaba 前端团队开源的http/https 的代理工具 官网地址:http://anyproxy.io/cn/ 环境要求:需要安装nodejs 提 ...

  2. mysql索引优化面试题

    曾经偷偷的面试了两个单位,都提到了Mysql的优化问题,所以以后要多多学习数据库的优化知识了.建设数据库的优化大概主要就是索引的优化了吧,因为我们不可能修改数据结构的情况下,提高数据库的查询效率似乎也 ...

  3. Linux磁盘分区(一):添加

    ***********************************************声明************************************************ 原创 ...

  4. 小随笔:利用Shader实现模型爆炸和沙粒化的效果

    0x00 前言 上一篇小随笔<小随笔:利用Shader给斯坦福兔子长毛和实现雪地效果>中,我和大家聊了聊著名的斯坦福兔子和利用geometry shader实现的一些效果.这篇文章继续沿用 ...

  5. java学习笔记之集合家族1

    集合 集合介绍: 由于数组中存放对象,对对象操作起来不方便.java中有一类容器,专门用来存储对象. 集合与数组的区别: 1.数组的长度固定的,而集合长度时可变的 2.数组只能储存同一类型的元素,而且 ...

  6. windows 终端命令详解

    打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗口... 也可以通过cmd /c 命令 和 cmd /k 命令的方式来直接运行命令 注:/c表示执行完命令后关闭cmd ...

  7. python爬虫(七)_urllib2:urlerror和httperror

    urllib2的异常错误处理 在我们用urlopen或opener.open方法发出一个请求时,如果urlopen或opener.open不能处理这个response,就产生错误. 这里主要说的是UR ...

  8. js----数组处理之splice(有js原始addClass方法哦)

    上次写了一个轮播的方法:http://blog.csdn.net/stronglyh/article/details/46833499 由于别人问我的时候,给了我html.于是乎我就看到了页面中引用了 ...

  9. LeetCode90:Subsets II

    Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...

  10. 自学Zabbix3.1-语言切换

    题记:   默认使用的zabbix版本为Zabbix 3.0.8 登陆到zabbix web控制台默认是英文界面,对有些英文不好或者习惯中文的人来说会有不适应. 实际上是切换到中文版本,步骤:点击用户 ...