精华内容
下载资源
问答
  • 除权数据处理.zip

    2020-07-17 17:33:31
    除权数据文件导出存通达信板块源码,可以把除权格式文件数据解析出来导出到通达信,除权数据文件导出存通达信板块源码,可以把除权格式文件数据解析出来导出到通达信,
  • 大智慧8.x除权 数据读取,支持导入到通达信自定义的版块中。...我搞不定,但大智慧的数据比较好读取,下载了365发现除权数据和以前已经不一样了,网上基本都没用了,重新分析了下,可以读取大智慧365除权数据(8.x)
  • 送大家股票除权出息数据-cq.zip 最近 发现 来论坛好久 一个威望也没有 都是M币:L 有看到 论坛了 YAHOO股票除权出息没有办法 所以就把本人 最近研究的 除权出息数据 与大家分享 希望 看到我帖子的人 给我加点...
  • 自定义指数制作是一定要的 否则出来的都是错误的
  • 日线数据是股票每日收盘后的信息。这块数据不用实时抓取,所以并不占用宝贵的交易时间的资源。于是我们抓取完数据后直接往切片后的数据库中保存。(转载请指明出于breaksoftware的csdn博客) 抓取日线数据  我们...

            日线数据是股票每日收盘后的信息。这块数据不用实时抓取,所以并不占用宝贵的交易时间的资源。于是我们抓取完数据后直接往切片后的数据库中保存。(转载请指明出于breaksoftware的csdn博客)

    抓取日线数据

            我们先要获取今天有交易信息的股票代码。因为存在股票停牌的情况,所以不需要这类股票信息

        def _get_all_share_ids(self):
            date_info = time.strftime('%Y_%m_%d')
            trade_table_name = "trade_info_%s" % (date_info)
            share_ids = fetch_data.get_data(fetch_data.select_db("daily_temp", trade_table_name, ["share_id"],{}, pre = "distinct"))
            return share_ids

            然后通过股票ID从股票基本信息表中获取股票代码和市场类型等数据

        def _get_all_share_ids_market_type(self):
            share_ids = self._get_all_share_ids()
            ids = []
            for share_id in share_ids:
                ids.append(share_id[0])
            share_ids = fetch_data.get_data(fetch_data.select_db("stock_db", "share_base_info", ["share_id", "market_type"],{"share_id":[ids, "in"]}))
            return share_ids

            然后就是抓取和保存数据

    class update_stock_daily_info(job_base):
        def __init__(self):
            pass
    
        def run(self):
            share_id_market_type = self._get_all_share_ids_market_type()
            for id_market_type in share_id_market_type:
                share_id = id_market_type[0]
                market_type = id_market_type[1]
                self._query_save_data(share_id, market_type)           
            LOG_INFO("run update_stock_daily_info")

            这次我们数据从网易抓取。这儿要非常感谢网易,它提供一个通过指定起始和截止日期的接口拉取历史日线数据。如果起始和截止选择今天,则拉取的是今天的数据。

        def _get_data(self, market_type, id, start_time, end_time):
            url_format = """http://quotes.money.163.com/service/chddata.html?code=%d%s&start=%s&end=%s&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;PCHG;TURNOVER;VOTURNOVER;VATURNOVER"""
            url = url_format % (market_type, id, start_time, end_time)
            res = fetch_data.get_data(fetch_data.query_http(url))
            #res = res.decode("gbk").encode("utf-8")
            return res

            最开始时,我们是一条数据都没有的,于是我们选择从1990年1月1日开始。之后我们有数据了,则从有数据的最后一天开始算起。

        def _get_start_time(self, share_id, table_name):
            stock_conn_manager_obj = stock_conn_manager()
            conn_name = stock_conn_manager_obj.get_conn_name(share_id)
            last_time = fetch_data.get_data(fetch_data.select_db(conn_name, table_name, ["time"], {}, extend="order by time desc limit 1"))
            if len(last_time) > 0:
                last_day = last_time[0][0]
                tz = pytz.timezone('Asia/Shanghai')
                last_day_obj = datetime.datetime.fromtimestamp(last_day, tz)
                while True:
                    next_day_obj = last_day_obj + datetime.timedelta(days = 1)
                    if next_day_obj.weekday() < 5:
                        break
                    last_day_obj = next_day_obj
                time_str = next_day_obj.strftime("%Y%m%d")
            else:
                time_str = "19900101"
            return time.mktime(time.strptime(time_str, '%Y%m%d'))

            获取一个区间的数据后,我们通过正则表达式对结果进行拆分

        def _filter_data(self, data):
            data = data.replace("None", "0")
            filter_data = fetch_data.get_data(fetch_data.regular_split("quotes_money_163", data))
            if len(filter_data) > 0:
                del filter_data[0]
            useful_data = []
            for item in filter_data:
                if int(item[-2]) == 0:
                    continue
                time_str = item[0]
                time_int = time.mktime(time.strptime(time_str,'%Y-%m-%d'))
                item.insert(0, time_int)
                del item[2]
                del item[2]
                useful_data.append(item)
            return useful_data

            最后将数据保存到对应的表中

        def _save_data(self, share_id, table_name, data):
            into_db_columns = ["time","time_str","today_close","today_high","today_low","today_open","yesterday_close","pchg","turnover_rate","volume","turnover"]
            columns_count = len(into_db_columns)
    
            for item in data:
                if len(item) != columns_count:
                    LOG_INFO("%s length is not match for column length %d" %(str(item), columns_count))
                    continue
                del item
    
            if 0 == len(data):
                return
            
            stock_conn_manager_obj = stock_conn_manager()
            conn = stock_conn_manager_obj.get_conn(share_id)
            conn.insert_data(table_name, into_db_columns, data)

    计算均线数据

            均线数据按类型分可以分为成交量均线和价格均线。按时间分可以分为5日、10日、20日、30日、60日、90日、120日、180日和360日均线。

            为了方便计算,我引入了talib库

    pip install TA-Lib  -i http://pypi.douban.com/simple
    

            首先获取所有股票代码以便之后枚举

    class update_stock_daily_average_info(job_base):
        def __init__(self):
            pass
    
        def run(self):
            share_ids = self._get_all_share_ids()
            for share_id_item in share_ids:
                share_id = share_id_item[0]
                self._update_average(share_id)           
            LOG_INFO("run update_stock_daily_average_info")
        
    
        def _get_all_share_ids(self):
            date_info = time.strftime('%Y_%m_%d')
            trade_table_name = "trade_info_%s" % (date_info)
            share_ids = fetch_data.get_data(fetch_data.select_db("daily_temp", trade_table_name, ["share_id"],{}, pre = "distinct"))
            return share_ids

            然后查询每支股票最后一次计算均线的日期。判断规则就是查看价格5日均线值是否为0。因为均线计算量非常大,所以我们不能野蛮的全部重算。每次都要基于上次计算成果进行增量计算。

        def _get_ma_empty_start_time(self, share_id, table_name):
            stock_conn_manager_obj = stock_conn_manager()
            conn_name = stock_conn_manager_obj.get_conn_name(share_id)
            last_time = fetch_data.get_data(fetch_data.select_db(conn_name, table_name, ["time"], {"close_ma5":[0, "="]}, extend="order by time asc limit 1"))
            if len(last_time) > 0:
                last_day = last_time[0][0]
                tz = pytz.timezone('Asia/Shanghai')
                last_day_obj = datetime.datetime.fromtimestamp(last_day, tz)
                time_str = last_day_obj.strftime("%Y%m%d")
                return time.mktime(time.strptime(time_str, '%Y%m%d'))
            else:
                return 0

            因为我们代码中最多分析180日均线数据,所以日期要从上面函数得到的日前前推180日;如果之前没有180日数据,则返回最早的那天。如果是新股,则返回当日。

        def _get_start_time(self, share_id, table_name, ma_empty_start_time):
            stock_conn_manager_obj = stock_conn_manager()
            conn_name = stock_conn_manager_obj.get_conn_name(share_id)
            last_time = fetch_data.get_data(fetch_data.select_db(conn_name, table_name, ["time"], {"time":[ma_empty_start_time, "<="]}, extend="order by time desc limit 180"))
            if len(last_time) > 0:
                last_day = last_time[-1][0]
                tz = pytz.timezone('Asia/Shanghai')
                last_day_obj = datetime.datetime.fromtimestamp(last_day, tz)
                time_str = last_day_obj.strftime("%Y%m%d")
                return time.mktime(time.strptime(time_str, '%Y%m%d'))
            else:
                return ma_empty_start_time

            下一步就是计算各个日期的均值

        def _get_ma_data(self, ori_data, periods):
            ret_data = {}
            float_data = [float(x) for x in ori_data]
            for period in periods:
                data = talib.MA(numpy.array(float_data), timeperiod = period)
                data_list = data.tolist()
                data_list = self._filter_data(data_list)
                ret_data["%d" % period] = data_list
            return ret_data

            然后将计算结果保存到数组中并保存

        def _calc_average_data(self, share_id, table_name):
            ma_empty_start_time_int = self._get_ma_empty_start_time(share_id, table_name)
            if ma_empty_start_time_int == 0:
                return []
            start_time_int = self._get_start_time(share_id, table_name, ma_empty_start_time_int)
            stock_info = self._get_close_volume(share_id, table_name, start_time_int)
            periods = [5, 10, 20, 30, 60, 90, 120, 150, 180]
            #periods = [90, 180]
            close_data = self._get_ma_data(stock_info["close"], periods)
            volume_data = self._get_ma_data(stock_info["volume"], periods)
            if len(stock_info["time"]) == len(close_data["180"]) and len(close_data["180"]) == len(volume_data["180"]):
                pass
            else:
                LOG_WARNING("calc %s daily average error" % share_id)
                return
    
            infos = []
            data_len = len(stock_info["time"])
            for index in range(data_len):
                info = {}
                time_int = stock_info["time"][index]
                if time_int < ma_empty_start_time_int:
                    continue
                info["time"] = time_int
                for period in periods:
                    info["close_ma%s" % period] = close_data["%s" % period][index]
                    info["volume_ma%s" % period] = volume_data["%s" % period][index]
                infos.append(info)
            return infos
    
        def _filter_data(self, data):
            for index in range(len(data)):
                if math.isnan(data[index]):
                    data[index] = 0.01
                else:
                    break
            return data
    
        def _save_data(self, share_id, table_name, data):
            if len(data) < 2:
                return 
            stock_conn_manager_obj = stock_conn_manager()
            conn = stock_conn_manager_obj.get_conn(share_id)
            conn.update(table_name, data, ["time"])

    计算除权后均线数据

            之前算的那些均值理论上来说是没什么用的!因为没有除权!这是我在对比我的数据和同花顺的数据之后得出的。于是只能再改改。

            基本思路是要计算一个因子,因子=前一日数据中收盘价/今日数据中昨日收盘价。然后把除权日之前的价格都“乘以”该因子得出向后复权的价格,相应的把除权日之前的成交量都“除以”该因子得出向后复权的成交量。这样就会导致整个表进行一次更新(从后向前)。

            有意思的是同花顺将成交量也“乘以”该因子,其实这个算法是错误的。举个例子,比如昨日股票收盘10元,成交量100股,则成交金额是1000元。今天除权,于是拉取数据中昨日的收盘价是5元。这样相当于单股价值缩水一半。那么因子是5/10=0.5。那么向后复权计算,昨日的股票收盘价是10*0,5=5元。成交量应该是100/0,5=200股。这样昨日的成交金额是5*200=1000。但是同花顺的算法昨日成交量100*0.5=50股,这明显是错误的。

            最后贴上向后复权的算法

        def _dividend_ori_data(self, share_id, from_table, to_table, start_time, compare = ">", yesterday_close = 0):
            ori_data = self._get_daily_info(share_id, from_table, start_time, compare)
            if 0 == len(ori_data):
                return 0
            if ori_data[0][6] == yesterday_close:
                return 0
    
            ex_dividend_ori = []
            pre_div_value = 1
            for item in ori_data:
                if 0 == yesterday_close:
                    ex_dividend_ori.append(item)
                    yesterday_close = item[6]
                    continue
                
                if len(ex_dividend_ori) > 0:
                    yesterday_close = ex_dividend_ori[-1][6]
                
                ori_close = item[2]
                if ori_close == 0 or yesterday_close == 0:
                    div_value = pre_div_value
                else:
                    if yesterday_close == ori_close:
                        ex_dividend_ori.append(item)
                        continue
                    div_value = yesterday_close/ori_close
                pre_div_value = div_value
                ex_dividend_ori.append([item[0], item[1], item[2] * div_value, item[3] * div_value,item[4] * div_value,item[5] * div_value,item[6] * div_value,item[7],item[8],item[9] / div_value,item[10]])
            
            stock_conn_manager_obj = stock_conn_manager()
            conn = stock_conn_manager_obj.get_conn(share_id)
            if from_table != to_table:
                conn.insert_data(to_table, self._table_keys, ex_dividend_ori)
            else:
                for info_value in ex_dividend_ori:
                    infos = {}
                    for index in range(len(self._table_keys)):
                        infos[self._table_keys[index]] = info_value[index]
                    conn.insert_onduplicate(to_table, infos, ["time"])
    
                conn.insert_onduplicate(to_table, {"close_ma5":0, "time":ex_dividend_ori[-1][0]}, ["time"])
            
            last_yesterday_close = ex_dividend_ori[-1][6]
            return last_yesterday_close        
    展开全文
  • 获取股票除权数据

    千次阅读 2014-03-07 13:11:00
    获取基础数据价格数据:http://ichart.yahoo.com/table.csv?s=600433.SS&amp;a=08&amp;b=25&amp;c=2010&amp;d=09&amp;e=8&amp;f=2013&amp;g=vDate Open High Low Close Volume Adj ...
    方法:
    1.获取基础数据
    价格数据:http://ichart.yahoo.com/table.csv?s=600433.SS&a=08&b=25&c=2010&d=09&e=8&f=2013&g=v
    Date Open High Low Close Volume Adj Close
    2013-5-3 19.2 20.28 19.2 20.1 47618800 20.1
    2013-5-2 17.7 19.06 17.7 19.06 44271800 19.06
    2013-5-1 17.33 17.33 17.33 17.33 0 17.33
    2013-4-30 17.33 17.33 17.33 17.33 0 17.33
    2013-4-26 17.17 17.67 16.5 17.33 25932400 17.33
    2013-4-25 18.45 19 16.77 17.3 51774600 17.3
    2013-4-24 18.26 18.97 17.66 18.63 45102400 18.63
    2013-4-23 17.5 18.46 17.02 18.1 47812700 18.1
    2013-4-22 16.51 17.52 16 17.52 26751800 17.52
    2013-4-19 31.55 32.18 31.1 31.98 25186200 15.88
    2013-4-18 29.67 32.24 29.2 31.47 31170400 15.63
    2013-4-17 28.98 29.68 28.5 29.38 11670400 14.59
    2013-4-16 27.78 29.19 27.78 28.91 15828700 14.36

    分红数据:http://ichart.yahoo.com/table.csv?s=600433.SS&a=08&b=25&c=2010&d=09&e=8&f=2013&g=d
    2013-4-22 0.108
    2012-5-30 0.054
    2011-4-13 0.027

    2.计算前复权价格(以2013-4-22为例)
    根据分红和adjust close计算拆股系数,具体算法目前还有不清楚的地方,待进一步研究

    或者用网页数据解析,计算相关系数:
    http://finance.yahoo.com/q/hp?s=600433.SS&a=05&b=11&c=2010&d=07&e=23&f=2013&g=v
    展开全文
  • 沪深股票除权除息、配股增发全量数据,包括:除权除息、股本变化、增发新股、配送股上市、非流通股上市等事件 ,截止2016年12月31日。
  • 在量化交易中,我们开发了一个交易策略,需要对策略在历史行情数据上进行回测,那么我们该选择除权,还是复权,哪一种形式的行情数据呢? 除权通常是除权除息的简称,这两种情况会在走势图上出现不同程度的下跌缺口...

    在行情软件中经常会看到除权、复权选项,我们选择不同的选项,软件上股票的价格回相应地转换。

    在量化交易中,我们开发了一个交易策略,需要对策略在历史行情数据上进行回测,那么我们该选择除权,还是复权,哪一种形式的行情数据呢?

    除权通常是除权除息的简称,这两种情况会在走势图上出现不同程度的下跌缺口,我们称为除权缺口。

    除权除息会使投资者误认为是一个向下跳空缺口,如下所示:

    图片描述

    如果根据除权的股价去计算股票涨跌幅显然是不对的,同花顺软件里面显示的是-52.49%。同样计算得到的各类指标也是毫无参考价值的。

    为了使得走势图能真实反映各股价趋势,除权除息后的价格是要经过复权处理后才有可比性。

    拿刚才的例子来说。2016年6月27日新希望收盘价为17.64元,第二天6月28日每十股转增10股,红利5.5元,那么股票除权之后的收盘价应该是(17.64 – 0.55) * 10 / (10 + 10) = 8.55元,6月28日的收盘价是8.38,真实涨跌幅应该是8.38 /8.55 - 1 = -1.99%,而不是软件上显示的-52.49%。

    当我们得到股票第一天的价格之后,通过真实涨跌幅的连乘计算,就可以计算出之后每一天的复权价,这个叫做后复权价。同样的,知道了股票最后一天的价格,那么反向处理也就可以计算出之前每一天的价格,这个叫做前复权价。

    接下来我们分别用接口获取“新希望”除权、前复权、后复权的行情数据,如下所示:

    # "除权"
    """
                 High    Low   Open  Close     Volume
    Date                                             
    2010-01-04  14.38  13.94  13.94  14.17  216924.78
    2010-01-05  14.28  13.85  14.22  14.18  107631.41
    2010-01-06  14.31  13.87  14.15  13.88   89684.00
    2010-01-07  13.97  13.38  13.80  13.48   85856.01
    2010-01-08  13.64  13.35  13.43  13.62   58864.09
    ...           ...    ...    ...    ...        ...
    2019-12-25  18.79  18.44  18.59  18.60  207776.34
    2019-12-26  18.76  18.46  18.69  18.60  189935.42
    2019-12-27  19.43  18.58  18.74  19.28  504214.70
    2019-12-30  19.50  18.92  19.24  19.38  379296.95
    2019-12-31  20.31  19.55  19.55  19.95  562873.40
    
    [2244 rows x 5 columns]
    """
    # "后复权"
    """
                  High     Low    Open   Close     Volume
    Date                                                 
    2010-01-04   75.15   72.85   72.85   74.05  216924.78
    2010-01-05   74.63   72.38   74.32   74.11  107631.41
    2010-01-06   74.79   72.49   73.95   72.54   89684.00
    2010-01-07   73.01   69.93   72.12   70.45   85856.01
    2010-01-08   71.28   69.77   70.19   71.18   58864.09
    ...            ...     ...     ...     ...        ...
    2019-12-25  261.18  256.31  258.40  258.54  207776.34
    2019-12-26  260.76  256.59  259.79  258.54  189935.42
    2019-12-27  270.07  258.26  260.48  267.99  504214.70
    2019-12-30  271.05  262.99  267.43  269.38  379296.95
    2019-12-31  282.31  271.74  271.74  277.30  562873.40
    """
    # "前复权"
    """
                 High    Low   Open  Close     Volume
    Date                                             
    2010-01-04   5.41   5.24   5.24   5.33  216924.78
    2010-01-05   5.37   5.21   5.35   5.33  107631.41
    2010-01-06   5.38   5.21   5.32   5.22   89684.00
    2010-01-07   5.25   5.03   5.19   5.07   85856.01
    2010-01-08   5.13   5.02   5.05   5.12   58864.09
    ...           ...    ...    ...    ...        ...
    2019-12-25  18.79  18.44  18.59  18.60  207776.34
    2019-12-26  18.76  18.46  18.69  18.60  189935.42
    2019-12-27  19.43  18.58  18.74  19.28  504214.70
    2019-12-30  19.50  18.92  19.24  19.38  379296.95
    2019-12-31  20.31  19.55  19.55  19.95  562873.40
    
    [2431 rows x 5 columns]
    """

    初步看在2010年1月的股价,除权和前复权、后复权相差较大。接下来可视化收盘价进行对比:

    图片描述

    图片描述

    图中可知他们相差甚大,用除权数据执行策略回测效果会和真实情况相差很多。
    于是,当我们获取的数据为除权数据时,我们需要转换为前复权/后复权数据。

    这里的关键是获取到刚才提到的真实涨跌幅数据,这样我们可以在该数据的基础上计算出前/后复权因子。我们以前复权为例,如下所示:

    """
    trade_date
    2019-12-31    0.97
    2019-12-30    0.97
    2019-12-27    0.93
    2019-12-26    0.93
    2019-12-25    0.93
                  ... 
    2010-01-08    0.25
    2010-01-07    0.26
    2010-01-06    0.27
    2010-01-05    0.27
    2010-01-04    0.26
    Name: fd_factor, Length: 2244, dtype: float64        
    """

    如果未包含涨跌幅数据时,根据除权股价所计算得到的涨跌幅是不正确的。以下pct_chg1为除权股价的涨跌幅,可见与原始的涨跌幅pct_chg差别很大,pct_chg2为差值。

    """
                pct_chg  pct_chg1  pct_chg2
    Date                                   
    2010-01-04     2.83       NaN       NaN
    2010-01-05     0.07  7.06e-04      0.07
    2010-01-06    -2.12 -2.12e-02      2.10
    2010-01-07    -2.88 -2.88e-02      2.85
    2010-01-08     1.04  1.04e-02      1.03
    ...             ...       ...       ...
    2019-12-25     0.38  3.78e-03      0.37
    2019-12-26     0.00  0.00e+00      0.00
    2019-12-27     3.66  3.66e-02      3.62
    2019-12-30     0.52  5.19e-03      0.51
    2019-12-31     2.94  2.94e-02      2.91
    
    [2244 rows x 3 columns]
    
    """

    处理完成后,我们再次可视化“新希望”的收盘价数据,如下所示。可见将除权股价复权后,与前复权曲线重合。

    图片描述

    对于后复权来说,选取初始价格不同相应计算得到的复权价格也会不一样。比如我们从2010年1月1日那天开始后复权得到的行情数据和收盘价走势图如下所示:

    # "后复权"
    """
                 High    Low   Open  Close     Volume
    Date                                             
    2010-01-04  14.38  13.94  13.94  14.17  216924.78
    2010-01-05  14.28  13.85  14.22  14.18  107631.41
    2010-01-06  14.31  13.87  14.15  13.88   89684.00
    2010-01-07  13.97  13.38  13.80  13.48   85856.01
    2010-01-08  13.64  13.35  13.43  13.62   58864.09
    ...           ...    ...    ...    ...        ...
    2019-12-25  49.98  49.05  49.45  49.48  207776.34
    2019-12-26  49.90  49.10  49.72  49.48  189935.42
    2019-12-27  51.68  49.42  49.85  51.29  504214.70
    2019-12-30  51.87  50.33  51.18  51.55  379296.95
    2019-12-31  54.03  52.00  52.00  53.07  562873.40
    
    [2244 rows x 5 columns]
    """

    图片描述

    以上我们介绍了除权和复权的定义,以及它们之间的区别,最重要的是在回测时需要考虑当股票发生拆分,合并或者分红时,股票价格因为除权而受到影响。后续我们会继续推出回测中如何去处理除权的情况。

    关于以上内容更多的探讨欢迎大家关注【元宵大师带你用Python量化交易】!!

    展开全文
  • 在量化交易中,我们开发了一个交易策略,需要对策略在历史行情数据上进行回测,那么我们该选择除权,还是复权,哪一种形式的行情数据呢? 除权通常是除权除息的简称,这两种情况会在走势图上出现不同程度的下跌缺口...

    在行情软件中经常会看到除权、复权选项,我们选择不同的选项,软件上股票的价格回相应地转换。

    在量化交易中,我们开发了一个交易策略,需要对策略在历史行情数据上进行回测,那么我们该选择除权,还是复权,哪一种形式的行情数据呢?

    除权通常是除权除息的简称,这两种情况会在走势图上出现不同程度的下跌缺口,我们称为除权缺口。

    除权除息会使投资者误认为是一个向下跳空缺口,如下所示:

    Python进阶量化交易专栏场外篇:股票数据的除权和复权

     

    如果根据除权的股价去计算股票涨跌幅显然是不对的,同花顺软件里面显示的是-52.49%。同样计算得到的各类指标也是毫无参考价值的。

    为了使得走势图能真实反映各股价趋势,除权除息后的价格是要经过复权处理后才有可比性。

    拿刚才的例子来说。2016年6月27日新希望收盘价为17.64元,第二天6月28日每十股转增10股,红利5.5元,那么股票除权之后的收盘价应该是(17.64 – 0.55) * 10 / (10 + 10) = 8.55元,6月28日的收盘价是8.38,真实涨跌幅应该是8.38 /8.55 - 1 = -1.99%,而不是软件上显示的-52.49%。

    当我们得到股票第一天的价格之后,通过真实涨跌幅的连乘计算,就可以计算出之后每一天的复权价,这个叫做后复权价。同样的,知道了股票最后一天的价格,那么反向处理也就可以计算出之前每一天的价格,这个叫做前复权价。

    接下来我们分别用接口获取“新希望”除权、前复权、后复权的行情数据,如下所示:

    # "除权"
    """
                 High    Low   Open  Close     Volume
    Date                                             
    2010-01-04  14.38  13.94  13.94  14.17  216924.78
    2010-01-05  14.28  13.85  14.22  14.18  107631.41
    2010-01-06  14.31  13.87  14.15  13.88   89684.00
    2010-01-07  13.97  13.38  13.80  13.48   85856.01
    2010-01-08  13.64  13.35  13.43  13.62   58864.09
    ...           ...    ...    ...    ...        ...
    2019-12-25  18.79  18.44  18.59  18.60  207776.34
    2019-12-26  18.76  18.46  18.69  18.60  189935.42
    2019-12-27  19.43  18.58  18.74  19.28  504214.70
    2019-12-30  19.50  18.92  19.24  19.38  379296.95
    2019-12-31  20.31  19.55  19.55  19.95  562873.40
    
    [2244 rows x 5 columns]
    """
    # "后复权"
    """
                  High     Low    Open   Close     Volume
    Date                                                 
    2010-01-04   75.15   72.85   72.85   74.05  216924.78
    2010-01-05   74.63   72.38   74.32   74.11  107631.41
    2010-01-06   74.79   72.49   73.95   72.54   89684.00
    2010-01-07   73.01   69.93   72.12   70.45   85856.01
    2010-01-08   71.28   69.77   70.19   71.18   58864.09
    ...            ...     ...     ...     ...        ...
    2019-12-25  261.18  256.31  258.40  258.54  207776.34
    2019-12-26  260.76  256.59  259.79  258.54  189935.42
    2019-12-27  270.07  258.26  260.48  267.99  504214.70
    2019-12-30  271.05  262.99  267.43  269.38  379296.95
    2019-12-31  282.31  271.74  271.74  277.30  562873.40
    """
    # "前复权"
    """
                 High    Low   Open  Close     Volume
    Date                                             
    2010-01-04   5.41   5.24   5.24   5.33  216924.78
    2010-01-05   5.37   5.21   5.35   5.33  107631.41
    2010-01-06   5.38   5.21   5.32   5.22   89684.00
    2010-01-07   5.25   5.03   5.19   5.07   85856.01
    2010-01-08   5.13   5.02   5.05   5.12   58864.09
    ...           ...    ...    ...    ...        ...
    2019-12-25  18.79  18.44  18.59  18.60  207776.34
    2019-12-26  18.76  18.46  18.69  18.60  189935.42
    2019-12-27  19.43  18.58  18.74  19.28  504214.70
    2019-12-30  19.50  18.92  19.24  19.38  379296.95
    2019-12-31  20.31  19.55  19.55  19.95  562873.40
    
    [2431 rows x 5 columns]
    """
    

    初步看在2010年1月的股价,除权和前复权、后复权相差较大。接下来可视化收盘价进行对比:

    Python进阶量化交易专栏场外篇:股票数据的除权和复权

     

    Python进阶量化交易专栏场外篇:股票数据的除权和复权

     

    图中可知他们相差甚大,用除权数据执行策略回测效果会和真实情况相差很多。于是,当我们获取的数据为除权数据时,我们需要转换为前复权/后复权数据。

    这里的关键是获取到刚才提到的真实涨跌幅数据,这样我们可以在该数据的基础上计算出前/后复权因子。我们以前复权为例,如下所示:

    """
    trade_date
    2019-12-31    0.97
    2019-12-30    0.97
    2019-12-27    0.93
    2019-12-26    0.93
    2019-12-25    0.93
                  ... 
    2010-01-08    0.25
    2010-01-07    0.26
    2010-01-06    0.27
    2010-01-05    0.27
    2010-01-04    0.26
    Name: fd_factor, Length: 2244, dtype: float64        
    """
    

    如果未包含涨跌幅数据时,根据除权股价所计算得到的涨跌幅是不正确的。以下pct_chg1为除权股价的涨跌幅,可见与原始的涨跌幅pct_chg差别很大,pct_chg2为差值。

    """
                pct_chg  pct_chg1  pct_chg2
    Date                                   
    2010-01-04     2.83       NaN       NaN
    2010-01-05     0.07  7.06e-04      0.07
    2010-01-06    -2.12 -2.12e-02      2.10
    2010-01-07    -2.88 -2.88e-02      2.85
    2010-01-08     1.04  1.04e-02      1.03
    ...             ...       ...       ...
    2019-12-25     0.38  3.78e-03      0.37
    2019-12-26     0.00  0.00e+00      0.00
    2019-12-27     3.66  3.66e-02      3.62
    2019-12-30     0.52  5.19e-03      0.51
    2019-12-31     2.94  2.94e-02      2.91
    
    [2244 rows x 3 columns]
    
    """
    

    处理完成后,我们再次可视化“新希望”的收盘价数据,如下所示。可见将除权股价复权后,与前复权曲线重合。

    Python进阶量化交易专栏场外篇:股票数据的除权和复权

     

    对于后复权来说,选取初始价格不同相应计算得到的复权价格也会不一样。比如我们从2010年1月1日那天开始后复权得到的行情数据和收盘价走势图如下所示:

    # "后复权"
    """
                 High    Low   Open  Close     Volume
    Date                                             
    2010-01-04  14.38  13.94  13.94  14.17  216924.78
    2010-01-05  14.28  13.85  14.22  14.18  107631.41
    2010-01-06  14.31  13.87  14.15  13.88   89684.00
    2010-01-07  13.97  13.38  13.80  13.48   85856.01
    2010-01-08  13.64  13.35  13.43  13.62   58864.09
    ...           ...    ...    ...    ...        ...
    2019-12-25  49.98  49.05  49.45  49.48  207776.34
    2019-12-26  49.90  49.10  49.72  49.48  189935.42
    2019-12-27  51.68  49.42  49.85  51.29  504214.70
    2019-12-30  51.87  50.33  51.18  51.55  379296.95
    2019-12-31  54.03  52.00  52.00  53.07  562873.40
    
    [2244 rows x 5 columns]
    """
    

    Python进阶量化交易专栏场外篇:股票数据的除权和复权

     

    以上我们介绍了除权和复权的定义,以及它们之间的区别,最重要的是在回测时需要考虑当股票发生拆分,合并或者分红时,股票价格因为除权而受到影响。后续我们会继续推出回测中如何去处理除权的情况。

    展开全文
  • 数据如何除权

    2019-04-27 15:53:16
    http://www.allparty.cn/yong-Python-zhua-qu-da-zhi-hui-chu-quan-shu-ju.html http://blog.sina.com.cn/s/blog_6db27d350102w6tk.html
  • 3 案例:股票K线数据重采样 DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None,kind=None,) 频率转换和时间序列重采样,对象必须具有类似日期时间的索引(DatetimeIndex,PeriodIndex或...
  • 大智慧权息数据格式

    千次阅读 2012-01-09 11:47:09
    股票数据格式文档 2009.11.09 增加大智慧权息数据格式 权息数据文件为 full.PWR 基本数据结构如下 struct pwr_Data { __time32_t t1; float f1; float f2; float f3; float f4; }; 导出数据格式为...
  • 通达信数据格式

    万次阅读 2018-03-08 14:19:28
    文件存储路径:tdx\T0002\hq_cache\block.dat 文件存储格式: 文件头:384字节 板块个数:2字节 各板块数据存储结构(紧跟板块数目依次存放) 每个板块占据的存储空间为2812个字节,可最多包含399个个股 板块...
  • tushare之“前复权”

    千次阅读 2019-07-23 09:09:44
    通过上一篇文章《量化交易系统之python+mysql(二)》的内容,已经可以将需要的实时A股数据写入到mysql,与股票分析软件做对比,“开盘价”,“收盘价”等,却发现,有的数据相同,有的数据完全不一样,同样是通过...
  • 用于批量下载股票历史的每日收盘价,开盘价,最低,最高价等信息,可用于大数据分析,机器学习数据使用
  • 近年来A股市场跌宕起伏真特么精彩,...到处查资料,得知通达信的权息文件数据齐全,不仅含有除权除息数据,还含有限售解禁、增发、可转债上市等股本变化数据 ——这对于某些对成交量变化敏感的交易模型是非常重要的
  • **沪深股票除权除息、配股增发全量数据,截止 2016.12.31 **http://dataju.cn/Dataju/web/datasetInstanceDetail/344 **上证主板日线数据,截止 2017.05.05,原始价、前复权价、后复权价,1260支股票 **...
  • 证券宝www.baostock.com是一个免费、开源的证券数据平台。提供大量准确、完整的证券历史行情数据、上市公司财务数据、实时证券行情推送服务等。... 本次介绍 接口:获取除权除息信息query_dividend_data()...
  • 通达信目录文件结构及说明

    千次阅读 2015-04-04 23:36:46
    vipdoc:下载或缓存的历史数据目录 diary:投资日志目录 RemoteSH:缓存的上海F10 RemoteSZ:缓存的深圳F10 Ycinfo:缓存的公告消息 安装目录下的SZ.*,SH.*是缓存的盘中数据文件 T0002:个人信息目录,内有公式和自选...
  • 大智慧股票本地数据读取接口(含源码)

    千次下载 热门讨论 2009-03-22 13:45:51
    除权数据(cncq)结构 字段名 含义 类型 备注 dm 代码 char rq 日期 date fh 分红 num sgbl 送股比例 num pgbl 配股比例 num pgjg 配股价格 num ◎股本数据(cngb)结构 字段名 含义 ...
  • 通达信 除权除息 (tdx gbbq) 导出为文本文件了。 QQ2467194159 转载于:https://my.oschina.net/u/1771884/blog/26445...
  • 除权的非诉救济机制研究 截取及利用
  • 金融数据分析与挖掘具体实现方法

    千次阅读 2018-09-22 11:03:36
    有人让我写一下关于数据挖掘在金融方面的应用,再加上现在金融对数据方面的要求不断提高,准备用两篇随笔来做个入门总结。 首先,在看这篇随笔以前稍微补充一点金融方面的知识,因为我不是金融专业的,以下补充知识...
  • 钱龙数据格式详细

    千次阅读 2007-09-30 11:32:00
    (三)钱龙网络版动态数据格式(即ml30/lond/dat下的数据格式) // Set the default value #define EXCH_MIN 240 #define EXCH_A 9*60+30 #define EXCH_AE 11*60+30 #define EXCH_B 13*60+00 #define EXCH_BE 15*60...
  • 股权登记日和除权除息日

    千次阅读 2018-08-08 11:07:22
    上市公司会进行分红或送股,具体什么时间买入能享受到这些福利呢,我们要先弄清楚几个日期。     股权登记日 (date of record)是指董事会规定的登记有权领取股利的股东...参数含义及返回数据如下所示:
  • 本文所收集的数据集来自互联网,并将学习数据挖掘、机器学习、深度学习过程遇到的一些数据集加入其中,可能有些数据集随着时间的流逝链接会失效。 1,气候监测数据集http://cdiac.ornl.gov/ftp/ndp026b  2...
  • 下载下来的数据是未经除权除息的。在进行数据分析时,需要先进行除权除息。这里的关键是看前收盘和上一交易日的收盘价之间的差值。如果这个值不相同,则说明这是一个除权除息日,需要向前除权。需要注意,停牌期间的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 752
精华内容 300
关键字:

除权数据