VeighNa量化社区
你的开源社区量化交易平台
wanger's Avatar
Moderator
离线
21 帖子
声望: 1

目前数据部门正在规划行情类接口整体优化方案,待发布新的接口,我们会发布相关公告。
如果现在您这边着急使用期货盘后分钟数据,可结合“1.1.2 交易日历”接口,使用3.1.2接口中交易日字段与分时字段,关联计算出自然日字段。
后续我们也可安排技术人员撰写相关日期的转换教程,推出后,会在社区发布源码

您好,恒有数 3.1.2 期货盘后分钟切片 ,返回参数中的 “日期交易日” 对应数据为 “前一日夜盘+当天日盘”的数据,此接口后面还会做优化,目前我们已经提了需求给数据部门,后续会增加自然日日期字段。

每周获奖名单公布
第二期:12月13 ~ 12月19



- 姓名    注册手机号   评奖结果    奖品:京东卡(元)
- 陈 **  158 **** 5539   一等奖  500
- 刘 **  158 **** 2609   一等奖  500
- 至 **  151 **** 3106   一等奖  500
- 王 *    150 **** 8694  二等奖  200
- 阿 *    136 **** 1493  二等奖  200
- 孔 *    136 **** 1489  二等奖  200
- 常 *    139 **** 7366  二等奖  200
- 孙 **  155 **** 2624   二等奖  200
- 李 *    181 **** 5052  二等奖  200
- 程 **  186 **** 6364   三等奖  100
- 王 **  183 **** 0966   三等奖  100
- 吴 *    182 **** 8866  三等奖  100
- 杨 **  181 **** 5364   三等奖  100
- 曹 *    173 **** 4709  三等奖  100
- 曹 **  150 **** 0198   三等奖  100
- 贾 *    137 **** 7693  三等奖  100
- 冯 **  130 **** 3820   三等奖  100
- 周 **  180 **** 5522   三等奖  100
- 韩 **  157 **** 9838   三等奖  100

余 * 酱等38位用户,获5000光子,可兑换20元腾讯/优酷视频会员券等;

兑换方式,详见https://developer.hs.net/thread/1720

每周获奖名单公布
第一期:有奖问卷活动,12/06 ~ 12/12获奖名单



- 姓名    注册手机号   评奖结果    奖品:京东卡(元)
- 张 **   135 **** 9542  一等奖   500
- 王 * 豪 156 **** 8019   一等奖   500
- 黄 **   199 **** 7609  一等奖   500
- 孙 * 乐 151 **** 4023   二等奖   200
- 胡 *     159 **** 9919 二等奖   200
- 无 **   155 **** 4565  二等奖   200
- 欢 *     159 **** 0883 二等奖   200
- 宋 **   150 **** 9069  二等奖   200
- 马 **   157 **** 4353  二等奖   200
- 黄 **   131 **** 7995  三等奖   100
- 张 **   191 **** 9443  三等奖   100
- 王 * 锋 136 **** 9543   三等奖   100
- 果 * 临 187 **** 7660   三等奖   100
- 于 * 海 189 **** 7586   三等奖   100
- 吴 *     153 **** 6523 三等奖   100
- 童 * 哲 191 **** 1191   三等奖   100
- 槐 *     158 **** 8533 三等奖   100
- 崔 *     131 **** 7478 三等奖   100
- 卢 * 鹏 186 **** 9264   三等奖   100

厉*亮等33位用户,获5000光子,可兑换20元腾讯/优酷视频会员券等;

兑换方式,详见https://developer.hs.net/thread/1720

活动时间
即日起—2021年12月31号

参与方式
1、下单1次恒有数产品套餐,下单地址为:https://udata.hs.net/subscribe (包含免费体验套餐;2021/09/10以来,已下单的用户,无需重新下单);

2、提交公测版调查问卷,问卷地址为:https://www.wenjuan.com/s/vIVbqqA/;

说明:上面两步都需要完成哦 ~

活动奖励
1、每位完成本活动的用户,均可获得20元视频会员代金券;

2、每周评选1次优质问卷,评奖数量与奖品如下:

一等奖:3位,500元京东卡 1张

二等奖:6位,200元京东卡 1张

三等奖:10位,100元京东卡 1张

说明:每个账号,最多仅可获得1次视频会员奖励;

奖品发放与兑换使用
1、每周一,在本帖中公布上周获奖名单,并发放奖品;

2、京东卡发放,以短信的方式将卡券码发放至注册手机号;

3、视频会员奖品兑换与使用指南,详见:https://developer.hs.net/thread/1720

4、加入恒生-恒有数群(已加群小伙伴不需要重复加群) ,群内会同步获奖名单和领奖方式 ~

description

一年一度恒生电子超大技术盛会,独家发布金融科技行业技术趋势!
全新云参会玩法,丰富活动更有豪礼等你赢!
更有量化用户感兴趣的【高性能】分论坛,不要错过哦。
一站直达大会官网:传送门

description

恒有数金融数据社区活动列表

