从MySQL中读取股票数据——从零到实盘10

前文介绍了把股票数据写入MySQL的过程,本文记录从MySQL中读取股票数据的过程。

到目前为止,我们在访问股票代码列表时,每次需要通过BaoStock重新下载。本文将把下载的股票代码保存到MySQL中,在后续访问股票列表时,就可以通过MySQL读取股票代码数据,从而避免每次都要重新下载代码列表,也以此来演示从MySQL中读取数据的过程。

主要代码分析

新建源文件,命名为data_center_v8.py,全部内容见文末,v8主要修改了函数get_stock_codes:

def get_stock_codes(date=None, update=False):

该函数用于获取指定日期的A股代码列表,其中:

  • 参数date为日期,默认为None
  • 参数update为是否更新股票列表,默认为False
  • 返回值为A股代码的列表

不同的参数设置,会有3种情况:

  • 若参数update为False,表示从数据库中读取股票列表
  • 若数据库中不存在股票列表的表,或者update为True,则下载指定日期date的交易股票列表
  • 若参数date为空,则返回最近1个交易日的A股代码列表
  • 若参数date不为空,且为交易日,则返回date当日的A股代码列表
  • 若参数date不为空,但不为交易日,则打印提示非交易日信息,程序退出

综上,在默认参数条件下:

  • 若程序是第一次运行,则下载最近1个交易的A股代码列表,并保存在数据库中
  • 若程序不是第一次运行,则会从数据库中读取A股列表
    engine = create_mysql_engine()

创建数据库引擎对象,用判断表是否存在及读写表数据。

    table_name = 'stock_codes'

数据库中股票代码的表名。

    if table_name not in sqlalchemy.inspect(engine).get_table_names() or update:

数据库中不存在股票代码表,或者需要更新股票代码表。

        # 登录baostock
        bs.login()
        
        # 从BaoStock查询股票数据
        stock_df = bs.query_all_stock(date).get_data()
        
        # 如果获取数据长度为0,表示日期date非交易日
        if 0 == len(stock_df):
        
            # 如果设置了参数date,则打印信息提示date为非交易日
            if date is not None:
                print('当前选择日期为非交易日或尚无交易数据,请设置date为历史某交易日日期')
                sys.exit(0)
        
            # 未设置参数date,则向历史查找最近的交易日,当获取股票数据长度非0时,即找到最近交易日
            delta = 1
            while 0 == len(stock_df):
                stock_df = bs.query_all_stock(datetime.date.today() - datetime.timedelta(days=delta)).get_data()
                delta += 1
        
        # 注销登录
        bs.logout()
        
        # 筛选股票数据,上证和深证股票代码在sh.600000与sz.39900之间
        stock_df = stock_df[(stock_df['code'] >= 'sh.600000') & (stock_df['code'] < 'sz.399000')]

通过查询BaoStock更新股票列表代码,上面代码与v1内容相同,可参考v1分析内容

        stock_df.to_sql(name=table_name, con=engine, if_exists='replace', index=False, index_label=False)

调用DataFrame的to_sql方法将股票代码写入数据库。

        return stock_df['code'].tolist()

返回股票列表。

    else:

从数据库中读取股票代码列表。

        sql_cmd = 'SELECT {} FROM {}'.format('code', table_name)

待执行的sql语句。

        return pd.read_sql(sql=sql_cmd, con=engine)['code'].tolist()

调用read_sql方法,执行sql命令,并返回DataFrame。read_sql的参数sql表示要执行的sql命令, con表示创建的数据库连接,返回值的数据类型是DataFrame。下图展示了我们通过MySQL workbench查看的表stock_codes的内容。我们提取其中的code列,转化为list并返回。

小结

至此,我们完成了股票代码数据的数据库写入和读出功能,可以通过数据库读取股票代码,而不必每次都去BaoStock重新下载。

通过pandas的read_sql和to_sql方法,可以方便地完成DataFrame对MySQL的读写操作。

下一篇文章将记录从MySQL中读取日线及因子数据,并尝试对策略的胜率进行分析。


data_center_v8.py的全部代码如下:

import baostock as bs
import datetime
import sys
import numpy as np
import pandas as pd
import multiprocessing
import sqlalchemy

# 可用日线数量约束
g_available_days_limit = 250

# BaoStock日线数据字段
g_baostock_data_fields = 'date,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ, psTTM,pcfNcfTTM,isST'


def create_mysql_engine():
    """
    创建数据库引擎对象

    :return: 新创建的数据库引擎对象
    """

    # 引擎参数信息
    host = 'localhost'
    user = 'root'
    passwd = '111111'
    port = '3306'
    db = 'db_quant'

    # 创建数据库引擎对象
    mysql_engine = sqlalchemy.create_engine(
        'mysql+pymysql://{0}:{1}@{2}:{3}'.format(user, passwd, host, port),
        poolclass=sqlalchemy.pool.NullPool
    )

    # 如果不存在数据库db_quant则创建
    mysql_engine.execute("CREATE DATABASE IF NOT EXISTS {0} ".format(db))

    # 创建连接数据库db_quant的引擎对象
    db_engine = sqlalchemy.create_engine(
        'mysql+pymysql://{0}:{1}@{2}:{3}/{4}?charset=utf8'.format(user, passwd, host, port, db),
        poolclass=sqlalchemy.pool.NullPool
    )

    # 返回引擎对象
    return db_engine


def get_stock_codes(date=None, update=False):
    """
    获取指定日期的A股代码列表

    若参数update为False,表示从数据库中读取股票列表
    若数据库中不存在股票列表的表,或者update为True,则下载指定日期date的交易股票列表
    若参数date为空,则返回最近1个交易日的A股代码列表
    若参数date不为空,且为交易日,则返回date当日的A股代码列表
    若参数date不为空,但不为交易日,则打印提示非交易日信息,程序退出

    :param date: 日期,默认为None
    :param update: 是否更新股票列表,默认为False
    :return: A股代码的列表
    """

    # 创建数据库引擎对象
    engine = create_mysql_engine()

    # 数据库中股票代码的表名
    table_name = 'stock_codes'

    # 数据库中不存在股票代码表,或者需要更新股票代码表
    if table_name not in sqlalchemy.inspect(engine).get_table_names() or update:

        # 登录baostock
        bs.login()

        # 从BaoStock查询股票数据
        stock_df = bs.query_all_stock(date).get_data()

        # 如果获取数据长度为0,表示日期date非交易日
        if 0 == len(stock_df):

            # 如果设置了参数date,则打印信息提示date为非交易日
            if date is not None:
                print('当前选择日期为非交易日或尚无交易数据,请设置date为历史某交易日日期')
                sys.exit(0)

            # 未设置参数date,则向历史查找最近的交易日,当获取股票数据长度非0时,即找到最近交易日
            delta = 1
            while 0 == len(stock_df):
                stock_df = bs.query_all_stock(datetime.date.today() - datetime.timedelta(days=delta)).get_data()
                delta += 1

        # 注销登录
        bs.logout()

        # 筛选股票数据,上证和深证股票代码在sh.600000与sz.39900之间
        stock_df = stock_df[(stock_df['code'] >= 'sh.600000') & (stock_df['code'] < 'sz.399000')]

        # 将股票代码写入数据库
        stock_df.to_sql(name=table_name, con=engine, if_exists='replace', index=False, index_label=False)

        # 返回股票列表
        return stock_df['code'].tolist()

    # 从数据库中读取股票代码列表
    else:

        # 待执行的sql语句
        sql_cmd = 'SELECT {} FROM {}'.format('code', table_name)

        # 读取sql,返回股票列表
        return pd.read_sql(sql=sql_cmd, con=engine)['code'].tolist()


def create_data(stock_codes, from_date='1990-12-19', to_date=datetime.date.today().strftime('%Y-%m-%d'),
                adjustflag='2'):
    """
    下载指定日期内,指定股票的日线数据,计算扩展因子

    :param stock_codes: 待下载数据的股票代码
    :param from_date: 日线开始日期
    :param to_date: 日线结束日期
    :param adjustflag: 复权选项 1:后复权  2:前复权  3:不复权  默认为前复权
    :return: None
    """

    # 创建数据库引擎对象
    engine = create_mysql_engine()

    # 下载股票循环
    for code in stock_codes:
        print('正在下载{}...'.format(code))

        # 登录BaoStock
        bs.login()

        # 下载日线数据
        out_df = bs.query_history_k_data_plus(code, g_baostock_data_fields, start_date=from_date, end_date=to_date,
                                              frequency='d', adjustflag=adjustflag).get_data()

        # 剔除停盘数据
        if out_df.shape[0]:
            out_df = out_df[(out_df['volume'] != '0') & (out_df['volume'] != '')]

        # 如果数据为空,则不创建
        if not out_df.shape[0]:
            continue

        # 删除重复数据
        out_df.drop_duplicates(['date'], inplace=True)

        # 日线数据少于g_available_days_limit,则不创建
        if out_df.shape[0] < g_available_days_limit:
            continue

        # 将数值数据转为float型,便于后续处理
        convert_list = ['open', 'high', 'low', 'close', 'preclose', 'volume', 'amount', 'turn', 'pctChg']
        out_df[convert_list] = out_df[convert_list].astype(float)

        # 重置索引
        out_df.reset_index(drop=True, inplace=True)

        # 计算扩展因子
        out_df = extend_factor(out_df)

        # 写入数据库
        table_name = '{}_{}'.format(code[3:], code[:2])
        out_df.to_sql(name=table_name, con=engine, if_exists='replace', index=True, index_label='id')


