github

1. tgw

https://github.com/tgw2023/tgw

2. AmazingQuant

https://github.com/zhanggao2013/AmazingQuant

上文已经详细介绍了K线的获取方式,有了行情数据就可以做指标计算了。

但由于上市公司的分红送股,股价除权除息,导致除权除息前后的行情数据不连续,影响了指标计算的连续性。因此,需要先计算复权行情数据,再做指标计算。

一、复权算法介绍

1. 单次复权因子

单次复权因子的计算有两种计算方法:

(1) 根据交易所行情数据计算

这种计算方式与交易所价格一致,但策略回测时的收益计算不包含分红再投资收益,对收益率有一定影响。

(2) 根据除权除息数据计算

比例 = 送股比例 + 转增比例 + 缩减比例

这种计算方式与交易所价格不一致,但策略回测时的收益计算包含分红再投资收益。

第一种方式简单实用,第二种方式收益计算更准确,个人认为第一种完全可以适用,但也对两种方式都做出说明和代码示例。

2. 前复权

最近的交易日作为基点,原始行情数据乘以前复权因子,得到前复权行情数据,从使得最新的真实行情数据与前复权行情数据相等;

前复权的优点在于,指标计算的最新行情数据与委托价格相等;

3. 后复权

最早的交易日作为基点,原始行情数据乘以后前复权因子,得到前复权行情数据,从使得最新的真实行情数据与前复权行情数据相等;

后复权的优点在于,策略回测可避免一部分因分红配股产生的未来数据;

4. 累计复权因子计算

为方便与原始行情数据相乘,累计复权因子的数据结构为矩阵,column为股票代码,index为交易日历。

后复权因子的计算步骤如下:

(1)单次复权因子累乘;

(2)矩阵的index,从只有股份变动日扩充为全历史交易日历,并赋值nan延续前值;

(3)由于上市初期的一段时间可能没有分红配股,所以赋值这段时间的为1;

前复权因子等于后复权因子除以最新的单次复权因子;

二、根据交易所行情数据

tgw提供的复权因子接口为QueryExFactorTable,计算方法是根据交易所行情数据计算的;

获取并规整dataframe数据格式的核心代码如下

class UpdateAdjFactor(object):def __init__(self):passdef get_backward_factor(self, code_sh_list, code_sz_list, calendar_index):backward_factor = pd.DataFrame(index=calendar_index)market = 'SH'for market_type in [tgw.MarketType.kSSE, tgw.MarketType.kSZSE]:code_list = code_sh_listif market_type == tgw.MarketType.kSZSE:code_list = code_sz_listmarket = 'SZ'for code in code_list[:5]:adj_factor, _ = tgw.QueryExFactorTable(code)adj_factor.set_index(["ex_date"], inplace=True)adj_factor.sort_index(inplace=True)backward_factor[code+'.'+market] = adj_factor['cum_factor']backward_factor.replace([np.inf, 0], np.nan, inplace=True)backward_factor.fillna(method='ffill', inplace=True)backward_factor.fillna(1, inplace=True)return backward_factor

三、根据除权除息数据计算

tgw提供的除权除息数据接口为QueryThirdInfo,

根据除权除息数据,结合日线收盘价,实现后复权因子计算的核心代码如下


