NumPy学习笔记 二
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);
}
该插件工程比较简单,通过示例代码及文档可以快速了解如何编写通达信插件,在此不赘述。
主要讲下转载数据的思路:
- 首先创建转储数据的文件夹
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学习笔记 二的更多相关文章
- NumPy学习笔记 一
NumPy学习笔记 一 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- numpy 学习笔记
numpy 学习笔记 导入 numpy 包 import numpy as np 声明 ndarray 的几种方法 方法一,从list中创建 l = [[1,2,3], [4,5,6], [7,8,9 ...
- Numpy学习笔记(下篇)
目录 Numpy学习笔记(下篇) 一.Numpy数组的合并与分割操作 1.合并操作 2.分割操作 二.Numpy中的矩阵运算 1.Universal Function 2.矩阵运算 3.向量和矩阵运算 ...
- Numpy学习笔记(上篇)
目录 Numpy学习笔记(上篇) 一.Jupyter Notebook的基本使用 二.Jpuyter Notebook的魔法命令 1.%run 2.%timeit & %%timeit 3.% ...
- tensorflow学习笔记二:入门基础 好教程 可用
http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础 TensorFlow用张量这种数据结构来表示所有的数据.用一 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
随机推荐
- jQuery操作input改变value属性值
今天写了一个表单元素,在用户点击的时候会清空input中的内容,当鼠标点击其他地方的时候会把输入的值保存为input的value值 类似于这样的效果 当用户点击的时候文字消失. html代码 < ...
- 【原创】python爬虫获取网站数据并存入本地数据库
#coding=utf-8 import urllib import re import MySQLdb dbnumber = MySQLdb.connect('localhost', 'root', ...
- hdu 2586 How far away ?倍增LCA
hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...
- java桌面程序打包教程
首先打包成j可执行的jar文件. . 接下来找到自己生成jar文件的路径就可以看到jar文件了,我的是在桌面: 在桌面新建一个文件夹(名字随便取,一般去项目名字) 上面是我取的文件夹名字,然后把资料文 ...
- 怎么配置Jupyter Notebook默认启动目录?
前言 系统环境:win10 x64:跟环境也没啥关系,在LInux下也一样... 前段时间重换了系统后,发现Jupyter Notebook的默认启动目录不太对呀,所以,就翻到了以前的笔记,还是记在这 ...
- linux系统下安装配置解压版的MySQL数据库
一.解压文件到当前目录 命令:tar -zxvf mysql....tar.gz 二.移动解压完成的文件夹到目标目录并更名mysql 命令:mv mysql-版本号 /usr/local/mysql ...
- Js中for循环的阻塞机制
Js阻塞机制,跟Js引擎的单线程处理方式有关,每个window一个JS线程.所谓单线程,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码. 由于浏览器是事件驱动的(Event driven) ...
- 《跟我学IDEA》二、配置maven、git、tomcat
上一篇博文我们讲解了如何去下载并安装一个idea,在这里我们推荐的是zip的解压版,另外我们配置的一些编码和默认的jdk等.今天我们来学习配置maven.git.tomcat等.还是那句话,工欲善其事 ...
- Java爬虫——模拟登录知乎
登录界面,首先随意输入一个账号,登录查看发送表单的请求 可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: passwo ...
- 经验总结22--抓取HTML数据,HtmlAgilityPack(续)
假设获取的数据是HTML的话.我们就须要第三方工具有辅助获取我们须要的数据. 我选用了HtmlAgilityPack这么个工具. 首先肯定去网上下载一个,然后引用到项目中.下载地址:http://ht ...