def get_code_group(process_num, stock_codes):
    """
    获取代码分组,用于多进程计算,每个进程处理一组股票

    :param process_num: 进程数
    :param stock_codes: 待处理的股票代码
    :return: 分组后的股票代码列表,列表的每个元素为一组股票代码的列表
    """

    # 创建空的分组
    code_group = [[] for i in range(process_num)]

    # 按余数为每个分组分配股票
    for index, code in enumerate(stock_codes):
        code_group[index % process_num].append(code)

    return code_group


def multiprocessing_func(func, args):
    """
    多进程调用函数

    :param func: 函数名
    :param args: func的参数,类型为元组,第0个元素为进程数,第1个元素为股票代码列表
    :return: 包含各子进程返回对象的列表
    """

    # 用于保存各子进程返回对象的列表
    results = []

    # 创建进程池
    with multiprocessing.Pool(processes=args[0]) as pool:
        # 多进程异步计算
        for codes in get_code_group(args[0], args[1]):
            results.append(pool.apply_async(func, args=(codes, *args[2:],)))

        # 阻止后续任务提交到进程池
        pool.close()

        # 等待所有进程结束
        pool.join()

    return results


def create_data_mp(stock_codes, process_num=61,
                   from_date='1990-12-19', to_date=datetime.date.today().strftime('%Y-%m-%d'), adjustflag='2'):
    """
    使用多进程创建指定日期内,指定股票的日线数据,计算扩展因子

    :param stock_codes: 待创建数据的股票代码
    :param process_num: 进程数
    :param from_date: 日线开始日期
    :param to_date: 日线结束日期
    :param adjustflag: 复权选项 1:后复权  2:前复权  3:不复权  默认为前复权
    :return: None
    """

    multiprocessing_func(create_data, (process_num, stock_codes, from_date, to_date, adjustflag,))


def extend_factor(df):
    """
    计算扩展因子

    :param df: 待计算扩展因子的DataFrame
    :return: 包含扩展因子的DataFrame
    """

    # 使用pipe依次计算涨停、双神及是否为候选股票
    df = df.pipe(zt).pipe(ss, delta_days=30).pipe(candidate)

    return df


def zt(df):
    """
    计算涨停因子

    若涨停,则因子为True,否则为False
    以当日收盘价较前一日收盘价上涨9.8%及以上作为涨停判断标准

    :param df: 待计算扩展因子的DataFrame
    :return: 包含扩展因子的DataFrame
    """

    df['zt'] = np.where((df['close'].values >= 1.098 * df['preclose'].values), True, False)

    return df


def shift_i(df, factor_list, i, fill_value=0, suffix='a'):
    """
    计算移动因子,用于获取前i日或者后i日的因子

    :param df: 待计算扩展因子的DataFrame
    :param factor_list: 待移动的因子列表
    :param i: 移动的步数
    :param fill_value: 用于填充NA的值,默认为0
    :param suffix: 值为a(ago)时表示移动获得历史数据,用于计算指标;值为l(later)时表示获得未来数据,用于计算收益
    :return: 包含扩展因子的DataFrame
    """

    # 选取需要shift的列构成新的DataFrame,进行shift操作
    shift_df = df[factor_list].shift(i, fill_value=fill_value)

    # 对新的DataFrame列进行重命名
    shift_df.rename(columns={x: '{}_{}{}'.format(x, i, suffix) for x in factor_list}, inplace=True)

    # 将重命名后的DataFrame合并到原始DataFrame中
    df = pd.concat([df, shift_df], axis=1)

    return df


def shift_till_n(df, factor_list, n, fill_value=0, suffix='a'):
    """
    计算范围移动因子

    用于获取前/后n日内的相关因子,内部调用了shift_i

    :param df: 待计算扩展因子的DataFrame
    :param factor_list: 待移动的因子列表
    :param n: 移动的步数范围
    :param fill_value: 用于填充NA的值,默认为0
    :param suffix: 值为a(ago)时表示移动获得历史数据,用于计算指标;值为l(later)时表示获得未来数据,用于计算收益
    :return: 包含扩展因子的DataFrame
    """

    for i in range(n):
        df = shift_i(df, factor_list, i + 1, fill_value, suffix)
    return df


def ss(df, delta_days=30):
    """
    计算双神因子,即间隔的两个涨停

    若当日形成双神,则因子为True,否则为False

    :param df: 待计算扩展因子的DataFrame
    :param delta_days: 两根涨停间隔的时间不能超过该值,否则不判定为双神,默认值为30
    :return: 包含扩展因子的DataFrame
    """

    # 移动涨停因子,求取近delta_days天内的涨停情况,保存在一个临时DataFrame中
    temp_df = shift_till_n(df, ['zt'], delta_days, fill_value=False)

    # 生成列表,用于后续检索第2天前至第delta_days天前是否有涨停出现
    col_list = ['zt_{}a'.format(x) for x in range(2, delta_days + 1)]

    # 计算双神,需同时满足3个条件:
    # 1、第2天前至第delta_days天前,至少有1个涨停
    # 2、1天前不是涨停(否则就是连续涨停,不是间隔的涨停)
    # 3、当天是涨停
    df['ss'] = temp_df[col_list].any(axis=1) & ~temp_df['zt_1a'] & temp_df['zt']

    return df


def ma(df, n=5, factor='close'):
    """
    计算均线因子

    :param df: 待计算扩展因子的DataFrame
    :param n: 待计算均线的周期,默认计算5日均线
    :param factor: 待计算均线的因子,默认为收盘价
    :return: 包含扩展因子的DataFrame
    """

    # 均线名称,例如,收盘价的5日均线名称为ma_5,成交量的5日均线名称为volume_ma_5
    name = '{}ma_{}'.format('' if 'close' == factor else factor + '_', n)

    # 取待计算均线的因子列
    s = pd.Series(df[factor], name=name, index=df.index)

    # 利用rolling和mean计算均线数据
    s = s.rolling(center=False, window=n).mean()

    # 将均线数据添加到原始的DataFrame中
    df = df.join(s)

    # 均线数值保留两位小数
    df[name] = df[name].apply(lambda x: round(x + 0.001, 2))

    return df


def mas(df, ma_list=None, factor='close'):
    """
    计算多条均线因子,内部调用ma计算单条均线

    :param df: 待计算扩展因子的DataFrame
    :param ma_list: 待计算均线的周期列表,默认为None
    :param factor: 待计算均线的因子,默认为收盘价
    :return: 包含扩展因子的DataFrame
    """

    if ma_list is None:
        ma_list = []
    for i in ma_list:
        df = ma(df, i, factor)
    return df


def cross_mas(df, ma_list):
    """
    计算穿均线因子

    若当日最低价不高于均线价格
    且当日收盘价不低于均线价格
    则当日穿均线因子值为True,否则为False

    :param df: 待计算扩展因子的DataFrame
    :param ma_list: 均线的周期列表
    :return: 包含扩展因子的DataFrame
    """

    for i in ma_list:
        df['cross_{}'.format(i)] = (df['low'] <= df['ma_{}'.format(i)]) & (
                df['ma_{}'.format(i)] <= df['close'])
    return df


def candidate(df):
    """
    计算是否为候选

    若当日日线同时穿过5、10、20、30日均线
    且30日均线在60日均线上方
    且当日形成双神
    则当日作为候选,该因子值为True,否则为False

    :param df: 待计算扩展因子的DataFrame
    :return: 包含扩展因子的DataFrame
    """

    # 均线周期列表
    ma_list = [5, 10, 20, 30, 60]

    # 计算均线的因子,保存到临时的DataFrame中
    temp_df = mas(df, ma_list)

    # 计算穿多线的因子,保存到临时的DataFrame中
    temp_df = cross_mas(temp_df, ma_list)

    # 穿多线因子的列名列表
    column_list = ['cross_{}'.format(x) for x in ma_list[:-1]]

    # 计算是否为候选
    df['candidate'] = temp_df[column_list].all(axis=1) & (temp_df['ma_30'] >= temp_df['ma_60']) & df['ss']

    return df


if __name__ == '__main__':
    stock_codes = get_stock_codes()
    print(stock_codes)

博客内容只用于交流学习,不构成投资建议,盈亏自负!

个人博客:http://coderx.com.cn/(优先更新)
项目最新代码:https://gitee.com/sl/quant_from_scratch
欢迎大家转发、留言。有微信群用于学习交流,感兴趣的读者请扫码加微信!
如果认为博客对您有帮助,可以扫码进行捐赠,感谢!