class UpdateAdjFactor(object):def __init__(self):passdef get_backward_factor_ratio(self, close_df, code_sh_list, code_sz_list, calendar_index):"""取当日收盘价,作为转、送的股价,再计算复权因子更新到AShareExRightDividend, 复权因子adj_factor比例 = 送股比例 + 转增比例 + 缩减比例单次复权因子 = 股权登记日收盘价 * (1 + 比例 + 配股比例 + 增发比例) /(股权登记日收盘价 - 派息比例 + 股权登记日收盘价 * 比例 + 配股价格 * 配股比例 + 增发价格 * 增发比例):return:"""ex_right_dividend_df = Nonemarket = 'SH'for market_type in [tgw.MarketType.kSSE, tgw.MarketType.kSZSE]:code_list = code_sh_listif market_type == tgw.MarketType.kSZSE:code_list = code_sz_listmarket = 'SZ'for code in code_list[:5]:task_id = tgw.GetTaskID()tgw.SetThirdInfoParam(task_id, "function_id", "A010030003")tgw.SetThirdInfoParam(task_id, "start_date", "20130101")tgw.SetThirdInfoParam(task_id, "end_date", "20991231")tgw.SetThirdInfoParam(task_id, "market_code", code+'.'+market)df, _ = tgw.QueryThirdInfo(task_id)if ex_right_dividend_df is None:ex_right_dividend_df = dfelse:ex_right_dividend_df = ex_right_dividend_df.append(df)ex_right_dividend_df['close'] = ex_right_dividend_df.apply(lambda x: self.get_adj_day_close(x['MARKET_CODE'], int(x['EX_RD_DATE']), close_df), axis=1)ex_right_dividend_df = ex_right_dividend_df.fillna(0)ratio = ex_right_dividend_df['BONUS_SHARE_RATIO'] + ex_right_dividend_df['CONVER_INCR_RATIO'] + ex_right_dividend_df['REDUCED_RATIO']ex_right_dividend_df['adj_factor'] = ex_right_dividend_df['close'] * (1 + ratio + ex_right_dividend_df['RIGHT_ISSUE_RATIO'] + ex_right_dividend_df['SEO_RATIO']) / (ex_right_dividend_df['close'] - ex_right_dividend_df['DIV_PAYOUT_RATIO'] + ex_right_dividend_df['close']* ratio + ex_right_dividend_df['RIGHT_ISSUE_PRICE'] * ex_right_dividend_df['RIGHT_ISSUE_RATIO'] +ex_right_dividend_df['SEO_PRICE'] * ex_right_dividend_df['SEO_RATIO'])ex_right_dividend_df = ex_right_dividend_df.reindex(columns=['MARKET_CODE', 'EX_RD_DATE', 'adj_factor','close'])ex_right_dividend_df.set_index(["EX_RD_DATE"], inplace=True)ex_right_dividend_df.sort_index(inplace=True)ex_right_dividend_df.fillna(method='ffill', inplace=True)backward_factor_ratio = pd.DataFrame(index=calendar_index)data_dict = dict(list(ex_right_dividend_df.groupby(ex_right_dividend_df['MARKET_CODE'])))for security_code, adj_data in data_dict.items():backward_factor_ratio[security_code] = adj_data['adj_factor'].cumprod(axis=0)print(backward_factor_ratio[security_code])print(adj_data['adj_factor'])backward_factor_ratio.replace([np.inf, 0], np.nan, inplace=True)backward_factor_ratio.fillna(method='ffill', inplace=True)backward_factor_ratio.fillna(1, inplace=True)backward_factor_ratio.sort_index(inplace=True)return backward_factor_ratio, ex_right_dividend_df, data_dictdef get_adj_day_close(self, security_code, date, close_df):security_code_market_data = 0try:security_code_market_data = close_df.loc[date, security_code]/1000000except KeyError:print(security_code, date, security_code_market_data)return security_code_market_data

四、前复权因子计算

前复权因子,需要每日计算更新,代码如下:

def cal_forward_factor(self, backward_factor):return backward_factor.div(backward_factor.iloc[-1])