恒有数(https://udata.hs.net/home?channel_source=vnpy

1、全部142个接口,新用户下单免费的体验套餐,可免费使用30天;

2、目前社区推出新人礼包活动,限时领取1折券;
金融数据142个接口,超值套餐包年仅需199.9元,单日最低0.15元;

3、正值双十一活动季,社区推出三重奖励,下单即可兑现奖品,奖品包括腾讯视频月卡、天猫、京东代金券等等

description

双十一活动规则

一、活动对象

恒生Light云官网注册用户,登录即可参加

二、活动时间

即日起——2021年11月12日23时59分59秒

三、活动规则

(一)参与活动
1、活动期间,凡是订阅恒有数的用户,均自动参加恒有数双十一活动,无需报名;

(二)活动奖励
1、活动期间,根据单笔下单金额,奖励对应光子,用户可用光子兑换对应的奖品;
2、活动奖励分为3档,详情如下:
(1)下单实付金额满1元,奖励500光子;
(2)单笔订单实付金额满50元,奖励5000光子;(可兑换腾讯视频VIP月卡、天猫超市代金券、滴滴出行代金券等)
(3)单笔订单实付金额满150元,奖励12500光子;(可兑换星巴克代金券、京东E卡代金券等)
3、每个用户每次单笔下单,取符合条件的最高档奖励,每档奖励每个用户最多只奖励一次;

(三)奖品兑换
1、用户满足奖励条件后,光子会自动发放。用户可在页面点击“查询奖励”进入光子中心页面,查看光子明细确认奖励发放;
2、用户可在光子中心页面下方的“U选商城”中,兑换奖品;

description

注:更多信息详见恒有数订阅页面:https://udata.hs.net/subscribe

Python量化数据仓库搭建系列3:数据落库代码封装

本系列教程为量化开发者,提供本地量化金融数据仓库的搭建教程与全套源代码。我们以恒有数(UDATA)金融数据社区为数据源,将金融基础数据落到本地数据库。教程提供全套源代码,包括历史数据下载与增量数据更新,数据更新任务部署与日常监控等操作。

在上一节讲述中,我们封装了Python操作MySQL数据库的自定义类,存为MySQLOperation.py文件;本节内容操作数据库部分,将会调用MySQLOperation中的方法,以及pandas.to_sql和pandas.read_sql的操作。

一、恒有数(UDATA)操作简介

1、获取Token

A、在恒有数官网(https://udata.hs.net )注册并登录,在订阅页面,下单免费的体验套餐;

B、在右上角,头像下拉菜单中,进入总览页面,复制Token;

C、在数据页面,查看数据接口文档,获取接口名称、请求参数、返回参数和Python代码示例;

2、安装hs_udata

pip install hs_udata

使用示例如下:

import hs_udata as hs
# 设置Token
hs.set_token(token = 'xxxxxxxxxxxxxxx')  # 总览页面获取个人Token
# 以分钟线行情为例,获取000001.SZ在2021-05-01至2021-06-01期间的分钟线数据
# 接口文档见:https://udata.hs.net/datas/342/
df = hs.stock_quote_minutes(en_prod_code="000001.SZ",begin_date="20210501",end_date="20210601")
# 增加股票代码列
df['hs_code']='000001.SZ'
df.head()

description

其余接口使用过程与之类似;

二、数据落库示例

以股票列表(stock_list)为例,讲解建表、落库、查询等操作;全套代码见本文第三章;

1、准备工作

(1)在MySQL数据库中,创建数据库udata,创建过程见第一讲《Python量化数据仓库搭建系列1:数据库安装与操作》;

(2)在MySQL数据库中,创建数据更新记录表udata.tb_update_records,表结构如下:

description

建表SQL如下:

CREATE TABLE udata.tb_update_records (
                table_name CHAR(40),
                data_date CHAR(20),
                update_type CHAR(20),
                data_number INT(20),
                elapsed_time INT(20),
                updatetime CHAR(20)
                )

(3)将Token与数据库参数写入配置文件DB_MySQL.config,文件内容如下:

[udata]
token='你的Token'
host='127.0.0.1'
port=3306
user='root'
passwd='密码'
db='udata'

(4)读取配置文件中的参数

import configparser
# 读取配置文件中,恒有数和数据库参数
configFilePath = 'DB_MySQL.config'
section = 'udata'
config = configparser.ConfigParser()
config.read(configFilePath)
# 读取 恒有数(UData) 的 token
token = eval(config.get(section=section, option='token'))
# MySQL连接参数读取
host = eval(config.get(section=section, option='host'))
port = int(config.get(section=section, option='port'))
db = eval(config.get(section=section, option='db'))
user = eval(config.get(section=section, option='user'))
passwd = eval(config.get(section=section, option='passwd'))

2、建表

在社区数据页面,查看数据表返回参数字段,以股票列表(stock_list,https://udata.hs.net/datas/202/ )为例:

description

将建表、删除表格、清空数据的SQL,写入配置文件DB_Table.config,文件内容如下:

[tb_stock_list]
DROP_TABLE='DROP TABLE IF EXISTS tb_stock_list'
CREATE_TABLE='''CREATE TABLE tb_stock_list (
                secu_code CHAR(20),
                hs_code CHAR(20),
                secu_abbr CHAR(20),
                chi_name CHAR(40),
                secu_market CHAR(20), 
                listed_state CHAR(20),
                listed_sector CHAR(20),
                updatetime CHAR(20)
                )'''
DELETE_DATA = 'truncate table tb_stock_list'

建表代码如下:

# MySQL操作实例化,pymysql连接设置,可打开、关闭、执行sql、执行sql读取数据
MySQL = MySQLOperation(host, port, db, user, passwd)
# 读取配置文件中,恒有数和数据库参数
configFilePath = 'DB_Table.config'
section = 'tb_stock_list'
config = configparser.ConfigParser()
config.read(configFilePath)
DROP_TABLE = eval(config.get(section=section, option='DROP_TABLE'))
CREATE_TABLE = eval(config.get(section=section, option='CREATE_TABLE'))
DELETE_DATA = eval(config.get(section=section, option='DELETE_DATA'))
# 删除表结构
MySQL.Execute_Code(DROP_TABLE)
# 创建表结构
MySQL.Execute_Code(CREATE_TABLE)

3、数据落库

import hs_udata as hs
from sqlalchemy import create_engine
from datetime import datetime
# 设置token
hs.set_token(token)
# 获取 股票列表 数据
df = hs.stock_list()
# 在最后一列增加系统时间戳
dt = datetime.now()
df['updatetime'] = dt.strftime('%Y-%m-%d %H:%M:%S')
# 由于股票列表数据为全量更新,数据插入之前,先清空表中数据
MySQL.Execute_Code(DELETE_DATA)
# sqlalchemy 连接设置,可用于pandas.read_sql、pandas.to_sql
engine = create_engine('mysql://{0}:{1}@{2}:{3}/{4}?charset=utf8'.format(user,passwd,host,port,db))
# 将数据写入到MySQL中的数据表
df.to_sql(name='tb_stock_list', con=engine, index=False, if_exists='append')

在数据库中查看结果如下:

description

4、读取数据

import pandas as pd
result = pd.read_sql('''SELECT * FROM tb_stock_list ''', con=engine)
print(result.head())

三、落库代码封装

将上述几步操作,封装到一起,定义并调用python中class类的属性和方法。代码中涉及主要技术点如下:

(1)使用pymysql、pandas.to_sql和pandas.read_sql操作MySQL数据库;

(2)使用class类的方法,集成建表、插入数据和查询数据的操作;

(3)使用配置文件的方式,从本地文件中,读取数据库参数与表操作的SQL代码;

(4)使用try容错机制,结合日志函数,将执行日志打印到本地的DB_MySQL_LOG.txt文件;

import pandas as pd
import hs_udata as hs
from MySQLOperation import *
from sqlalchemy import create_engine
from datetime import datetime
import time
import configparser
import logging
import traceback
import warnings
warnings.filterwarnings("ignore")

class TB_Stock_List:

    def __init__(self,MySQL_Config,BD_Name,Table_Config,Table_Name):
        # 创建日志
        self.logging = logging
        self.logging.basicConfig(filename='DB_MySQL_LOG.txt', level=self.logging.DEBUG
                                 , format='%(asctime)s - %(levelname)s - %(message)s')
        # 读取配置文件中,恒有数和数据库参数
        configFilePath = MySQL_Config
        self.section1 = BD_Name
        config = configparser.ConfigParser()
        config.read(configFilePath)
        # 读取 恒有数(UData) 的 token
        self.token = eval(config.get(section=self.section1, option='token'))
        # MySQL连接参数读取
        self.host = eval(config.get(section=self.section1, option='host'))
        self.port = int(config.get(section=self.section1, option='port'))
        self.db = eval(config.get(section=self.section1, option='db'))
        self.user = eval(config.get(section=self.section1, option='user'))
        self.passwd = eval(config.get(section=self.section1, option='passwd'))
        # pymysql连接设置,可打开、关闭、执行sql、执行sql读取数据
        self.MySQL = MySQLOperation(self.host, self.port, self.db, self.user, self.passwd)
        # sqlalchemy 连接设置,可用于pandas.read_sql、pandas.to_sql
        self.engine = create_engine('mysql://{0}:{1}@{2}:{3}/{4}?charset=utf8'.format(self.user
                                                                                      , self.passwd
                                                                                      , self.host
                                                                                      , self.port
                                                                                      , self.db))
        # 读取配置文件中,恒有数和数据库参数
        configFilePath = Table_Config
        self.section2 = Table_Name
        config = configparser.ConfigParser()
        config.read(configFilePath)
        self.DROP_TABLE_SQL = eval(config.get(section=self.section2, option='DROP_TABLE'))
        self.CREATE_TABLE_SQL = eval(config.get(section=self.section2, option='CREATE_TABLE'))
        self.DELETE_DATA_SQL = eval(config.get(section=self.section2, option='DELETE_DATA'))

        self.logging.info('*********************{0}.{1}*********************'.format(self.section1, self.section2))

    def CREATE_TABLE(self):
        try:
            # 删除表结构
            self.MySQL.Execute_Code('SET FOREIGN_KEY_CHECKS = 0')
            self.MySQL.Execute_Code(self.DROP_TABLE_SQL)
            # 创建表结构
            self.MySQL.Execute_Code(self.CREATE_TABLE_SQL)
            self.logging.info('表{0}.{1},表格创建成功'.format(self.section1,self.section2))
        except:
            self.logging.info('表{0}.{1},表格创建失败'.format(self.section1,self.section2))
            self.logging.debug(traceback.format_exc())

    def UPDATE_DATA(self):
        try:
            # 设置token
            hs.set_token(self.token)
            time_start = time.time()  # 计时
            # 获取 股票列表 数据
            df = hs.stock_list()
            # 在最后一列增加系统时间戳
            dt = datetime.now()
            df['updatetime'] = dt.strftime('%Y-%m-%d %H:%M:%S')
            # 由于股票列表数据为全量更新,数据插入之前,先清空表中数据
            self.MySQL.Execute_Code(self.DELETE_DATA_SQL)
            # 将数据写入到MySQL中的数据表
            df.to_sql(name='tb_stock_list', con=self.engine, index=False, if_exists='append')
            time_end = time.time()  # 计时
            elapsed_time = round(time_end-time_start,2)
            # 向mysql库中记录一条数据更新记录:表名,数据日期,更新方式,更新条数,更新耗时,系统时间
            self.RECORDS_SQL = '''INSERT INTO udata.tb_update_records 
            VALUES ('{0}','{1}','全量',{2},{3}, SYSDATE())'''.format(self.section2
                                                                   ,dt.strftime('%Y-%m-%d'),len(df),elapsed_time)
            self.MySQL.Execute_Code(self.RECORDS_SQL)
            self.logging.info('表{0}.{1},数据更新成功'.format(self.section1,self.section2))
        except:
            self.logging.info('表{0}.{1},数据更新失败'.format(self.section1,self.section2))
            self.logging.debug(traceback.format_exc())

    def READ_DATA(self, WhereCondition=''):
        try:
            result = pd.read_sql('''SELECT * FROM {0}.{1} '''.format(self.section1,self.section2)
                                 + WhereCondition, con=self.engine)
            self.logging.info('表{0}.{1},数据读取成功'.format(self.section1,self.section2))
            return result
        except:
            self.logging.info('表{0}.{1},数据读取失败'.format(self.section1,self.section2))
            self.logging.debug(traceback.format_exc())
            return 0

if __name__ == '__main__':
    MySQL_Config = 'DB_MySQL.config'
    BD_Name = 'udata'
    Table_Config = 'DB_Table.config'
    Table_Name = 'tb_stock_list'
    # 实例化
    TB_Stock_List_Main = TB_Stock_List(MySQL_Config,BD_Name,Table_Config,Table_Name)
    # 创建表结构
    TB_Stock_List_Main.CREATE_TABLE()
    # 更新数据
    TB_Stock_List_Main.UPDATE_DATA()
    # 读取数据
    data = TB_Stock_List_Main.READ_DATA()

四、代码及配置文件下载

(1)附件文件目录:

DB_MySQL.config

DB_Table.config

MySQLOperation.py

TB_Stock_List.py

(文件下载请前往 https://developer.hs.net/thread/1501 ,附件位于文章末端)

(2)下载附件文件后,将配置文件DB_MySQL.config中的Token与数据库参数,修改为自己的参数;将代码放置在同一目录下执行。

下一节《Python量化数据仓库搭建系列4:股票数据落库》

Python量化数据仓库搭建系列2:Python操作数据库

本系列教程为量化开发者,提供本地量化金融数据仓库的搭建教程与全套源代码。我们以恒有数(UDATA)金融数据社区为数据源,将金融基础数据落到本地数据库。教程提供全套源代码,包括历史数据下载与增量数据更新,数据更新任务部署与日常监控等操作。

在上一节讲述中,我们选择了MySQL作为本系列教程的数据库,故本文着重讲解Python操作MySQL的步骤,并封装方法。在文末简单介绍Python操作MongoDB、SQLite、PostgreSQL数据库;

一、pymysql用法

1、安装pymysql模块

pip install pymysql

2、连接数据库

from pymysql import * 
# 打开数据库连接,数据库参数可以在MySQL界面或数据库配置文件中查看
conn = pymysql.connect(host = '数据库IP',
                       port = '端口',
                       user = '用户名',
                       password = '密码',
                       database='数据库名称')

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = conn.cursor()

# 在数据库操作执行完毕后,关闭数据库连接
# conn.close()

3、常见SQL代码执行

from pymysql import * 
# 执行SQL代码:建表、删表、插入数据
def Execute_Code(sql_str):
    # 打开数据库连接
    conn = pymysql.connect(host = '127.0.0.1',port = 3306,user = 'root',
                           password = '密码',database='udata')
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = conn.cursor()
    try:
        # 使用execute()方法执行SQL
        cursor.execute(sql)
        # 提交到数据库执行
        conn.commit()
    except:
        # 发生错误时回滚
        conn.rollback()
    # 关闭数据库连接
    conn.close()

A、建表

sql_str = '''CREATE TABLE TB_Stock_List_Test (
                        secu_code CHAR(20),
                        hs_code CHAR(20),
                        secu_abbr CHAR(20),
                        chi_name CHAR(40),
                        secu_market CHAR(20), 
                        listed_state CHAR(20),
                        listed_sector CHAR(20),
                        updatetime CHAR(20));'''
Execute_Code(sql_str)

B、插入数据

sql_str = '''
INSERT INTO TB_Stock_List_Test
(`secu_code`,`hs_code`,`secu_abbr`,`chi_name`,`secu_market`,`listed_state`
,`listed_sector`,`updatetime`)
VALUES
('000001','000001.SZ','平安银行','平安银行股份有限公司','深圳证券交易所','上市',
'主板','2021-10-25 20:10:55');
'''
Execute_Code(sql_str)

C、更新数据

sql_str = "UPDATE tb_stock_list SET updatetime = '2021-10-30 20:10:55' "
Execute_Code(sql_str)

D、删除数据

sql_str = 'DELETE FROM tb_stock_list'
Execute_Code(sql_str)

E、删除表格

sql_str = 'DROP TABLE IF EXISTS tb_stock_list'
Execute_Code(sql_str)

4、查询操作

def Select_Code(sql_str):
    # 打开数据库连接
    conn = pymysql.connect(host = '127.0.0.1',port = 3306,user = 'root',
                           password = '密码',database='udata')
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = conn.cursor()
    # 使用execute()方法执行SQL
    cursor.execute(sql_str)
    # 获取所有记录列表
    results = cursor.fetchall()
    # 关闭数据库连接
    conn.close()

    return results
sql_str = 'select * from tb_stock_list'
results = Select_Code(sql_str)
results

5、方法封装

将上述用法,封装为自定义类,存为MySQLOperation.py文件,代码如下:

from pymysql import * 
# MySQL操作函数
class MySQLOperation:
    def __init__(self, host, port, db, user, passwd, charset='utf8'):
        # 参数初始化
        self.host = host
        self.port = port
        self.db = db
        self.user = user
        self.passwd = passwd
        self.charset = charset
    def open(self):
        # 打开数据库连接
        self.conn = connect(host=self.host,port=self.port
                            ,user=self.user,passwd=self.passwd
                            ,db=self.db,charset=self.charset)
        # 使用 cursor() 方法创建一个游标对象 cursor
        self.cursor = self.conn.cursor()
    def close(self):
        # 断开数据库连接
        self.cursor.close()
        self.conn.close()
    def Execute_Code(self, sql):
        # 执行SQL代码:建表、删表、插入数据
        try:
            self.open()               # 打开数据库连接
            self.cursor.execute(sql)  # 使用execute()方法执行SQL
            self.conn.commit()        # 提交到数据库执行 
            self.close()              # 断开数据库连接
        except Exception as e:
            self.conn.rollback()      # 发生错误时回滚
            self.close()              # 断开数据库连接
            print(e)
    def Select_Code(self, sql):
        # 执行SQL代码,查询数据
        try:
            self.open()                        # 打开数据库连接
            self.cursor.execute(sql)           # 使用execute()方法执行SQL
            result = self.cursor.fetchall()    # 获取所有记录列表
            self.close()                       # 断开数据库连接
            return result                      # 返回查询数据
        except Exception as e:
            self.conn.rollback()               # 发生错误时回滚
            self.close()                       # 断开数据库连接
            print(e)

插入与查询用法如下,其余用法类似,此处不再赘述;

import pandas as pd
host='127.0.0.1'
port=3306
user='root'
passwd="密码"
db='udata'
# 方法实例化
MySQL = MySQLOperation(host, port, db, user, passwd)
# 插入操作代码
sql_str = '''
INSERT INTO tb_stock_list
(`secu_code`,`hs_code`,`secu_abbr`,`chi_name`,`secu_market`,`listed_state`,`listed_sector`,`updatetime`)
VALUES
('000001','000001.SZ','平安银行','平安银行股份有限公司','深圳证券交易所','上市',
'主板','2021-10-25 20:15:55');
'''
MySQL.Execute_Code(sql_str)
# 查询数据
sql_str = 'select * from tb_stock_list'
results = MySQL.Select_Code(sql_str)
results

二、sqlalchemy用法

由于上述pymysql用法已经可以满足大部分使用需求,sqlalchemy实现功能与之类似。这里着重介绍一下基于sqlalchemy链接数据库的pandas.to_sql和pandas.read_sql操作。

1、安装pymysql模块

pip install sqlalchemy

2、连接数据库

from sqlalchemy import create_engine
host='127.0.0.1'
port = 3306
user='root'
password='密码'
database='udata'
engine = create_engine('mysql://{0}:{1}@{2}:{3}/{4}?charset=utf8'.format(user
                                                                         ,password
                                                                         ,host
                                                                         ,port
                                                                         ,database))

3、pandas.to_sql

将DataFrame中的数据,写入MySQL数据库,代码示例如下:

import pandas as pd
# 定义需要写入的数据,DataFrame格式
data = pd.DataFrame([['000001','000001.SZ','平安银行','平安银行股份有限公司'
                      ,'深圳证券交易所','上市','主板','2021-10-25 20:12:55'],
                   ['000002','000002.SZ','万 科A','万科企业股份有限公司'
                    ,'深圳证券交易所','上市','主板','2021-10-25 20:12:55']])
# 列名赋值
data.columns = ['secu_code','hs_code', 'secu_abbr', 'chi_name'
                , 'secu_market', 'listed_state','listed_sector','updatetime']
# 写入数据库
data.to_sql(name='tb_stock_list', con=engine, index=False, if_exists='append')

if_exists 参数用于当目标表已经存在时的处理方式,默认是 fail,即目标表存在就失败。另外两个选项是 replace 表示替代原表,即删除再创建,append 选项仅添加数据。

4、pandas.read_sql

从数据库中,将数据读取为DataFrame,代码示例如下:

# 将sql查询结果,赋值为result
result = pd.read_sql('''SELECT * FROM tb_stock_list ''', con=engine)
result

三、Python操作其他常见数据库

1、MongoDB

(1)安装pymongo:pip install pymongo

(2)操作简介

import pymongo
# 连接MongoDB
conn = pymongo.MongoClient(host='localhost',port=27017
                           ,username='username', password='password')
# 指定数据库
db = conn['udata']  # db = client.udata
# 指定集合
collection = db['tb_stock_list']  # collection = db.tb_stock_list
# 插入数据 insert_one()、insert_many()
data1 = {}  # 集合,键值对,1条数据
data2 = {}  # 集合,键值对,1条数据
result = collection.insert_many([data1, data2])
# result = collection.insert_one(data1)
# 查询数据 find_one()、find()
result = collection.find_one({'secu_code': '000001'})
# 更新数据 update_one()、update()
result = collection.update_one({'secu_code': '000001'}, {'$set': {'hs_code': '000001'}})
# 删除数据 remove()、delete_one()和delete_many()
result = collection.remove({'secu_code': '000001'})

2、SQLite

(1)安装sqlite3:pip install sqlite3

(2)操作简介

import sqlite3
# 连接数据库
conn = sqlite3.connect('udata.db')
# 创建游标
cursor = conn.cursor()
# 执行SQL
sql = "增减删等SQL代码"
cursor.execute(sql)
# 查询数据
sql = "查询sql代码"
values = cursor.execute(sql)
# 提交事物
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()

3、PostgreSQL

(1)安装psycopg2:pip install psycopg2

(2)操作简介

import psycopg2
# 连接数据库
conn = psycopg2.connect(database="udata", user="postgres"
                        , password="密码", host="127.0.0.1", port="5432")
# 创建游标
cursor = conn.cursor()
# 执行SQL
sql = "增减删等SQL代码"
cursor.execute(sql)
# 查询全部数据
sql = "查询sql代码"
cursor.execute(sql)
rows = cursor.fetchall()
# 事物提交
conn.commit()
# 关闭数据库连接
conn.close()

综上,Python操作数据库的简要介绍就结束了;还有很多类型的数据库,Python操作它们的过程大同小异,后续我也将会继续梳理相关资料。

下一节《Python量化投资数据仓库搭建3:数据落库代码封装》

Python量化数据仓库搭建系列1:数据库安装与操作

本系列教程为量化开发者,提供本地量化金融数据仓库的搭建教程与全套源代码。我们以恒有数(UDATA)金融数据社区为数据源,将金融基础数据落到本地数据库。教程提供全套源代码,包括历史数据下载与增量数据更新,数据更新任务部署与日常监控等操作。

一、数据仓库

数据仓库(Data Warehouse)简称DW或DWH,数据仓库顾名思义,是一个很大的数据存储集合。是数据库的一种概念上的升级,输入方是各种各样的数据源,最终的输出用于数据分析、量化分析、数据挖掘、数据报表等方向,从逻辑上讲数据仓库和数据库是没有什么区别的。

二、数据库选型

目前常用的开源免费数据库有MySQL、MongoDB 、Postgresql 和 SQLite (Python自带)。在2020-2021年DB-Engines 排行榜前十的见下图,各个数据库有各自的特点和适用场景。具体选用哪一个作为量化投资的数据库,取决于存储的数据特点、性能要求和成本。对于个人来说,硬件水平、技术水平、费用成本和学习时间成本等因素都相当重要。

description

本系列教程,选用MySQL数据库为例,讲解数据仓库的搭建过程。其他数据库相关教程,也将会陆续推出,敬请期待。

MySQL数据库是当今最流行的开放源码数据库之一,为用户提供了一个相对简单的解决方案,适用于广泛的应用程序部署。MySQL Community Server是MySQL数据库的免费开源版,对个人用户非常友好。

三、数据库安装

1、MySQL Community Server安装包下载

安装包下载网页为:https://dev.mysql.com/downloads/mysql/ ,选择对应的操作系统,点击下载,例如下图为下载64位Windows系统MySQL Community Server安装包:

description

2、软件安装

A、双击安装包,进行安装;

B、Choosing a Setup Type页面,选择Developer Default,点击next进入下一步;

C、Path Conflicts页面,确认安装路径与数据存放路径,点击next进入下一步;

D、Check Requirements页面,检查安装条件,直接点击next进入下一步;

E、Installation页面,点击execute执行(此处等待时间较久),执行完后点击next进入下一步;

F、Product Configuration页面,点击next进入下一步;

G、Type and Networking页面,点击next进入下一步;

H、Authentication Method页面,点击next进入下一步;

I、Accounts and Roles页面,设置Root密码,点击next进入下一步;

J、Windows Service页面,点击next进入下一步;

K、Apply Configuration页面,点击execute执行,点击Finish;

L、Product Configuration页面,点击next进入下一步;

M、MySQL Router Configuration页面,点击Finish;

N、Product Configuration页面,点击next进入下一步;

O、Connect To Server页面,填写并check一下root密码,点击next进入下一步;、

P、Apply Configuration页面,点击execute执行,点击Finish;

Q、Product Configuration页面,点击next进入下一步;

R、Installation Complete页面,点击Finish;

完成上述步骤,即可完成安装。

四、MySQL基本使用教程

1、创建数据库

create database <数据库名>;

在MySQL Workbench界面中,建库操作如下图:

description

2、删除库

drop database <数据库名>;

3、创建表

create table table_name(column_name column_type);

以股票列表为例,建表代码如下:

/*
参数名         类型     长度   说明        备注
secu_code      String   20     证券代码
hs_code        String   20     HS代码
secu_abbr      String   20     证券简称
chi_name       String   20     中文名称
secu_market    String   20     证券市场
listed_state   String   20     上市状态
listed_sector  String   20     上市板块
*/
CREATE TABLE udata.TB_Stock_List (
                        secu_code CHAR(20),
                        hs_code CHAR(20),
                        secu_abbr CHAR(20),
                        chi_name CHAR(40),
                        secu_market CHAR(20), 
                        listed_state CHAR(20),
                        listed_sector CHAR(20),
                        updatetime CHAR(20));

4、删除表

drop table table_name;

5、修改表名

alter table old_name rename to new_name或rename table old_name to new_name;

6、增加字段

alter table table_name add column_name column_type;

7、修改字段

alter table table_name change column_name new_column_name new_column_name_type;

8、删除字段

alter table table_name drop column_name;

9、插入数据

INSERT INTO table_name ( field1, field2,...fieldN )
                        VALUES
                       ( value1, value2,...valueN );

10、查询数据

SELECT column_name1,column_name2
FROM table_name
[WHERE Clause]
[LIMIT N]

A、查询语句中,可以使用一个或者多个表,表之间使用逗号分割,并使用WHERE语句来设定查询条件;

B、SELECT 命令可以读取一条或者多条记录;

C、可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据;

D、可以使用 WHERE 语句来包含任何条件;

E、可以使用 LIMIT 属性来设定返回的记录数

11、WHERE用法

SELECT field1, field2,...fieldN FROM table_name1, table_name2
WHERE condition1 AND condition2

A、使用 AND 或者 OR 指定一个或多个条件;

B、WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令;

C、WHERE 子句类似于程序语言中的 if 条件;

12、UPDATE用法

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

A、可以同时更新一个或多个字段;

13、DELETE用法

DELETE FROM table_name [WHERE Clause]

A、如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除;

14、排序

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]

A、可以设定多个字段来排序;

B、可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列;

15、其他

UNION、LIKE、GROUP BY、JOIN、NULL、索引、临时表等等,更多用法可参考专业教程系统学习。

下一节《Python量化数据仓库搭建系列2:Python操作数据库》

1.注册登录

(1)在PC端打开恒有数金融数据社区(https://udata.hs.net) 网站主页,点击注册账号;

description

(2)使用手机号注册,设置密码,并勾选注册协议等;

description

(3)首页右上角,点击登录按钮,进入登录页面;

description

2.订阅服务(免费体验、领券下单)

(1)在数据页面,查看数据目录;

description

(2)在订阅页面,下单免费的体验套餐;

description

(3)在页面右侧,点击新人礼包,领取新人一折券(活动2021-12-31截止);

description

(4)使用一折券订阅套餐;

description

(5)在页面右上角,点击查看订阅信息

description

description

3.在线取数

(1)在数据页面,点击预览或页面右侧在线预览

description

(2)在页面中,填写查询条件,点击查询即可查看数据,点击导出即可下载数据

description

4.接口取数

(1)在页面右上角,点击进入总览页面,获取Token;

description

(2)参考帮助文档或者数据页面接口文档中代码示例,将示例中的Token替换为自己的Toekn,使用数据接口获取数据;

description

更多产品使用教程详见https://udata.hs.net/help/195

恒有数(UData)产品介绍

1. 恒生电子公司介绍

恒生电子是一家以“让金融变简单”为使命的金融科技公司,总部位于中国杭州。1995年成立,2003年在上海证券交易所主板上市(600570.SH)。恒生聚焦金融行业,致力于为证券、期货、基金、信托、保险、银行、交易所、私募等机构提供整体解决方案和服务。

恒生已连续13年入选FINTECH100全球金融科技百强榜单,2020年排名第40位。目前拥有超过9000名员工,其中研发人员占比约60%。多年来,恒生以技术服务为核心,凭借多年金融IT建设经验,以及对互联网的深刻洞察和理解,用优质的产品与服务,持续赋能金融机构创新发展。 同时,恒生还积极履行企业社会责任,在投资者教育、扶贫济困、关爱自闭症儿童等领域持续贡献力量,实现企业与社会共同可持续发展。

2. 恒有数产品介绍

2.1 产品简介

恒有数金融数据社区(https://udata.hs.net) ,源自恒生的金融数据开放和可视化社区,旨在为量化投资爱好者、金融从业人员、高校师生、政府机构和财经媒体等人群提供专业的金融数据服务,满足不同用户丰富多样的数据分析和投资研究需求。

恒有数提供涵盖股票、基金、债券、期权期货、港股等金融数据(数据目录见[附录1])。提供在线预览、在线下载和在线调试等功能,简单高效的API接口(接口语言包括HTTP、Python、MATLAB、Java),丰富的接口文档与帮助文档,使得用户可以方便快捷地获取数据。

未来,恒有数还会继续扩充专业数据,完善产品功能,不断提升服务能力。

2.2产品功能与应用场景介绍

2.2.1 产品功能与服务

(1)提供涵盖股票、基金、债券、期权期货、港股等品种的基本信息、市场数据、财务数据等,共计142个数据接口;提供多种数据接口语言,包括http、Python、MATLAB、Java;并提供详细的数据接口说明文档与各种语言的使用示例;

(2)提供在线化数据服务,包括在线预览、在线下载、在线调试,实现零代码获取数据;同时提供社区社群的在线服务,给用户提供及时专业的解答与帮助;

(3)提供金融基础知识、金融数据分析、数据挖掘等视频教程服务;

(4)计划提供在线可视化工具,包括图表模板库、在线画板、金融数据海报等;整合现有短视频编辑工具,并与金融数据接口联动,提供数据图表和数据海报的自动与订阅服务;

(5)计划提供因子库与衍生指标计算服务、策略开发与回测平台,并整合现有的模拟仿真平台,为用户提供一站式全流程的量化策略研究服务;

2.2.2 产品特点

(1)在线数据服务,登录即用;无需搭建本地数据库,无需下载数据到本地;

(2)不限次,不限量,不限调用次数,不限调用数据量;

(3)数据丰富,包含股票基金债券等全品种数据、基本面数据及行情数;

(4)持续更新,已包含全量30年历史数据,数据保持每日更新;

(5)取数便捷,支持在线预览、下载和在线调试,提供简单高效的API接口;

(6)支持多种语言,接口支持http、Python、MATLAB、Java语言;

(7)保障稳定不宕机,专业团队,专人维护,实时响应;

2.2.3 适用人群与场景

(1)量化开发者,量化基础学习、策略研究、指标定制、策略开发和回测、模拟仿真等;

(2)金融从业者,金融数据分析,研究报告等;

(3)高校师生,财经相关课程学习与实践,金融基础知识、Python金融数据分析、金融工程等课程学习;财经类课程的课程设计、课题研究与论文撰写等;

(4)财经媒体,金融数据报道,数据图表和短视频制作;

(5)泛金融爱好者,了解金融市场基础知识;

2.2订阅与合作

2.3.1 个人订阅

​ 个人用户,可以通过恒有数官网(https://udata.hs.net),在订阅页面选择适当的套餐进行订阅(目前有新人礼包活动,限时领取1折券)。各套餐定价(单位:元)见下表:

description

注:金融数据和A股数据产品中,包含期权期货和债券相关数据;

2.3.2 高校合作

​ 高校客户,可通过网页中的在线客服联系商务,进行洽谈。

(1)对接方式

如下图所示:

description

高校提供校园网IP等信息,并确定采购数据范围、使用权限及总并发性能。高校只需将恒有数产品简介、使用方法与网址链接,放置在图书馆电子资源目录即可。不需要安排专门的老师管理分发账号;在校师生可按实际需要,注册账号使用数据,不限账户数。

我们将校园网IP加入恒有数网关白名单,配置该IP对应的数据范围、使用权限与总并发性能;完成开发、测试与交付流程。

(2)师生取数用数

教师或学生在恒有数网页注册账号并登录网站,在个人总览页面获取Token;按照数据页面的说明文档与帮助页面的取数教程,获取对应的金融数据。

当教师或学生所处的网络环境是校园网环境,使用恒有数数据接口时,该账号将会享有对应高校所购置的数据权限与性能。当网络环境处于非校园网时,教师或学生使用恒有数的流程与普通用户流,需要自行下单订阅,来获取数据权限。

教师和学生还可以加入恒有数社区社群。师生在取数用数过程中遇到问题或疑问,可以通过发帖、发消息联系我们工作人员,我们将会及时提供专业答复。

2.3.3 公司机构

公司机构用户,可通过网页中的在线客服联系商务,进行洽谈。

对接方式:可参考高校合作对接方式,亦可依据实际使用场景与需求进行深入商谈;

3. 使用流程介绍

3.1 操作步骤

description

(1)在恒有数主页(https://udata.hs.net) 完成注册登录,可用手机号或微信进行注册登录;

(2)订阅页面提供多品种产品、多种时长可供选择,下单订阅后对应数据权限随即开通;

(3)获取数据的方式有数据预览页面在线下载与高效的API数据接口,接口支持Python、MATLAB、Java、HTTP共4种语言;

3.2 编程环境的安装

(1)在线下载,无需安装编程环境,在恒有数网页预览页面即可在线下载数据;

(2)Python语言,安装3.0以上版本的Python;安装函数包pandas、PyYAML、requests;

(3)MATLAB语言,安装MATLAB 2012a或更高版本;

(4)Java语言,安装Java1.8环境,配置maven与commons;

(5)Http接口,安装Postman接口调试软件;或者其他可调试http接口的环境;

3.3 使用流程

3.3.1 Python语言

(1)安装3.0以上版本的Python,按需求安装IDE软件;(详细配置步骤,见附录2)

(2)安装基础函数包pandas、PyYAML、requests;

(3)安装恒有数函数包hs_udata;

(4)在数据接口页面,获取接口名称、请求参数及Python代码示例;编写脚本并执行;

注:使用教程见https://udata.hs.net/help/294;

3.3.2 MATLAB语言

(1)安装2012a或更高版本的MATLAB软件;

(2)在MATLAB中,配置hs_udata工具箱;

(3)在数据接口页面,获取接口名称、请求参数及MATLAB代码示例;编写脚本并执行;

注:使用教程见https://udata.hs.net/help/303;

3.3.3 Java语言

(1)安装Java1.8环境;

(2)配置hs_udata-SDK包;

(3)在数据接口页面,获取接口名称、请求参数及Java代码示例;编写脚本并执行;

注:使用教程见https://udata.hs.net/help/304;

3.3.4 http接口

(1)新建GET或POST请求;

(2)设置请求方式和URL地址,参考数据页面http示例代码;

(3)在Headers中设置Token;在Params中设置输入参数;

(4)点击Send发送请求;

注:使用教程见https://udata.hs.net/help/293;

4. 数据接口使用范例

(1)交易日历(trading_calendar)

description

Python语言示例:

from hs_udata import set_token,trading_calendar
set_token(token = 'xxxxxxxxxxxxxxxxxx')
data = trading_calendar(secu_market=’83’)
print(data.head())

该示例表示,获取沪深证券交易所近1年的交易日历数据,并打印前5行数据;

(2) 股票列表(stock_list)

description

Python语言示例:

from hs_udata import set_token,stock_list
set_token(token = 'xxxxxxxxxxxxxxxxxx')
data = stock_list()
print(data.head())

(3) 股票分钟行情(stock_quote_minutes)

description

Python语言示例:

from hs_udata import set_token,stock_quote_minutes
set_token(token = 'xxxxxxxxxxxxxxxxxx')
data = stock_quote_minutes(en_prod_code="000001.SZ",
                          begin_date="20210805",end_date="20210809")
print(data.head())

该示例表示,获取000001.SZ股票,20210805至20210809的分钟行情数据,并打印前5行数据;

(4) 期权资料(fut_basic)

description

Python语言示例:

from hs_udata import set_token, fut_basic 
set_token(token = 'xxxxxxxxxxxxxxxxxx')
data = fut_basic()
print(data.head())

该示例表示,获取全部期权合约数据,并打印前5行数据;
(5) 期货盘后分钟切片(fut_quote_minute)

description

Python语言示例:

from hs_udata import set_token, fut_quote_minute
set_token(token = 'xxxxxxxxxxxxxxxxxx')
data = fut_quote_minute(en_prod_code=’SC2009.INE’, begin_date=’2021-05-15’, end_date=’2021-05-20’)
print(data.head())

该示例表示,获取期货合约’SC2009.INE’,在2021-05-15~2021-05-20时间范围内分钟行情数据,并打印前5行数据;

(更多数据接口使用说明,见网站数据页面:https://udata.hs.net/datas/202

5. 联系我们

(1)公众号与社群

网站首页底部二维码与群号:

description

直接扫码关注、进群:

description

(2)在线客服

网站点击右侧“智能客服”标志,即可在线咨询相关问题。

如图所示:

description

(3)联系方式

电话:0571-26695555-7

邮箱:gtn@hundsun.com

地址:浙江省杭州市滨江区江南大道3588号恒生大厦

附录

附录1:数据接口目录

编号 一级目录 二级目录 数据名称 接口名称
1 1.A股数据 1.1基础数据 1.1.1 股票列表 stock_list
2 1.A股数据 1.1基础数据 1.1.2 交易日历 trading_calendar
3 1.A股数据 1.1基础数据 1.1.3 上市新股 ipo_list
4 1.A股数据 1.1基础数据 1.1.4 公司简介 company_profile
5 1.A股数据 1.1基础数据 1.1.5 股票简介 stock_Info
6 1.A股数据 1.1基础数据 1.1.6 高管简介 leader_profile
7 1.A股数据 1.1基础数据 1.1.7 ST股票列表 st_stock_list
8 1.A股数据 1.1基础数据 1.1.8 沪深港通成分股 shszhk_stock_list
9 1.A股数据 1.2市场行情 1.2.1 股票日行情 stock_quote_daily
10 1.A股数据 1.2市场行情 1.2.2 股票周行情 stock_quote_weekly
11 1.A股数据 1.2市场行情 1.2.3 股票月行情 stock_quote_monthly
12 1.A股数据 1.2市场行情 1.2.4 股票年行情 stock_quote_yearly
13 1.A股数据 1.2市场行情 1.2.5 资金流向 money_flow
14 1.A股数据 1.2市场行情 1.2.6 停牌列表 suspension_list
15 1.A股数据 1.2市场行情 1.2.7 十大股东 shareholder_top10
16 1.A股数据 1.2市场行情 1.2.8 十大流通股东 float_shareholder_top10
17 1.A股数据 1.2市场行情 1.2.9 每日龙虎榜 lh_daily
18 1.A股数据 1.2市场行情 1.2.10 个股龙虎榜 lh_stock
19 1.A股数据 1.2市场行情 1.2.11 分钟行情 stock_quote_minutes
20 1.A股数据 1.2市场行情 1.2.12 沪深港通资金流 shszhk_capitalflow
21 1.A股数据 1.2市场行情 1.2.13 沪深港通十大成交股 shszhk_deal_top10
22 1.A股数据 1.2市场行情 1.2.14 沪深港通涨跌分布 shszhk_distribution
23 1.A股数据 1.2市场行情 1.2.15 沪深港通十大涨幅股 shszhk_change_top10
24 1.A股数据 1.2市场行情 1.2.16 股票代码列表(用于行情查询) quote_stocklist
25 1.A股数据 1.3市场数据 1.3.1 行业分类 Industry_category
26 1.A股数据 1.3市场数据 1.3.2 指数成分股 Index_constituent
27 1.A股数据 1.3市场数据 1.3.3 机构持仓 org_hold
28 1.A股数据 1.3市场数据 1.3.4 股东数量 holder_num
29 1.A股数据 1.3市场数据 1.3.5 限售解禁流通时间表 restricted_schedule
30 1.A股数据 1.3市场数据 1.3.6 股东股权质押 holder_pledge
31 1.A股数据 1.3市场数据 1.3.7 股东增减持 holder_Increase
32 1.A股数据 1.3市场数据 1.3.8 股票质押式回购 pledge_repo
33 1.A股数据 1.3市场数据 1.3.9 个股股权质押 stock_pledge
34 1.A股数据 1.3市场数据 1.3.10 大宗交易 block_trade
35 1.A股数据 1.3市场数据 1.3.11 融资融券 margin_trading
36 1.A股数据 1.3市场数据 1.3.12 融资融券区间统计 interval_margin_trading
37 1.A股数据 1.3市场数据 1.3.13 融资融券交易历史明细 margin_trade_detail
38 1.A股数据 1.3市场数据 1.3.14 融资融券交易总量历史查询 margin_trade_total
39 1.A股数据 1.3市场数据 1.3.15 股票分红 stock_dividend
40 1.A股数据 1.3市场数据 1.3.16 股票增发 stock_additional
41 1.A股数据 1.3市场数据 1.3.17 上市以来增发统计 stock_additional_all
42 1.A股数据 1.3市场数据 1.3.18 股票配股 stock_allotment
43 1.A股数据 1.3市场数据 1.3.19 业绩预增列表 stock_asforecastabb
44 1.A股数据 1.3市场数据 1.3.20 首次减持计划列表 stock_asunderweight
45 1.A股数据 1.3市场数据 1.3.21 首次增持计划列表 stock_asoverweight
46 1.A股数据 1.3市场数据 1.3.22 股权转让列表 stock_asrighttransfer
47 1.A股数据 1.3市场数据 1.3.23 举牌列表 stock_asraising
48 1.A股数据 1.4财务数据 1.4.1 预约披露日 schedule_disclosure
49 1.A股数据 1.4财务数据 1.4.2 股票关键指标 stock_key_indicator
50 1.A股数据 1.4财务数据 1.4.3 报告期会计数据 accounting_data
51 1.A股数据 1.4财务数据 1.4.4 现金流量表 financial_cashflow
52 1.A股数据 1.4财务数据 1.4.5 利润表 financial_income
53 1.A股数据 1.4财务数据 1.4.6 资产负债表 financial_balance
54 1.A股数据 1.4财务数据 1.4.7 利润表-一般企业(单季) financial_gene_qincome
55 1.A股数据 1.4财务数据 1.4.8 利润表-商业银行(单季) financial_bank_qincome
56 1.A股数据 1.4财务数据 1.4.9 利润表-证券公司(单季) financial_secu_qincome
57 1.A股数据 1.4财务数据 1.4.10 利润表-保险公司(单季) financial_insu_qincome
58 1.A股数据 1.4财务数据 1.4.11 现金流量表-一般企业(单季) financial_gene_qcashflow
59 1.A股数据 1.4财务数据 1.4.12 现金流量表-商业银行(单季) financial_bank_qcashflow
60 1.A股数据 1.4财务数据 1.4.13 现金流量表-证券公司(单季) financial_secu_qcashflow
61 1.A股数据 1.4财务数据 1.4.14 现金流量表-保险公司(单季) financial_insu_qcashflow
62 1.A股数据 1.4财务数据 1.4.15 上市公司业绩预告 performance_forecast
63 1.A股数据 1.4财务数据 1.4.16 上市公司业绩快报 performance_letters
64 1.A股数据 1.4财务数据 1.4.17 上市公司业绩快报(单季) performance_letters_q
65 1.A股数据 1.4财务数据 1.4.18 主营业务构成 main_composition
66 1.A股数据 1.4财务数据 1.4.19 主要客户及供应商 trading_parties
67 1.A股数据 1.4财务数据 1.4.20 公司历年审计意见 audit_opinion
68 1.A股数据 1.4财务数据 1.4.21 公司每股指标 per_share_index
69 1.A股数据 1.4财务数据 1.4.22 公司盈利能力 profitability
70 1.A股数据 1.4财务数据 1.4.23 公司成长能力(同比) growth_capacity
71 1.A股数据 1.4财务数据 1.4.24 公司杜邦分析 du_pont_analysis
72 1.A股数据 1.4财务数据 1.4.25 衍生财务指标 deri_fin_indicators
73 1.A股数据 1.4财务数据 1.4.26 单季度财务指标 q_financial_indicator
74 1.A股数据 1.4财务数据 1.4.27 估值基本信息 valuation_info
75 1.A股数据 1.4财务数据 1.4.28 企业价值 corporation_value
76 1.A股数据 1.5科创板 1.5.1 科创板IPO申报列表 star_ipodeclare
77 1.A股数据 1.5科创板 1.5.2 科创板公司概况 star_companyprofile
78 1.A股数据 1.6新三板 1.6.1 新三板股票基本信息 neeq_basic
79 1.A股数据 1.6新三板 1.6.2 新三板公司基本信息 neeq_company
80 1.A股数据 1.6新三板 1.6.3 新三板管理层任职 neeq_leader
81 1.A股数据 1.6新三板 1.6.4 新三板高管层成员数量 neeq_leader_num
82 1.A股数据 1.6新三板 1.6.5 新三板公司行业划分 neeq_industry
83 2.基金数据 2.1基本数据 2.1.1 基金列表 fund_list
84 2.基金数据 2.1基本数据 2.1.2 基金管理人 fund_manager_company
85 2.基金数据 2.1基本数据 2.1.3 基金经理 fund_manager
86 2.基金数据 2.1基本数据 2.1.4 基金概况 fund_profile
87 2.基金数据 2.1基本数据 2.1.5 相关机构 fund_institutions
88 2.基金数据 2.1基本数据 2.1.6 ETF基本资料 fund_etf
89 2.基金数据 2.1基本数据 2.1.7 基金规模 fund_size
90 2.基金数据 2.1基本数据 2.1.8 基金费率 fund_charge_rate
91 2.基金数据 2.1基本数据 2.1.9 上市指标 fund__index
92 2.基金数据 2.1基本数据 2.1.10 基金分类 fund_type
93 2.基金数据 2.1基本数据 2.1.11 所属风格 fund_style
94 2.基金数据 2.1基本数据 2.1.12 公募基金持有人 fund_holder
95 2.基金数据 2.2基金行情 2..2.1 基金日行情历史数据 fund_quote_daily_history
96 2.基金数据 2.2基金行情 2..2.2 基金日行情 fund_quote_daily
97 2.基金数据 2.2基金行情 2..2.3 基金周行情 fund_quote_weekly
98 2.基金数据 2.2基金行情 2..2.4 基金月行情 fund_quote_monthly
99 2.基金数据 2.2基金行情 2..2.5 基金年行情 fund_quote_yearly
100 2.基金数据 2.2基金行情 2..2.6 基金净值指标 fund_net_value
101 2.基金数据 2.2基金行情 2..2.7 货币基金收益 moneyfund_performance
102 2.基金数据 2.2基金行情 2..2.8 股票投资明细 fund_stock_detail
103 2.基金数据 2.2基金行情 2..2.9 资产配置 fund_asset
104 2.基金数据 2.2基金行情 2..2.10 持有人结构 fund_holder
105 2.基金数据 2.2基金行情 2..2.11 基金区间涨幅 fund_rangerise
106 2.基金数据 2.2基金行情 2..2.12 基金同类排名 fund_rank
107 3.期权期货 3.1期权期货 3.1.1 期权资料 fut_basic
108 3.期权期货 3.1期权期货 3.1.2 期货盘后分钟切片 fut_quote_minute
109 3.期权期货 3.1期权期货 3.1.3 期货代码列表 fut_list
110 3.期权期货 3.1期权期货 3.1.4 股指期货日多空占比 fut_count_rank
111 3.期权期货 3.1期权期货 3.1.5 期货实际合约持仓龙虎榜 fut_holding_lh
112 3.期权期货 3.1期权期货 3.1.6 期货合约品种 fut_contract_type
113 4.债券数据 4.1债券数据 4.1.1 可转债转股价格变动 con_price
114 4.债券数据 4.1债券数据 4.1.2 可转债转股时间提示 con_time
115 4.债券数据 4.1债券数据 4.1.3 可转债详情 con_detail
116 4.债券数据 4.1债券数据 4.1.4 可转债日历 con_calender
117 5.港股数据 5.1基础数据 5.1.1 港股上市列表 hk_list
118 5.港股数据 5.1基础数据 5.1.2 港股IPO hk_ipo
119 5.港股数据 5.1基础数据 5.1.3 港股公司基本资料 hk_company
120 5.港股数据 5.1基础数据 5.1.4 港股股票基本信息 hk_secu
121 5.港股数据 5.1基础数据 5.1.5 港股管理层任职 hk_leader
122 5.港股数据 5.2行情数据 5.2.1 港股日行情 hk_daily_quote
123 5.港股数据 5.2行情数据 5.2.2 港股周行情 hk_weekly_quote
124 5.港股数据 5.2行情数据 5.2.3 港股月行情 hk_monthly_quote
125 5.港股数据 5.2行情数据 5.2.4 港股年行情 hk_yearly_quote
126 5.港股数据 5.2行情数据 5.2.5 港股区间行情 hk_section_quote
127 5.港股数据 5.2行情数据 5.2.6 港股日行情卖空成交指标 hk_daily_quote_short
128 5.港股数据 5.2行情数据 5.2.7 港股周行情卖空成交指标 hk_weekly_quote_short
129 5.港股数据 5.2行情数据 5.2.8 港股月行情卖空成交指标 hk_monthly_quote_short
130 5.港股数据 5.2行情数据 5.2.9 港股年行情卖空成交指标 hk_yearly_quote_short
131 5.港股数据 5.2行情数据 5.2.10 港股区间行情卖空指标 hk_section_quote_short
132 5.港股数据 5.2行情数据 5.2.11 港股通切片代码列表 hk_minutes_hkscclist
133 5.港股数据 5.2行情数据 5.2.12 港股通盘后分钟切片 hk_minutes_hkscc
134 5.港股数据 5.3市场数据 5.3.1 港股股本 hk_share_stru
135 5.港股数据 5.3市场数据 5.3.2 港股公司行业分类 hk_exgindustry
136 5.港股数据 5.3市场数据 5.3.3 港股资本结构 hk_cap_structure
137 5.港股数据 5.3市场数据 5.3.4 港股盈利能力 hk_profit_ability
138 5.港股数据 5.3市场数据 5.3.5 港股每股指标 hk_per_share_index
139 5.港股数据 5.3市场数据 5.3.6 港股偿债能力 hk_solvency
140 5.港股数据 5.3市场数据 5.3.7 港股主营收入构成 hk_mainincomestru
141 5.港股数据 5.3市场数据 5.3.8 港股分红 hk_dividend
142 5.港股数据 5.3市场数据 5.3.9 港股回购 hk_buyback

附录2:使用教程与环境配置

注册流程:https://udata.hs.net/help/206

获取Token:https://udata.hs.net/help/292

HTTP接口教程:https://udata.hs.net/help/293

Python安装教程:https://udata.hs.net/help/636

Python取数教程:https://udata.hs.net/help/294

MATLAB取数教程:https://udata.hs.net/help/303

Java取数教程:https://udata.hs.net/help/304

函数包下载:https://udata.hs.net/help/639

恒有数(https://udata.hs.net/home?channel_source=vnpy

运行环境

(1)配置Java1.8环境,安装jdk软件,下载地址为:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html;

(2)安装IDE,下载地址为:https://www.jetbrains.com/idea/download/#section=windows;

(3)配置maven,下载地址为:http://maven.apache.org/download.cgi;

(4)配置commons,下载地址为:https://commons.apache.org/;

(5)下载恒有数Java SDK文件,下载地址为:https://udata.hs.net/data/udata/udata-static/help/hs_udata-java-sdk.rar ,并完成相关配置;

使用步骤

(1)登录平台,获取Token;详细步骤见获取Token;

(2)在数据页面,获取接口名称、请求参数,并查看返回参数及代码示例;

(3)编写Java脚本文件,并执行,如下所示:

import com.hundsun.UdataRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class UdataTest {
  public static void main(String[] args) throws IOException {
      String appToken = "xxxxxxxxxxxxxxxxxx";
      String url = "https://udata.hs.net/udata/business/v1/app_services/basic_data/trading_calendar";
      Map<String, Object> mapParam = new HashMap<>(12);
      mapParam.put("secu_market","72");
      String resultGet = UdataRequest.sendGet(appToken, url, mapParam);
      String resultPost = UdataRequest.sendPost(appToken, url, mapParam);
}
}

恒有数(https://udata.hs.net/home?channel_source=vnpy

运行环境

(1)安装2012a以上版本的MATLAB,官网为:https://www.mathworks.com/;

(2)下载恒有数MATLAB工具箱:https://udata.hs.net/data/udata/udata-static/help/hs_udata-MATLAB.rar;

(3)文件解压后,放置到软件安装目录下\toolbox文件夹;执行hs_udata_setup.m文件,进行工具箱安装;

使用步骤

(1)登录平台,获取Token;详细步骤见获取Token;

(2)在数据页面,获取接口名称、请求参数,并查看返回参数及代码示例;

(3)编写MATLAB脚本文件,并执行,如下所示:

clc;clear;close all;
% 设置Token
appToken = "xxxxxxxxxxxxxxxxxx";
% 设置URL
url = "https://udata.hs.net/udata/business/v1/app_services/basic_data/stock_list";
% 设置入参
Params.fields = "secu_abbr,listed_state,secu_market";
Params.listed_state = "1";
% 调用GET请求方法
[Get_Data,Get_error_code,Get_error_info] = hs_udata.sendGet(url,appToken,Params);
% 调用POST请求方法
[Post_data,Post_error_code,Post_error_info] = hs_udata.sendPost(url,appToken,Params);

数据导出

将数据导出为Excel文件

在上述代码最后,添加代码

# 写出Excel文件
xlswrite('Get_Data.xlsx', [fieldnames(Get_Data) struct2cell(Get_Data)]);
xlswrite('Post_data.xlsx', [fieldnames(Post_data) struct2cell(Post_data)]);

恒有数(https://udata.hs.net/home?channel_source=vnpy

运行环境

(1)安装3.0以上版本的python,下载地址为:https://www.python.org/downloads/;

(2)按需求安装Python IDE,如PyCharm、Jupyter等;

(3)安装基础函数包pandas、PyYAML、requests(安装方法见python使用教程);

(4)安装函数包hs_udata:

(a)使用命令行安装:pip install hs_udata

(b)whl文件安装,下载地址为:https://udata.hs.net/data/udata/udata-static/help/hs_udata-Python%20SDK.rar ;(安装方法见python使用教程)

使用步骤

(1)登录平台,获取Token;详细步骤见获取Token;

(2)在数据页面,获取接口名称、请求参数,并查看返回参数及代码示例;

(3)编写python脚本,并执行,如下所示:

from hs_udata import set_token,stock_list        # 引入hs_udata模块中set_token和stock_list
set_token(token = 'xxxxxxxxxxxxxxxxxx')        # 设置Token
data = stock_list()                            # 获取 股票列表数据,返回格式为dataframe
print(data.head())                                # 打印数据前5行
secu_abbr       chi_name listed_state ... secu_market listed_sector   hs_code
0     平安银行     平安银行股份有限公司 上市 ...     深圳证券交易所           主板 000001.SZ
1     万 科A     万科企业股份有限公司 上市 ...     深圳证券交易所           主板 000002.SZ
2     PT金田A 金田实业(集团)股份有限公司 终止 ...     深圳证券交易所           主板 000003.SZ
3     国华网安 深圳国华网安科技股份有限公司 上市 ...     深圳证券交易所           主板 000004.SZ
4   ST 星 源   深圳世纪星源股份有限公司 上市 ...     深圳证券交易所           主板 000005.SZ

数据导出

将数据导出为Excel、CSV、TXT文件

a、安装函数包openpyxl

b、在上述代码最后,添加代码

data.to_excel('股票列表.xlsx')                               # 写出Excel文件
data.to_csv('股票列表.csv',sep=',',encoding='utf_8_sig')     # 写出CSV文件
data.to_csv('股票列表.txt',sep=' ',encoding='utf_8_sig')     # 写出TXT文件

账号注册
(1)点击恒有数(https://udata.hs.net/home?channel_source=vnpy ) 首页右上角的登录|注册按钮,可进入用户登录和用户注册页面。

description

(2)点击恒有数页面右上方的注册按钮,进入LIGHT云平台的注册页面。

description

(3)仔细阅读《用户注册协议》和《隐私政策声明》后,输入手机号、短信验证码并设置账号密码,勾选同意《用户注册协议》和《隐私政策声明》,完成LIGHT云账号的注册。

(4)账号注册成功后,即可使用LIGHT云账号在恒有数的登录页面进行登录。

账号登录

(1)点击恒有数页面右上方的登录按钮,进入LIGHT云平台的登录页面。

description

(a)使用账号密码登录

填写您注册时的手机号、密码及验证码,点击【登录】按钮。

description

(b)使用手机验证码登录

填写您注册时的手机号以及短信验证码,点击【登录】按钮。

description

(2)登录成功后,打开总览页面获取Token来获取数据。

description

忘记密码

(1)点击LIGHT云登录页面右下角【忘记密码】按钮。

description

(2)按页面提示信息输入手机号或邮箱找回密码。

description

(3)通过手机号验证:输入新密码及手机校验码,即可完成新密码的设置

(4)通过电子邮箱验证:验证邮件已发往邮箱,进入邮箱点击链接完成验证,验证成功后输入新密码,即可完成新密码的设置

description

恒有数(https://udata.hs.net/home?channel_source=vnpy

安装包下载

在官网,选择对应操作系统及版本

例如:在64位Windows环境下安装Python 3.9.5

a、打开官网安装包下载地址:https://www.python.org/downloads/

b、点击Windows,进入该环境的下载详情页,在页面中点击 Windows installer (64-bit) 进行下载;

或者

a、打开官网安装包下载地址:https://www.python.org/downloads/

b、在页面下方点击 Python 3.9.5,进入该版本详情页,在页面下方点击Windows installer (64-bit)进行下载;

注:恒有数金融数据社区Python SDK是基于3.x版本环境开发的,需要用户安装3.x版本的软件;

软件安装(Windows环境)

a、双击运行安装包,注意勾选 Add Python 3.x to PATH;

b、按提示与具体需要修改安装设置,直至完成安装;

Python IDE安装(集成开发环境)

推荐使用PyCharm或者Jupyter,市面上还有很多优秀的IDE,大家可以按自己的习惯进行选择;

例如:

PyCharm:

下载地址:https://www.jetbrains.com/pycharm/download/#section=windows

可选择Community免费版

Anaconda:

下载地址:https://www.anaconda.com/products/individual

在页面最下方,选择对应的操作系统与版本;安装完成后,可打开Jupyter,进行使用;

库函数安装

在cmd环境中安装(Windows环境)

a、将python安装路径添加至系统环境变量(计算机—属性—高级系统设置—系统属性—环境变量—系统变量—Path—编辑—新建—输入python安装路径—确定),如果在安装时,勾选了Add Python 3.x to PATH,则无需此操作;

b、打开cmd命令框,输入:pip install 函数名

例如:安装pandas包

在cmd中,输入:pip install pandas

然后回车(点击enter键),即可完成安装

通过whl文件安装

a、下载函数包的whl安装文件,在https://pypi.org/中搜索并下载函数包的whl文件(也可选择其他第三方库);

b、将python安装路径添加至系统环境变量,操作过程与上述一致;

c、打开cmd命令框,输入:pip install 文件绝对路径

例如:安装hs_data包

在帮助文档《python取数教程》中,下载hs_data的whl安装文件,并放置在桌面,并获得文件的绝对路径为:C:\Users\admin\Desktop\hs_udata-0.1.0-py3-none-any.whl;(可通过选中文件,右击查看属性,获得文件位置的路径)

在cmd中,输入:pip install C:\Users\admin\Desktop\hs_udata-0.1.0-py3-none-any.whl

然后回车(点击enter键),即可完成安装

通过Python IDE进行安装

在PyCharm中,新建项目后,可通过File—Settings—Project Interpreter—点击加号“+”—搜索包的名称—选中需要安装的包及其版本,点击Install Package;

恒有数(https://udata.hs.net/home?channel_source=vnpy

HTTP协议简介

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口,HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回请求的文件、错误消息、或者其它信息。

可以通过Postman软件,简单快速实现http取数,也可生成各类编程语言的取数代码。

Postman实现http接口取数

Postman是一款非常流行的API调试工具,简单方便,而且功能强大。

Postman安装包下载地址为https://www.getpostman.com/apps ,支持MAC、Windows和Linux。

Postman的取数过程:

(1)新建请求;

(2)设置请求方式和URL地址(支持GET和POST请求);

(3)在Headers中设置token;在Params中设置输入参数;

(4)点击Send发送请求;

description

编程语言实现http接口取数

可以使用Postman自动生成各种编写语言调用http接口的代码,包括Python、Java、C、PHP、Shell等等

description

description

例如:Python - http.client

import http.client
​
conn = http.client.HTTPSConnection("udata.sit.hs.net")
payload = ''
headers = {
 'Application-Token': 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'
}
conn.request("GET", "/light_data/business/v1/app_services/juyuan_basicdata/stock_list?secu_market=83", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

例如: JavaScript - Fetch

var myHeaders = new Headers();
myHeaders.append("Application-Token", "xxxxxxxxxxxxxxxxxxxxxxxxxxx");
​
var requestOptions = {
 method: 'GET',
 headers: myHeaders,
 redirect: 'follow'
};
​
fetch("https://udata.sit.hs.net/light_data/business/v1/app_services/juyuan_basicdata/stock_list?secu_market=83", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】