微信二维码微信捐赠二维码
在这里插入图片描述在这里插入图片描述
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
适用于“大智慧新一代 Level-2 V3.03.08.0801 ”的版本。 附件:数据结构   ◎代码数据(cndm)结构 字段名 含义 类型 备注 dm 代码 char jc 简称 char ◎行情数据(cnfqhq)结构 字段名 含义 类型 备注 dm 代码 char rq 日期 date kp 开盘 num zg 最高 num zd 最低 num sp 收盘 num sl 成交数量 num je 成交金额 num yz 复权因子 num ◎除权数据(cncq)结构 字段名 含义 类型 备注 dm 代码 char rq 日期 date fh 分红 num sgbl 送股比例 num pgbl 配股比例 num pgjg 配股价格 num ◎股本数据(cngb)结构 字段名 含义 类型 备注 dm 代码 char rq 日期 date zgb 总股本 num ltg 流通A股 num bg B股 num hg H股 num ◎财务指标(cncw)结构 字段名 含义 类型 备注 dm 代码 char rq 日期 date eps 每股收益(全面摊薄) num eps1 每股收益(加权平均) num naps 每股净资产 num roe 净资产收益率(全面摊薄) num roe1 净资产收益率(加权平均) num ◎财务报(cncwbb)结构 字段名 含义 类型 备注 dm 代码 char rq 日期 date bsdqtzje 短期投资净额 num bsyszkje 应收帐款净额 num bschje 存货净额 num bsldzc 流动资产 num bscqtzje 长期投资净额 num bsgdzc 固定资产 num bswxzc 无形及其他资产 num bszzc 总资产 num bsdqjk 短期借款 num bsyfzk 应付帐款 num bsldfz 流动负债 num bscqfz 长期负债 num bsfz 负债合计 num bsgb 股本 num bsssgdqy 少数股东权益 num bsgdqy 股东权益 num bszbgj 资本公积 num bsyygj 盈余公积 num iszysr 主营业务收入净额 num iszycb 主营业务成本 num iszylr 主营业务利润 num isqtlr 其它业务利润 num isyyfy 营业费用 num isglfy 管理费用 num iscwfy 财务费用 num istzsy 投资收益 num islrze 利润总额 num issds 所得税 num isjlr 净利润 num iskchjlr 扣除经常性损益后的净利润 num iswfplr 未分配利润 num cfjyhdxjlr 经营活动现金流入 num cfjyhdxjlc 经营活动现金流出 num cfjyhdxjje 经营活动现金净额 num cftzxjlr 投资现金流入 num cftzxjlc 投资现金流出 num cftzxjje 投资现金净额 num cfczxjlr 筹措现金流入 num cfczxjlc 筹措现金流出 num cfczxjje 筹措现金净额 num cfxjjze 现金及现金等价物净增额 num cfxsspxj 销售商品收到的现金 num mgsy 每股收益 num mgjzc 每股净资产 num tzmgjzc 调整后每股净资产 num mgzbgjj 每股资本公积金 num mgwfplr 每股未分配利润 num mgjyxjllje 每股经营活动产生的现金流量净额 num mgxjzjje 每股现金及现金等价物增加净额 num mll 毛利率 num zyywlrl 主营业务利润率 num jll 净利率 num zzcbcl 总资产报酬率 num jzcsyl 净资产收益率 num xsxjzb 销售商品收到的现金占主营收入比例 num yszczzl 应收帐款周转率 num chzzl 存货周转率 num gdzczzl 固定资产周转率 num zyywzzl 主营业务增长率 num jlrzzl 净利润增长率 num zzczzl 总资产增长率 num jzczzl 净资产增长率 num ldbl 流动比率 num sdbl 速动比率 num zcfzbl 资产负债比率 num fzbl 负债比率 num gdqybl 股东权益比率 num gdzcbl 固定资产比率 num kchmgjlr 扣除经常性损益后每股净利润 num ◎交易日期(cnrq)结构 字段名 含义 类型 备注 rq 交易日期 date ◎板块数据(cnbk)结构 字段名 含义 类型 备注 lb 类别 char bk 板块 char dm 代码 char zz 创建者 char ◎存款利率(cnll)结构 字段名 含义 类型 备注 dm 代码 char jc 简称 char rq 变动日期 date ll 利率 num ◎港股代码(hkdm)结构 字段名 含义 类型 备注 dm 代码 char jc 简称 char ◎港股行情(hkhq)结构 字段名 含义 类型 备注 dm 代码 char rq 日期 date kp 开盘 num zg 最高 num zd 最低 num sp 收盘 num sl 成交数量 num je 成交金额 num FxjData2FinData程序有上千行 调用方法: /************************************************************************************* 使用说明: 1)调用格式:FxjData2FinData(Market,DataType,FinDataLib) 其, Market:市场代码,SH为沪市,SZ为深市,BK为板块指数,如果有其它市场数据,可有其它市场代码如HK等. DataType:数据类型,dm,cq,cw0,hq0,hq,等等,含义见下面注释 FinDataLib:目标逻辑库,如果给定的目标逻辑库不存在,则将设为Work 2)如果数据文件已经被分析家等软件占用导致无法打开时,将自动复制一份该文件,并从该备份文件读取数据. 3)程序将自动补充数据,即如果目标不存在,则建立并添加数据,如果目标已存在,则判断每只证券的最新 数据,然后只添加数据所缺少的数据. ***************************************************************************************/ /*请修改以下的参数*/ %let FxjPath=C:\fxj\;/*分析家安装目录*/ /*HqmbFilesToRead=分笔成交读取文件数.若为1则只读取report.dat, 若为值n,则除了读取Report.dat外还将读取(n-1)个最新.PRP历史分笔成交数据文件*/ %let HqmbFilesToRead=2; /*请确认要转换的数据,在下面语句的%后加*变为注释取消转换*/ /*沪市*/ %FxjData2FinData(sh,dm,FinData); /*dm--证券代码,原数据集将保存为xxDM_bak*/ %FxjData2FinData(sh,cq,FinData); /*cq--除权数据*/ %FxjData2FinData(sh,cw0,FinData); /*cw0--最新财务数据*/ %FxjData2FinData(sh,hq0,FinData); /*hq0--最新行情*/ %FxjData2FinData(sh,hq,FinData); /*hq--每日行情*/ %FxjData2FinData(sh,hqmb,FinData); /*hqmb--每笔成交*/ %FxjData2FinData(sh,hq5,FinData);/*hq5--5分钟行情*/ %FxjData2FinData(sh,fp,FinData);/*fp--分红送配(专业财务数据)*/ %FxjData2FinData(sh,gb,FinData);/*gb--股本结构(专业财务数据)*/ %FxjData2FinData(sh,cw,FinData);/*cw--财务数据(专业财务数据)*/ %FxjData2FinData(sh,gd,FinData);/*gd--十大股东(专业财务数据)*/ %FxjData2FinData(sh,jjjz,FinData);/*jjjz--基金净值(专业财务数据)*/ %FxjData2FinData(sh,jjzh,FinData);/*jjzh--基金投资组合(专业财务数据)*/ /*深市*/ %FxjData2FinData(sz,dm,FinData); %FxjData2FinData(sz,cq,FinData); %FxjData2FinData(sz,cw0,FinData); %FxjData2FinData(sz,hq0,FinData); %FxjData2FinData(sz,hq,FinData); %FxjData2FinData(sz,hqmb,FinData); %FxjData2FinData(sz,hq5,FinData); %FxjData2FinData(sz,fp,FinData); %FxjData2FinData(sz,gb,FinData); %FxjData2FinData(sz,cw,FinData); %FxjData2FinData(sz,gd,FinData); %FxjData2FinData(sz,jjjz,FinData); %FxjData2FinData(sz,jjzh,FinData); /*板块及板块指数*/ %FxjData2FinData(bk,zh,FinData);/*板块数据:Market=bk,DataType=zh,...*/ %FxjData2FinData(bk,dm,FinData); %FxjData2FinData(bk,hq0,FinData); %FxjData2FinData(bk,hq,FinData); %FxjData2FinData(bk,hqmb,FinData); %FxjData2FinData(bk,hq5,FinData); /*香港市场*/ %*FxjData2FinData(hk,dm,FinData); %*FxjData2FinData(hk,hq0,FinData); %*FxjData2FinData(hk,hq,FinData); %*FxjData2FinData(hk,hqmb,FinData); %*FxjData2FinData(hk,hq5,FinData); 大智慧新一代 2.08.07.0907 数据格式 作者:root 日期:2007-12-12 字体大小: 小 大 备忘 日线数据文件day.dat case DataTypes.hq: fileName = "DAY.DAT"; startAddress = 0x41000; blockSize = 8192; recordSize = 32; codeIsLong = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,date,4,1,0,;" + "kp,开盘,single,4,2,4,B;" + "zg,最高,single,4,3,8,B;" + "zd,最低,single,4,4,12,B;" + "sp,收盘,single,4,5,16,B;" + "sl,成交数量,single,4,6,20,A;"+ "je,成交金额,single,4,7,24,";    数据格式几乎与分析家相同 起止地址 数据内容 数据含义 数据类型 00 - 03 F4 9B 13 FC 文件标志 int 04 - 07 00 06 00 00 未知 int 08 - 0B 00 00 00 00 保留 int 0C - 0F 97 04 00 00 证券总数 int 10 - 13 00 18 00 00 未知 int需添加之起始块号 14 - 17 DB 17 00 00 未知 int当前最后空块号 18 - 21 31 41 30 30 30...FF 证券代码 byte[10] 22 - 25 B0 09 00 00 日线记录数 int 26 - 57 00 00 25 04...FF FF 记录块号 char[25] ...... 记录块开始于0x41000 41000 - 41003 80 47 B2 2B 日期 int 41004 - 41007 B9 1E 25 41 开盘价 float 41008 - 4100B CD CC 4C 41 最高价 float 4100C - 4100F EC 51 18 41 最低价 float 41010 - 41013 9A 99 41 41 收盘价 float 41014 - 41017 80 06 B2 47 成交量 float 41018 - 4101B 40 1C BC 4C 成交金额 float 4101C - 4101D 00 00 上涨家数 char 4101E - 4101F 00 00 下跌家数 char 注:    1)起止地址、数据内容为十六进制,数据类型为 Delphi 下之定义。    2)从18h开始至40017h每64byte为一条股票数据分配记录,含义如上18h - 57h所示;    3)从41000h开始每8KB为一股票数据存储块,每个股票数据存储块共存储256条日线记录,     每一条记录的长度为32 byte(含义如上;上涨家数及下跌家数只对指数有效);    4)从41000h开始的8KB为第0号数据存储块,以后类推;    5)系统对每个股票日线数据存储以存储块为单位进行分配。    6)具体应用实例分析家数据管理程序。    7) 日期字段的意义为:实际日期 = StrToDate(^1970-01-01^)+(日期字段 div 86400);     即“日期字段”除以86400所得数为实际日期距1970年01月01日的天数。 有关块号计算方法,请参见分笔成交数据格式 日期字段的意义为:实际日期 = StrToDate(^1970-01-01^)+(日期字段 div 86400);  即“日期字段”除以86400所得数为实际日期距1970年01月01日的天数 1分钟数据文件min1.dat case DataTypes.hq1: fileName = "MIN1.DAT"; startAddress = 0x41000; blockSize = 12288;//8192 recordSize = 32; codeIsLong = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,datetime,4,1,0,;" + "kp,开盘,single,4,2,4,B;" + "zg,最高,single,4,3,8,B;" + "zd,最低,single,4,4,12,B;" + "sp,收盘,single,4,5,16,B;" + "sl,成交数量,single,4,6,20,A;"+ "je,成交金额,single,4,7,24,"; 5分钟数据文件min.dat case DataTypes.hq5: fileName = "MIN.DAT"; startAddress = 0x41000; blockSize = 8192; recordSize = 32; codeIsLong = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,datetime,4,1,0,;" + "kp,开盘,single,4,2,4,B;" + "zg,最高,single,4,3,8,B;" + "zd,最低,single,4,4,12,B;" + "sp,收盘,single,4,5,16,B;" + "sl,成交数量,single,4,6,20,A;" + "je,成交金额,single,4,7,24,"; 最新行情STKINFO60.dat case DataTypes.hq0: fileName = "STKINFO60.DAT"; startAddress = 0x68A8A6; blockSize = 0; recordSize = 273; codeIsLong = false; isIndexDataStruct = false; fieldString = "dm,代码,code,10,0,0,;" + "jc,简称,string,32,1,10,;" + "rq,更新时间,datetime,4,5,60,;" + "zs,昨收,single,4,7,68,;" + "kp,今开,single,4,8,72,;" + "zg,最高,single,4,9,76,;" + "zd,最低,single,4,10,80,;" + "sp,最新,single,4,11,84,;" + "sl,总手数,single,4,12,88,;" + "je,金额,single,4,13,92,;" + "xss,现手数,single,4,14,96,;" + "ztj,涨停价,single,4,27,184,;" + "dtj,跌停价,single,4,28,188,;" + "np,内盘,single,4,27,192,;" + "wp,外盘,single,4,28,196,;" + "mrjg1,买一价,single,4,15,100,;" + "mrsl1,买一量,single,4,18,120,;" + "mrjg2,买二价,single,4,16,104,;" + "mrsl2,买二量,single,4,19,124,;" + "mrjg3,买三价,single,4,17,108,;" + "mrsl3,买三量,single,4,20,128,;" + "mrjg4,买四价,single,4,32,112,;" + "mrsl4,买四量,single,4,34,132,;" + "mrjg5,买五价,single,4,33,116,;" + "mrsl5,买五量,single,4,35,136,;" + "mcjg1,卖一价,single,4,21,140,;" + "mcsl1,卖一量,single,4,24,160,;" + "mcjg2,卖二价,single,4,22,144,;" + "mcsl2,卖二量,single,4,25,164,;" + "mcjg3,卖三价,single,4,23,148,;" + "mcsl3,卖三量,single,4,26,168,;" + "mcjg4,卖四价,single,4,36,152,;" + "mcsl4,卖四量,single,4,38,172,;" + "mcjg5,卖五价,single,4,37,156,;" + "mcsl5,卖五量,single,4,39,176,"; //"jd,精度,int,4,3,52,;" + //"scbz,删除标志,int,4,4,56,"; //"unknown,(未知),int,4,31,164,;" + //",(未知),,48,40,200,;" 分笔成交数据文件report.dat(结构同day.dat,但其一些数据不是直接保存) case DataTypes.hqmb: fileName = "REPORT.DAT"; startAddress = 0x41000; blockSize = 12272; recordSize = 52; codeIsLong = false; isIndexDataStruct = false;//不完全等同于day.dat结构,因此单独处理 fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,datetime,4,0,0,;" + "zjcj,最近成交价,single,4,1,4,;" + "zss,总手数,single,4,2,8,calc;" + "je,金额,single,4,3,12,;" + "xss,现手数,single,4,2,8,;" + "mm,内外盘,string,2,16,21,;" + "mr1jg,买一价,single,1,10,42,;" + "mr1sl,买一量,single,2,4,22,;" + "mr2jg,买二价,single,1,11,43,;" + "mr2sl,买二量,single,2,5,24,;" + "mr3jg,买三价,single,1,12,44,;" + "mr3sl,买三量,single,2,6,26,;" + "mr4jg,买四价,single,1,12,45,;" + "mr4sl,买四量,single,2,6,28,;" + "mr5jg,买五价,single,1,12,46,;" + "mr5sl,买五量,single,2,6,30,;" + "mc1jg,卖一价,single,1,13,47,;" + "mc1sl,卖一量,single,2,7,32,;" + "mc2jg,卖二价,single,1,14,48,;" + "mc2sl,卖二量,single,2,8,34,;" + "mc3jg,卖三价,single,1,15,49,;" + "mc3sl,卖三量,single,2,9,36,;"+ "mc4jg,卖四价,single,1,14,50,;" + "mc4sl,卖四量,single,2,8,38,;" + "mc5jg,卖五价,single,1,14,51,;" + "mc5sl,卖五量,single,2,8,40,;" + "bs,总笔数,int,2,0,16," ; //以上数据类型不是存储类型,程序不直接用实际数据类型:买/卖X量为short,买/卖X价为byte //现手数通过当总手数计算而得,应该放在总手数后面 大智慧新一代Level-2 分笔成交数据格式 起止地址 数据内容 数据含义 数据类型 00 - 03 F4 9B 13 FC 日线文件标志 int 04 - 07 10 02 00 00 未知 int 08 - 0B 00 43 DF 46 1970.01.01 00:00:00始的秒数 int 0C - 0F 5D 05 00 00 证券总数 int 10 - 13 ED 20 00 00 未知 int 14 - 17 ED 20 00 00 未知 int 18 - 21 30 30 30 30 30 31 00 00 证券代码 byte[10] 22 - 25 9C 12 00 00 日分笔记录数 int 26 - 57 00 00 BA 03...FF FF 记录块号 char[25] 00041000 记录页起始点, 每记录长: 0x34 = 52 每页记录数: 0xEC = 236 每页长: 每记录长0x34 * 每页记录数0xEC = 0x2FF0 = 12272 地 址 数据内容 数据含义 数据类型 41000 - 41003 35 FA DF 46 1970.01.01 00:00:00 始的秒数 int 41004 - 41007 00 00 18 41 最新价 float 41008 - 4100B 00 80 B4 43 累计成交量 float 4100C - 4100F 80 46 A7 48 累计成交金额 float 41010 - 41011 51 9C 累计成交笔数 char 41012 - 41013 00 00 未知 char 41014 10 累计成交笔数的溢出标志(00|10) byte 41015 80 买入,卖出标识(80|E0买入,C0|A0卖出) byte 41016 - 41017 23 01 委买量1 char 41018 - 41019 8E 5B 委买量2 char 4101A - 4101B 80 27 委买量3 char 4101C - 4101D 8E 5B 委买量4 char 4101E - 4101F B8 40 委买量5 char 41020 - 41021 23 01 委卖量1 char 41022 - 41023 8E 5B 委卖量2 char 41024 - 41025 80 27 委卖量3 char 41026 - 41027 8E 5B 委卖量4 char 41028 - 41029 B8 40 委卖量5 char 4102A 16 委买价1 与成交价的差 byte 4102B 9A 委买价2 与成交价的差 byte 4102C 80 委买价3 与成交价的差 byte 4102D 40 委卖价4 与成交价的差 byte 4102E 30 委卖价5 与成交价的差 byte 4102F 57 委卖价1 与成交价的差 byte 41030 68 委卖价2 与成交价的差 byte 41031 69 委卖价3 与成交价的差 byte 41032 7A 委卖价4 与成交价的差 byte 41033 81 委卖价5 与成交价的差 byte 注意: 1、如有疑问请与 QQ 8588711 联系,愿与您共同挖掘股票成交数据。 2、数据类型为JAVA数据类型定义,实际读数据时应该将数据十六进制取反,如:41000 - 41003的数据为 35 FA DF 46,实际应该读成:   0x46DFFA35 = 1189083701, 这个1189083701值就是距1970.01.01 00:00:00 始的实际秒数。其他int,float,char都是这样取反的。 3、委买卖与成交价的差,是小数点后的整数差,如果买卖标识为80或C0,成交价小数点后是两位(股票),如果买卖标识为E0或A0,   成交价小数点后是三位(权证等) 4、累计成交笔数如果溢出,则41014位上的值不为00,而是10或者20,30等,成交笔数计算方法应为:41014位上的值反转,   10转为01,20转为02。。。 再与41010 - 41011位上的值合并成一个16进制串。 5、记录块号计算方法:char[0] = 0x00 第一个记录块起始地址为:41000h + 0x0000 * 0x2FF0 = 41000h,char[1] = 0x03BA   则第二个记录块起始地址为:41000h + 0x03BA * 0x2FF0 = 0x00077F78 标签: 财经 近日发现Level-2的逐笔成交数据是缓存在dzh2\data\sh\TEMP目录下,文件名以证券代码为名,后辍是.L2D,如果重启大智慧, L2D文件会全部被删除,而且临时文件只有在浏览过该证券的逐笔成交后才会生成,不过花的时间也不算太多。也许以后会要研究 逐笔成交数据了,这样的数据更有意义,读数据不是问题,最主要的是分析方法,当得到盘口异动数据后,还需要结合信息面来操作, 这样的成功几率非常大,我已经初尝胜果。后面,还要通过数据来分析大盘走势,还有通过行业数据异动,发现基金等大资金的短期 目标,这点也非常之重要。这个十一假期,过得不会很闲,还有很多东西要做、、、 现在也不想接受QQ加好友请求,真正做数据盘口 分析的,发现数据格式,马上就已经投入战斗了,而且一看就会明了。在这个市场,每个人都有自己的方式生存,没有拿手绝活,那 是不要随便来玩的。逐笔成交数据格式,大概也会在不久后弄个明白。 财务数据(简单)STKINFO60.dat case DataTypes.cw0: fileName = "STKINFO60.DAT"; startAddress = 0x4c2a; blockSize = 2227; recordSize = 273;//196 codeIsLong = false; isIndexDataStruct = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,报告期,date,4,0,4,;" + "gxrq,更新日期,date,4,0,0,;" + "ssrq,上市日期,date,4,0,8,;" + "col1,每股收益,single,4,0,12,;" + "col2,每股净资产,single,4,0,16,;" + "col3,净资产收益率,single,4,0,20,;" + "col4,每股经营现金,single,4,0,24,;" + "col5,每股公积金,single,4,0,28,;" + "col6,每股未分配,single,4,0,32,;" + "col7,股东权益比,single,4,0,36,;" + "col8,净利润同比,single,4,0,40,;" + "col9,主营收入同比,single,4,0,44,;" + "col10,销售毛利率,single,4,0,48,;" + "col11,调整每股净资产,single,4,0,52,;" + "col12,总资产,single,4,0,56,;" + "col13,流动资产,single,4,0,60,;" + "col14,固定资产,single,4,0,64,;" + "col15,无形资产,single,4,0,68,;" + "col16,流动负债,single,4,0,72,;" + "col17,长期负债,single,4,0,76,;" + "col18,总负债,single,4,0,80,;" + "col19,股东权益,single,4,0,84,;" + "col20,资本公积金,single,4,0,88,;" + "col21,经营现金流量,single,4,0,92,;" + "col22,投资现金流量,single,4,0,96,;" + "col23,筹资现金流量,single,4,0,100,;" + "col24,现金增加额,single,4,0,104,;" + "col25,主营收入,single,4,0,108,;" + "col26,主营利润,single,4,0,112,;" + "col27,营业利润,single,4,0,116,;" + "col28,投资收益,single,4,0,120,;" + "col29,营业外收支,single,4,0,124,;" + "col30,利润总额,single,4,0,128,;" + "col31,净利润,single,4,0,132,;" + "col32,未分配利润,single,4,0,136,;" + "col33,总股本,single,4,0,140,;" + "col34,无限售股合计,single,4,0,144,;" + "col35,A股,single,4,0,148,;" + "col36,B股,single,4,0,152,;" + "col37,境外上市股,single,4,0,156,;" + "col38,其他流通股,single,4,0,160,;" + "col39,限售股合计,single,4,0,164,;" + "col40,国家持股,single,4,0,168,;" + "col41,国有法人股,single,4,0,172,;" + "col42,境内法人股,single,4,0,176,;" + "col43,境内自然人股,single,4,0,180,;" + "col44,其他发起人股,single,4,0,184,;" + "col45,募集法人股,single,4,0,188,;" + "col46,境外法人股,single,4,0,192,;" + "col47,境外自然人股,single,4,0,196,;" + "col48,优先股或其他,single,4,0,200,"; 分红送配STKINFO60.dat case DataTypes.cq: fileName = "STKINFO60.DAT"; startAddress = 0x44aa; blockSize = 2227; recordSize = 20; codeIsLong = false; isIndexDataStruct = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,date,4,0,0,;" + "sgbl,送股比例,single,4,1,4,;" + "pgbl,配股比例,single,4,2,8,;" + "pgjg,配股价格,single,4,3,12,;" + "fh,分红,single,4,4,16,"; 代码STKINFO60.dat case DataTypes.dm: fileName = "STKINFO60.DAT"; startAddress = 0x68A8A6; blockSize = 0; recordSize = 273;//fxj248 codeIsLong = false; isIndexDataStruct = false; fieldString = "dm,代码,code,10,0,0,;" + "jc,简称,string,32,1,10,"; struct fileStruct { public string fileName;//文件名 public int startAddress,blockSize,recordSize;//起始地址,每块长度,记录长度 public bool codeIsLong, isIndexDataStruct; //codeIsLong索引的代码包含有市场代码SH、SZ等;isIndexDataStruct象Day.Dat那样的结构即由索引+数据组成; public string[,] fields;//字段 public fileStruct(DataTypes fileType) { fileName = ""; startAddress = 0; blockSize = 0; recordSize = 0; codeIsLong = false; isIndexDataStruct = true; string fieldString = ""; //字段名,字段标签,类型,长度字段,存储顺序,偏移量 switch (fileType) { #region 代码STKINFO60.DAT//代码的拼音是乱码,有可能拼音简写未存盘,而是由大智慧软件另行计算。 case DataTypes.dm: fileName = "STKINFO60.DAT"; //startAddress = 0x845898; startAddress = 0x6d0226; //startAddress = 0x68A8A6; blockSize = 0; //recordSize = 248;//原分析家 recordSize = 273; codeIsLong = false; isIndexDataStruct = false; fieldString = "dm,代码,code,10,0,0,;" + "jc,简称,string,32,1,10,;" + "py,拼音,string,10,2,42,"; break; #endregion #region 分红送配STKINFO60.DAT//除权数据//OK case DataTypes.cq: fileName = "STKINFO60.DAT"; startAddress = 0x44aa; blockSize = 2227; recordSize = 20; codeIsLong = false; isIndexDataStruct = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,date,4,0,0,;" + "sgbl,送股比例,single,4,1,4,;" + "pgbl,配股比例,single,4,2,8,;" + "pgjg,配股价格,single,4,3,12,;" + "fh,分红,single,4,4,16,"; break; #endregion #region 财务数据(简单)STKINFO60.DAT//OK case DataTypes.cw0: fileName = "STKINFO60.DAT"; startAddress = 0x4c2a; blockSize = 2227; recordSize = 273; codeIsLong = false; isIndexDataStruct = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,报告期,date,4,0,4,;" + "gxrq,更新日期,date,4,0,0,;" + "ssrq,上市日期,date,4,0,8,;" + "col1,每股收益,single,4,0,12,;" + "col2,每股净资产,single,4,0,16,;" + "col3,净资产收益率,single,4,0,20,;" + "col4,每股经营现金,single,4,0,24,;" + "col5,每股公积金,single,4,0,28,;" + "col6,每股未分配,single,4,0,32,;" + "col7,股东权益比,single,4,0,36,;" + "col8,净利润同比,single,4,0,40,;" + "col9,主营收入同比,single,4,0,44,;" + "col10,销售毛利率,single,4,0,48,;" + "col11,调整每股净资产,single,4,0,52,;" + "col12,总资产,single,4,0,56,;" + "col13,流动资产,single,4,0,60,;" + "col14,固定资产,single,4,0,64,;" + "col15,无形资产,single,4,0,68,;" + "col16,流动负债,single,4,0,72,;" + "col17,长期负债,single,4,0,76,;" + "col18,总负债,single,4,0,80,;" + "col19,股东权益,single,4,0,84,;" + "col20,资本公积金,single,4,0,88,;" + "col21,经营现金流量,single,4,0,92,;" + "col22,投资现金流量,single,4,0,96,;" + "col23,筹资现金流量,single,4,0,100,;" + "col24,现金增加额,single,4,0,104,;" + "col25,主营收入,single,4,0,108,;" + "col26,主营利润,single,4,0,112,;" + "col27,营业利润,single,4,0,116,;" + "col28,投资收益,single,4,0,120,;" + "col29,营业外收支,single,4,0,124,;" + "col30,利润总额,single,4,0,128,;" + "col31,净利润,single,4,0,132,;" + "col32,未分配利润,single,4,0,136,;" + "col33,总股本,single,4,0,140,;" + "col34,无限售股合计,single,4,0,144,;" + "col35,A股,single,4,0,148,;" + "col36,B股,single,4,0,152,;" + "col37,境外上市股,single,4,0,156,;" + "col38,其他流通股,single,4,0,160,;" + "col39,限售股合计,single,4,0,164,;" + "col40,国家持股,single,4,0,168,;" + "col41,国有法人股,single,4,0,172,;" + "col42,境内法人股,single,4,0,176,;" + "col43,境内自然人股,single,4,0,180,;" + "col44,其他发起人股,single,4,0,184,;" + "col45,募集法人股,single,4,0,188,;" + "col46,境外法人股,single,4,0,192,;" + "col47,境外自然人股,single,4,0,196,;" + "col48,优先股或其他,single,4,0,200,"; break; #endregion #region 最新行情STKINFO60.DAT//OK case DataTypes.hq0: fileName = "STKINFO60.DAT"; startAddress = 0x6D0226; blockSize = 0; recordSize = 273; codeIsLong = false; isIndexDataStruct = false; fieldString = "dm,代码,code,10,0,0,;" + "jc,简称,string,32,1,10,;" + "rq,更新时间,datetime,4,5,60,;" + "zs,昨收,single,4,7,68,;" + "kp,今开,single,4,8,72,;" + "zg,最高,single,4,9,76,;" + "zd,最低,single,4,10,80,;" + "sp,最新,single,4,11,84,;" + "sl,总手数,single,4,12,88,;" + "je,金额,single,4,13,92,;" + "xss,现手数,single,4,14,96,;" + "ztj,涨停价,single,4,27,184,;" + "dtj,跌停价,single,4,28,188,;" + "np,内盘,single,4,27,192,;" + "wp,外盘,single,4,28,196,;" + "mrjg1,买一价,single,4,15,100,;" + "mrsl1,买一量,single,4,18,120,;" + "mrjg2,买二价,single,4,16,104,;" + "mrsl2,买二量,single,4,19,124,;" + "mrjg3,买三价,single,4,17,108,;" + "mrsl3,买三量,single,4,20,128,;" + "mrjg4,买四价,single,4,32,112,;" + "mrsl4,买四量,single,4,34,132,;" + "mrjg5,买五价,single,4,33,116,;" + "mrsl5,买五量,single,4,35,136,;" + "mcjg1,卖一价,single,4,21,140,;" + "mcsl1,卖一量,single,4,24,160,;" + "mcjg2,卖二价,single,4,22,144,;" + "mcsl2,卖二量,single,4,25,164,;" + "mcjg3,卖三价,single,4,23,148,;" + "mcsl3,卖三量,single,4,26,168,;" + "mcjg4,卖四价,single,4,36,152,;" + "mcsl4,卖四量,single,4,38,172,;" + "mcjg5,卖五价,single,4,37,156,;" + "mcsl5,卖五量,single,4,39,176,"; //"jd,精度,int,4,3,52,;" + //"scbz,删除标志,int,4,4,56,"; //"unknown,(未知),int,4,31,164,;" + //",(未知),,48,40,200,;" break; #endregion #region 分笔成交数据文件report.dat(结构同day.dat,但其一些数据不是直接保存)//OK case DataTypes.hqmb: fileName = "REPORT.DAT"; //fileName = "20080926.PRP"; startAddress = 0x41000; blockSize = 12272;//52*236=12272 recordSize = 52; codeIsLong = false; isIndexDataStruct = false;//不完全等同于day.dat结构,因此单独处理 fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,datetime,4,0,0,;" + "zjcj,最近成交价,single,4,1,4,;" + "zss,总手数,single,4,2,8,calc;" + "je,金额,single,4,3,12,;" + "xss,现手数,single,4,2,8,;" + "mm,内外盘,string,2,16,21,;" + "mr1jg,买一价,single,1,10,42,;" + "mr1sl,买一量,single,2,4,22,;" + "mr2jg,买二价,single,1,11,43,;" + "mr2sl,买二量,single,2,5,24,;" + "mr3jg,买三价,single,1,12,44,;" + "mr3sl,买三量,single,2,6,26,;" + "mr4jg,买四价,single,1,12,45,;" + "mr4sl,买四量,single,2,6,28,;" + "mr5jg,买五价,single,1,12,46,;" + "mr5sl,买五量,single,2,6,30,;" + "mc1jg,卖一价,single,1,13,47,;" + "mc1sl,卖一量,single,2,7,32,;" + "mc2jg,卖二价,single,1,14,48,;" + "mc2sl,卖二量,single,2,8,34,;" + "mc3jg,卖三价,single,1,15,49,;" + "mc3sl,卖三量,single,2,9,36,;" + "mc4jg,卖四价,single,1,14,50,;" + "mc4sl,卖四量,single,2,8,38,;" + "mc5jg,卖五价,single,1,14,51,;" + "mc5sl,卖五量,single,2,8,40,;" + "bs,总笔数,int,2,0,16," ; //以上数据类型不是存储类型,程序不直接用实际数据类型:买/卖X量为short,买/卖X价为byte //现手数通过当总手数计算而得,应该放在总手数后面 break; #endregion #region 日线数据文件day.dat//OK case DataTypes.hq: fileName = "DAY.DAT"; startAddress = 0x41000; blockSize = 8192; recordSize = 32; codeIsLong = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,date,4,1,0,;" + "kp,开盘,single,4,2,4,B;" + "zg,最高,single,4,3,8,B;" + "zd,最低,single,4,4,12,B;" + "sp,收盘,single,4,5,16,B;" + "sl,成交数量,single,4,6,20,A;"+ "je,成交金额,single,4,7,24,"; break; #endregion #region 1分钟数据文件min1.dat case DataTypes.hq1: fileName = "MIN1.DAT"; startAddress = 0x41000; blockSize = 16384;//块大小为:/32=;原分析家是 recordSize = 32; codeIsLong = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,datetime,4,1,0,;" + "kp,开盘,single,4,2,4,B;" + "zg,最高,single,4,3,8,B;" + "zd,最低,single,4,4,12,B;" + "sp,收盘,single,4,5,16,B;" + "sl,成交数量,single,4,6,20,A;"+ "je,成交金额,single,4,7,24,"; break; #endregion #region 5分钟数据文件min.dat//OK case DataTypes.hq5: fileName = "MIN.DAT"; startAddress = 0x41000; blockSize = 8192; recordSize = 32; codeIsLong = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,datetime,4,1,0,;" + "kp,开盘,single,4,2,4,B;" + "zg,最高,single,4,3,8,B;" + "zd,最低,single,4,4,12,B;" + "sp,收盘,single,4,5,16,B;" + "sl,成交数量,single,4,6,20,A;"+ "je,成交金额,single,4,7,24,"; break; #endregion #region 分红送配数据文件exprof.fdt case DataTypes.fp: fileName = "EXPROF.FDT"; startAddress = 0x41000; blockSize = 3776; recordSize = 236; codeIsLong = true; fieldString = "dm,代码,code,12,0,0,;"+ "cqrq,除权日期,date,4,23,176,;" + "sgbl,送股比例,double,8,1,12,;" + "sgdjr,送股股权登记日,date,4,2,20,;"+ "sgcqr,送股除权日,date,4,3,24,;"+ "sgssr,红股上市日,date,4,4,28,;"+ "zzbl,转增比例,double,8,5,32,;"+ "zzdjr,转增股权登记日,date,4,6,40,;"+ "zzcqr,转增除权日,date,4,7,44,;"+ "zzssr,转增上市日,date,4,8,48,;"+ "fhbl,分红比例,double,8,9,52,;"+ "fhdjr,分红股权登记日,date,4,10,60,;" + "fhcxr,分红除息日,date,4,11,64,;" + "fhpxr,分红派息日,date,4,12,68,;" + "pgbl,配股比例,double,8,13,72,;"+ "pgdjr,配股股权登记日,date,4,14,80,;"+ "pgcqr,配股除权基准日,date,4,15,84,;"+ "pgjkqsr,配股缴款起始日,date,4,16,88,;"+ "pgjkzzr,配股缴款终止日,date,4,17,92,;"+ "pgssr,配股可流通上市日,date,4,18,96,;"+ "pgjg,配股价格,single,4,19,100,;"+ "frgpgbl,公众股受让法人股配股比例,double,8,20,104,;"+ "frgmgzrf,认购法人股配股每股转让费,single,4,21,112,;"+ "pgzcxs,配股主承销商,string,60,22,116,;"+ "bgrq,报告日期,date,4,24,180,;"+ "dshrq,董事会日期,date,4,25,184,;"+ "gdhrq,股东会日期,date,4,26,188,;"+ "fhggrq,分红公告日期,date,4,27,192,;"+ "zgbjs,总股本基数,double,8,28,196,;"+ "sgsl,送股数量,double,8,29,204,;"+ "zzsl,转增数量,double,8,30,212,;"+ "sjpgs,实际配股总数,double,8,31,220,;"+ "cqhzgb,除权后总股本,double,8,32,228"; break; #endregion #region 股本结构STKCapital.fdt case DataTypes.gb: fileName = "STKCAPITAL.FDT"; startAddress = 0x41000; blockSize = 3488; recordSize = 218; codeIsLong = true; fieldString = "dm,代码,code,12,0,0;" + "rq,日期,date,4,17,214;"+ "zgb,总股本,double,8,1,12;" + "gjg,国家股,double,8,2,20;" + "fqrg,发起人股,double,8,3,28;" + "frg,法人股,double,8,4,36;" + "ybfrps,一般法人配售,double,8,5,44;" + "zgg,内部职工股,double,8,6,52;" + "a,流通A股,double,8,7,60;" + "zltzag,战略投资A股,double,8,8,68;" + "zpg,转配股,double,8,9,76;" + "jjps,基金配售,double,8,10,84;" + "h,H股,double,8,11,92;" + "b,B股,double,8,12,100;" + "yxg,优先股,double,8,13,108;" + "ggcg,高级管理人员持股,double,8,14,116;" + "gbbdyy,股本变动原因,string,56,15,124;" + "gbbdyylb,股本变动原因类别,string,34,16,180"; break; #endregion #region 财务数据STKFinance.fdt case DataTypes.cw: fileName = "STKFINANCE.FDT"; startAddress = 0x41000; blockSize = 14848; recordSize = 464; codeIsLong = true; fieldString = "dm,代码,code,12,0,0,;"+ "rq,日期,date,4,,460,;"+ "bsdqtzje,短期投资净额,double,8,1,12,;"+ "bsyszkje,应收帐款净额,double,8,2,20,;"+ "bschje,存货净额,double,8,3,28,;"+ "bsldzc,流动资产,double,8,4,36,;"+ "bscqtzje,长期投资净额,double,8,5,44,;"+ "bsgdzc,固定资产,double,8,6,52,;"+ "bswxzc,无形及其他资产,double,8,7,60,;"+ "bszzc,总资产,double,8,8,68,;"+ "bsdqjk,短期借款,double,8,9,76,;"+ "bsyfzk,应付帐款,double,8,10,84,;"+ "bsldfz,流动负债,double,8,11,92,;"+ "bscqfz,长期负债,double,8,12,100,;"+ "bsfz,负债合计,double,8,13,108,;"+ "bsgb,股本,double,8,14,116,;"+ "bsssgdqy,少数股东权益,double,8,15,124,;"+ "bsgdqy,股东权益,double,8,16,132,;"+ "bszbgj,资本公积,double,8,17,140,;"+ "bsyygj,盈余公积,double,8,18,148,;"+ "iszysr,主营业务收入净额,double,8,1,156,;"+ "iszycb,主营业务成本,double,8,2,164,;"+ "iszylr,主营业务利润,double,8,3,172,;"+ "isqtlr,其它业务利润,double,8,4,180,;"+ "isyyfy,营业费用,double,8,5,188,;"+ "isglfy,管理费用,double,8,6,196,;"+ "iscwfy,财务费用,double,8,7,204,;"+ "istzsy,投资收益,double,8,8,212,;"+ "islrze,利润总额,double,8,9,220,;"+ "issds,所得税,double,8,10,228,;"+ "isjlr,净利润,double,8,11,236,;"+ "iskchjlr,扣除经常性损益后的净利润,double,8,12,244,;"+ "iswfplr,未分配利润,double,8,13,252,;"+ "cfjyhdxjlr,经营活动现金流入,double,8,1,260,;"+ "cfjyhdxjlc,经营活动现金流出,double,8,2,268,;"+ "cfjyhdxjje,经营活动现金净额,double,8,3,276,;"+ "cftzxjlr,投资现金流入,double,8,4,284,;"+ "cftzxjlc,投资现金流出,double,8,5,292,;"+ "cftzxjje,投资现金净额,double,8,6,300,;"+ "cfczxjlr,筹措现金流入,double,8,7,308,;"+ "cfczxjlc,筹措现金流出,double,8,8,316,;"+ "cfczxjje,筹措现金净额,double,8,9,324,;"+ "cfxjjze,现金及现金等价物净增额,double,8,10,332,;"+ "cfxsspxj,销售商品收到的现金,double,8,11,340,;"+ "mgsy,每股收益,single,4,1,348,;"+ "mgjzc,每股净资产,single,4,2,352,;"+ "tzmgjzc,调整后每股净资产,single,4,3,356,;"+ "mgzbgjj,每股资本公积金,single,4,4,360,;"+ "mgwfplr,每股未分配利润,single,4,5,364,;"+ "mgjyxjllje,每股经营活动产生的现金流量净额,single,4,6,368,;"+ "mgxjzjje,每股现金及现金等价物增加净额,single,4,7,372,;"+ "mll,毛利率,single,4,8,376,;"+ "zyywlrl,主营业务利润率,single,4,9,380,;"+ "jll,净利率,single,4,10,384,;"+ "zzcbcl,总资产报酬率,single,4,11,388,;"+ "jzcsyl,净资产收益率,single,4,12,392,;"+ "xsxjzb,销售商品收到的现金占主营收入比例,single,4,13,396,;"+ "yszczzl,应收帐款周转率,single,4,14,400,;"+ "chzzl,存货周转率,single,4,15,404,;"+ "gdzczzl,固定资产周转率,single,4,16,408,;"+ "zyywzzl,主营业务增长率,single,4,17,412,;"+ "jlrzzl,净利润增长率,single,4,18,416,;"+ "zzczzl,总资产增长率,single,4,19,420,;"+ "jzczzl,净资产增长率,single,4,20,424,;"+ "ldbl,流动比率,single,4,21,428,;"+ "sdbl,速动比率,single,4,22,432,;"+ "zcfzbl,资产负债比率,single,4,23,436,;"+ "fzbl,负债比率,single,4,24,440,;"+ "gdqybl,股东权益比率,single,4,25,444,;"+ "gdzcbl,固定资产比率,single,4,26,448,;"+ "kchmgjlr,扣除经常性损益后每股净利润,single,4,27,452,"; break; #endregion #region 十大股东stkhold.fdt case DataTypes.gd: fileName = "STKHOLD.FDT"; startAddress = 0x41000; blockSize = 17568; recordSize = 2196; codeIsLong = true; fieldString = "dm,代码,code,12,0,0,;"+ "rq,日期,date,4,66,2192,;" + "gd1mc,股东名称,string,160,1,12,;"+ "gd1cgsl,股东持股数量,double,8,2,172,;"+ "gd1cgbl,股东持股比例,single,4,3,180,;"+ "gd1bz,股东备注,string,20,4,184,;"+ "gd1fr,股东法人,string,8,5,204,;"+ "gd1jyfw,股东经营范围,string,16,6,212,;"+ "gd2mc,股东名称,string,160,7,228,;"+ "gd2cgsl,股东持股数量,double,8,8,388,;"+ "gd2cgbl,股东持股比例,single,4,9,396,;"+ "gd2bz,股东备注,string,20,10,400,;"+ "gd2fr,股东法人,string,8,11,420,;"+ "gd2jyfw,股东经营范围,string,16,12,428,;"+ "gd3mc,股东名称,string,160,13,444,;"+ "gd3cgsl,股东持股数量,double,8,14,604,;"+ "gd3cgbl,股东持股比例,single,4,15,612,;"+ "gd3bz,股东备注,string,20,16,616,;"+ "gd3fr,股东法人,string,8,17,636,;"+ "gd3jyfw,股东经营范围,string,16,18,644,;"+ "gd4mc,股东名称,string,160,19,660,;"+ "gd4cgsl,股东持股数量,double,8,20,820,;"+ "gd4cgbl,股东持股比例,single,4,21,828,;"+ "gd4bz,股东备注,string,20,22,832,;"+ "gd4fr,股东法人,string,8,23,852,;"+ "gd4jyfw,股东经营范围,string,16,24,860,;"+ "gd5mc,股东名称,string,160,25,876,;"+ "gd5cgsl,股东持股数量,double,8,26,1036,;"+ "gd5cgbl,股东持股比例,single,4,27,1044,;"+ "gd5bz,股东备注,string,20,28,1048,;"+ "gd5fr,股东法人,string,8,29,1068,;"+ "gd5jyfw,股东经营范围,string,16,30,1076,;"+ "gd6mc,股东名称,string,160,31,1092,;"+ "gd6cgsl,股东持股数量,double,8,32,1252,;"+ "gd6cgbl,股东持股比例,single,4,33,1260,;"+ "gd6bz,股东备注,string,20,34,1264,;"+ "gd6fr,股东法人,string,8,35,1284,;"+ "gd6jyfw,股东经营范围,string,16,36,1292,;"+ "gd7mc,股东名称,string,160,37,1308,;"+ "gd7cgsl,股东持股数量,double,8,38,1468,;"+ "gd7cgbl,股东持股比例,single,4,39,1476,;"+ "gd7bz,股东备注,string,20,40,1480,;"+ "gd7fr,股东法人,string,8,41,1500,;"+ "gd7jyfw,股东经营范围,string,16,42,1508,;"+ "gd8mc,股东名称,string,160,43,1524,;"+ "gd8cgsl,股东持股数量,double,8,44,1684,;"+ "gd8cgbl,股东持股比例,single,4,45,1692,;"+ "gd8bz,股东备注,string,20,46,1696,;"+ "gd8fr,股东法人,string,8,47,1716,;"+ "gd8jyfw,股东经营范围,string,16,48,1724,;"+ "gd9mc,股东名称,string,160,49,1740,;"+ "gd9cgsl,股东持股数量,double,8,50,1900,;"+ "gd9cgbl,股东持股比例,single,4,51,1908,;"+ "gd9bz,股东备注,string,20,52,1912,;"+ "gd9fr,股东法人,string,8,53,1932,;"+ "gd9jyfw,股东经营范围,string,16,54,1940,;"+ "gd10mc,股东名称,string,160,55,1956,;"+ "gd10cgsl,股东持股数量,double,8,56,2116,;"+ "gd10cgbl,股东持股比例,single,4,57,2124,;"+ "gd10bz,股东备注,string,20,58,2128,;"+ "gd10fr,股东法人,string,8,59,2148,;"+ "gd10jyfw,股东经营范围,string,16,60,2156,;"+ "gdzs,股东总数,int,4,61,2172,;"+ "gjgfrggds,国家股法人股股东数,int,4,62,2176,;"+ "aggds,流通股A股股东数,int,4,63,2180,;"+ "bggds,流通股B股股东数,int,4,64,2184,"; break; #endregion #region 基金周报fundweek.fdt case DataTypes.jjjz: //fileName = "FUNDWEEK.FDT"; fileName = "FUNDINFO.fdt"; startAddress = 0x41000; blockSize = 12032; recordSize = 188; codeIsLong = true; fieldString = "dm,代码,code,12,0,0,;"+ "rq,日期,date,4,13,184,;"+ "dwjz,基金单位净值,single,4,6,152,;" + "jjze,基金净值总额,double,8,5,144,;" + "gm,基金规模,double,8,4,136,;" + "dwcz,基金单位初值,single,4,7,156,;"+ "tzhjz,基金调整后净值,single,4,8,160,;"+ "tzhcz,基金调整后初值,single,4,9,164,;"+ "zzl,基金增长率(%),double,8,10,168,;"+ "ljjz,基金累计净值,single,4,11,176,;"+ "slrq,基金设立日期,date,4,1,12,;"+ "glr,基金管理人,string,60,2,16,;"+ "tgr,基金托管人,string,60,3,76," ;//12为保留字段 break; #endregion #region 基金投资组合funddiv.fdt case DataTypes.jjzh: fileName = "FUNDDIV.FDT"; fileName = "FUNDINVEST.fdt"; startAddress = 0x41000; blockSize = 8320; recordSize = 260; codeIsLong = true; fieldString = "dm,代码,code,12,0,0,;" + "bgrq,报告日期,date,4,31,252,;" + "zzrq,截止日期,date,4,32,256,;" + "dm1,证券代码,string,12,1,12,;" + "sz1,证券市值,double,8,2,24,;" + "bl1,证券占净值比例(%),single,4,3,32,;" + "dm2,证券代码,string,12,4,36,;" + "sz2,证券市值,double,8,5,48,;" + "bl2,证券占净值比例(%),single,4,6,56,;" + "dm3,证券代码,string,12,7,60,;" + "sz3,证券市值,double,8,8,72,;" + "bl3,证券占净值比例(%),single,4,9,80,;" + "dm4,证券代码,string,12,10,84,;" + "sz4,证券市值,double,8,11,96,;" + "bl4,证券占净值比例(%),single,4,12,104,;" + "dm5,证券代码,string,12,13,108,;" + "sz5,证券市值,double,8,14,120,;" + "bl5,证券占净值比例(%),single,4,15,128,;" + "dm6,证券代码,string,12,16,132,;" + "sz6,证券市值,double,8,17,144,;" + "bl6,证券占净值比例(%),single,4,18,152,;" + "dm7,证券代码,string,12,19,156,;" + "sz7,证券市值,double,8,20,168,;" + "bl7,证券占净值比例(%),single,4,21,176,;" + "dm8,证券代码,string,12,22,180,;" + "sz8,证券市值,double,8,23,192,;" + "bl8,证券占净值比例(%),single,4,24,200,;" + "dm9,证券代码,string,12,25,204,;" + "sz9,证券市值,double,8,26,216,;" + "bl9,证券占净值比例(%),single,4,27,224,;" + "dm10,证券代码,string,12,28,228,;" + "sz10,证券市值,double,8,29,240,;" + "bl10,证券占净值比例(%),single,4,30,248,"; break; #endregion #region 板块userdata\block case DataTypes.bk: fileName = "BLOCK.DEF"; startAddress = 0; blockSize = 0; recordSize = 248; codeIsLong = false; isIndexDataStruct = false; fieldString = "lb,类别,string,20,0,0,;" + "bk,板块,string,20,1,10,;" + "dm,证券代码,string,10,2,42,"; break; #endregion #region 评级 case DataTypes.pj: fileName = "评级.str"; //fileName = "SIMU.DAT"; startAddress = 0; blockSize = 256; recordSize = 256; codeIsLong = true; isIndexDataStruct = false; fieldString = "dm,证券代码,string,12,0,0,;" + "pj,评级,string,2,2,0,;" + "sm,说明,string,244,2,0,"; break; #endregion #region 复权行情,计算而得 case DataTypes.hqfq: fileName = "DAY.DAT"; startAddress = 0x41000; blockSize = 8192; recordSize = 32; codeIsLong = false; fieldString = "dm,代码,code,10,0,0,;" + "rq,日期,date,4,1,0,;" + "kp,开盘复权价,single,4,2,4,B;" + "zg,最高复权价,single,4,3,8,B;" + "zd,最低复权价,single,4,4,12,B;" + "sp,收盘复权价,single,4,5,16,B;" + "sl,复权成交数量,single,4,6,20,A;" + "je,成交金额,single,4,7,24,;"+ "spsyl,收盘收益率,single,4,0,0,"; break; #endregion } string[] fieldLine = fieldString.Split(new char[] { ';' }); fields = new string[fieldLine.Length, 7]; for (int i = 0; i < fieldLine.Length; i++) { string[] field = fieldLine[i].Split(new char[]{','} ,7 ); for(int j=0;j<field.Length;j++) { fields[i,j]=field[j]; } } } }
量化交易是利用数学和统计模型来进行股票交易的一种方法。在量化交易数据库的设计对于数据的存储和查询效率非常重要。MySQL是一种常用的关系型数据库管理系统,可以用于存储和管理量化交易股票数据。 在设计MySQL数据库时,可以考虑以下几个方面: 1. 的设计:根据需求,可以设计多张来存储不同类型的数据,例如股票基本信息、交易数据、财务数据等。每张应该有一个主键来唯一标识每条记录。 2. 数据类型的选择:根据数据的特点和需求,选择合适的数据类型来存储数据。例如,使用整型来存储股票代码、日期等,使用浮点型来存储价格、成交量等。 3. 索引的创建:对于经常需要查询的字段,可以创建索引来提高查询效率。例如,对于交易数据,可以创建股票代码和日期的组合索引。 4. 数据库性能优化:可以通过调整数据库的参数和优化查询语句来提高数据库的性能。例如,合理设置缓冲区大小、调整并发连接数、使用合适的查询语句等。 下面是一个示例的MySQL数据库设计: ```sql -- 股票基本信息 CREATE TABLE stock_info ( stock_code VARCHAR(10) PRIMARY KEY, stock_name VARCHAR(50), industry VARCHAR(50), exchange VARCHAR(10) ); -- 交易数据 CREATE TABLE stock_trade ( id INT PRIMARY KEY AUTO_INCREMENT, stock_code VARCHAR(10), trade_date DATE, open_price FLOAT, close_price FLOAT, high_price FLOAT, low_price FLOAT, volume INT, FOREIGN KEY (stock_code) REFERENCES stock_info(stock_code) ); -- 财务数据 CREATE TABLE stock_finance ( id INT PRIMARY KEY AUTO_INCREMENT, stock_code VARCHAR(10), report_date DATE, revenue FLOAT, net_profit FLOAT, total_assets FLOAT, FOREIGN KEY (stock_code) REFERENCES stock_info(stock_code) ); ``` 以上是一个简单的MySQL数据库设计示例,包括股票基本信息、交易数据和财务数据。根据实际需求,可以进一步扩展和优化数据库设计。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值