复权算法详解与代码实现细节解析(tgw)——量化数据中台系列(六)相关推荐

  1. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  2. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  3. Go-AES算法详解与代码

    目录 AES 发展史 概述 轮函数F 字节代换 行移位 列混淆 轮密钥加 密钥编排 AES和DES的不同之处 分组模式CTR AES的Go实现 aes包 cipher包 加密/解密 参考 本篇介绍分组 ...

  4. 【分享实录】BANCOR算法详解及代码实现

    1 活动基本信息 1)主题:[区块链技术工坊22期]BANCOR算法详解及代码实现 2)议题: BANCOR算法的特点和优劣势 BANCOR算法和举例 如何加入BANCOR.NETWORK交易所 如何 ...

  5. 技术工坊|BANCOR算法详解及代码实现(上海)

    2019独角兽企业重金招聘Python工程师标准>>> EOS项目在RAM分配中采用了Bancor算法,并将RAM的价格爆炒到了很高的价位,凭借EOS项目在区块链领域的强大运营宣传能 ...

  6. 【区块链技术工坊22期实录】王登辉:BANCOR算法详解及代码实现

    1,活动基本信息 1)题目: [区块链技术工坊22期]BANCOR算法详解及代码实现 2)议题: 1)BANCOR算法的特点和优劣势 2)BANCOR算法和举例 3)如何加入BANCOR.NETWOR ...

  7. 算法 经典的八大排序算法详解和代码实现

    算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...

  8. [联邦学习] FedAvg聚合算法详解及代码实现

    该文章首发于若绾 [联邦学习] FedAvg聚合算法详解及代码实现,转载请标注出处. 论文原文:Communication-Efficient Learning of Deep Networks fr ...

  9. KMP算法详解及代码

    KMP算法详解及代码 KMP算法详解及代码 定义及应用 理论 基本概念 next 数组 总结 注意 代码 KMP算法详解及代码 最近正好在看字符串相关的算法内容,就顺便把KMP算法回顾了一下.相应的代 ...

最新文章

  1. 你真的了解JavaScript的比较运算符(==,!=,===,!===,=,=,,)吗?
  2. [导入]人的一生能有几天?
  3. C语言烧写C51单片机的线,51单片机烧写程序过程以及详细说明【图文】
  4. SAP Leonardo图片处理相关的机器学习服务在SAP智能服务场景中的应用
  5. MKNetWorkKit使用方法
  6. QueryDSL中包含通配符的字符串的精确匹配
  7. 龙头地位无可撼动!腾讯占全球游戏市场15% 连续6年登营收榜首
  8. 前端html+css+javascript
  9. js 定时器_Node.js实战6:定时器,使用timer延迟执行
  10. html checkbox 多选 根据数据库来显示选取和未选取,前端框架(2)DIV多选复选框框的封装和MySql数据库存取...
  11. php旧物交易开源代码_仿互站PHP源码 虚拟物品在线交易网站源码 附14套风格
  12. SQL Sever的安装教程
  13. 关于网站mdb数据库管理员MD5密码解密
  14. mysql 多维度统计_SQL统计——按照各种维度
  15. CGfsb [XCTF-PWN]CTF writeup系列2
  16. RST 和 Markdown
  17. eclipse neon Java编辑器页面字体更改
  18. 小鹤双拼鹤形教程-by小鹤双拼输入法QQ群友-45℃的回忆
  19. 微信小程序---全局/本地存储
  20. ~ 如何用C++自制一个日麻游戏 ~(一)大体框架构建 § 2 数据结构

热门文章

  1. 假设某袋子中装有3个红球,5个白球,6个黑球,现从该袋子中任意取出8个球,下面程序的功能是输出这8个球中至少有一个白球的所有方案。找出其中错误并改正之。
  2. ubuntu 18.04安装owncloud 搭建自己的私有云盘
  3. IDS,恶意软件,反病毒网关,密码学,ssl
  4. 微信小程序 wx.showToast() 更换icon图标
  5. C#专题 | TcpIp通信
  6. 圆圆的球像什么_关于圆圆的月亮像什么的句子有哪些?
  7. java内存管理白皮书_Java 内存管理白皮书
  8. 干货!C++程序的耦合性设计
  9. 科学家发现“超级原子” 元素周期表要扩大(图)
  10. equals判断字符串内容是否相同,equalsIgnoreCase,忽略英文大小写判断内容是否相同