[Tushare+Python] AH股轮动策略基础

摘要:为做AH股轮动策略需进行基础数据处理,这里代码主要涉及AH溢价计算及相关数据清洗。


文章目录

  • [Tushare+Python] AH股轮动策略基础
  • 前言
  • 一、记录尚未解决的问题
  • 二、数据处理清洗

前言

核心思路:计算AH股溢价率并计算每个股票当前溢价率在其历史分位值上位置,为后续策略提供基础信息。

一、记录尚未解决的问题

  1. 合并AH股数据需要找到唯一索引key,经几次merge,发现可按公司fullname进行交集合并。截至2021年6月10日,同时在AH股上市的公司(除去ST)共130家。而按fullname合并可以获得126家数据,对于初步探索尚可接受。 后续可找出这4家再手动调整。
  2. H股数据尚未复权(已解决)
  3. 因AH除权除息日期可能不同,除权因子也可能不同,采用何种复权方式以及如何处理除权除息还需考虑

二、数据处理清洗

代码如下:

import matplotlib.pyplot as plt
import pandas as pd
import tushare as ts
import time
import datetime as dt
pro= ts.pro_api()'''
P1:
obtain tickers of AH share, named as stock_list_H,stock_list_A
'''# step 1.1 : obtain all stock_ticker in A and Hdf_H_bas = pro.hk_basic(fields='ts_code,fullname,list_date').rename(columns= {'list_date':'list_H','ts_code':'ts_code_H'})df_A_bas= pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,fullname,area,industry,list_date,is_hs').rename(columns= {'list_date':'list_A','ts_code':'ts_code_A'})# step 1.2 : inner merge
df_com = pd.merge(df_H_bas,df_A_bas,how= 'inner',on = ['fullname'])# step 1.3 : to_list and store
stock_list_H = df_com.ts_code_H.tolist()
stock_list_A= df_com.ts_code_A.tolist()'''
P2
obtain market data separately and merge
'''# step 2.1 : obtain market data in A_share, named as df_A_mar
df_A_mar=pd.DataFrame()for ticker in stock_list_A:    df_A_mar= df_A_mar.append(ts.pro_bar(ts_code=ticker, adj='qfq',adjfactor=True)[['ts_code','trade_date','close','pre_close','pct_chg','adj_factor']])df_A_mar.rename(columns=lambda x:(x+'_A'), inplace=True)
df_A_mar.rename(columns={'trade_date_A':'trade_date'}, inplace=True)
# save temp data
#df_A_mar.to_csv('./df_A_mar.csv',index=False)# step 2.2 : obtain market data in H_share, named as df_H_mardf_H_mar=pd.DataFrame()# import time modu to control downloading frequency because of quota limitations
for i, ticker in enumerate(stock_list_H): df_H_mar= df_H_mar.append(pro.hk_daily(ts_code=ticker))if i % 98 ==0:time.sleep(60)df_H_mar.rename(columns=lambda x:(x+'_H'), inplace=True)
df_H_mar.rename(columns={'trade_date_H':'trade_date'}, inplace=True)# step 2.3 : seperately add fullname as merging indexdf_A_mar = pd.merge(df_A_mar,df_A_bas,how = 'left', on ='ts_code_A')
df_H_mar = pd.merge(df_H_mar,df_H_bas,how = 'left', on ='ts_code_H')# inner merge to keep date that stocks are listed in both A & H only
df_final = pd.merge(df_A_mar,df_H_mar,how= 'inner',on= ['fullname','trade_date'])# save temp_final
#df_final.to_csv('./df_final.csv',index=False)'''
P3
observation  and check
'''# step 3.1 : verify data;
## take extra attention to DR date  #df_final = pd.read_csv('./df_final.csv')# take zsyh as an example
df_zsyh = df_final[df_final.fullname == '招商银行股份有限公司']# compare with data from wind
# compare EX DR price
# 港股数据没有复权,同时没有港股复权因子,但数据库提供的涨跌幅是复权后的涨跌幅;以最后一天收盘价为基础,以前每天通过涨跌量倒推形成复权行情数据
df_zsyh.close[1:] = (df_zsyh.close_H -df_zsyh.change_H)[:-1]
df_zsyh=df_zsyh[['trade_date','open']]# OK check'''
对港股全部收盘价进行前复权
method:
1. calculate (close - change) for each day to form a new dataframe [adjust_close,ts_code,pretrade_date ], called df_temp ;
# 2. merge df_final and df_temp on [ts_code,left_on= trade_date, right_on = pretrade_date]
***按照这种方法复权,一定要在合并前对港股数据进行复权!!不然会有数据缺失和遗漏,所以实际这一p应该在2p之前
'''#step 1 : import calender data and merge#calender data from tushare
df_calender = pro.query('trade_cal', is_open=1,fields=['is_open','pretrade_date','cal_date']).rename(columns={'cal_date':'trade_date'})# step 2 : set all dates to datetime typedf_final.trade_date = pd.to_datetime(df_final.trade_date,format= '%Y%m%d')
df_calender.trade_date = pd.to_datetime(df_calender.trade_date,format= '%Y%m%d')
df_calender.pretrade_date = pd.to_datetime(df_calender.pretrade_date,format= '%Y%m%d')df_final = pd.merge(df_final,df_calender,on= ['trade_date'],how = 'left')
df_final.drop(columns=['is_open'],inplace=True)df_final.sort_values(by = ['ts_code_A','trade_date'],inplace=True,ascending = False)
df_final.reset_index(inplace=True,drop=True)df_aux = df_final.groupby('ts_code_A').rolling(1000000,min_periods =1,on = 'trade_date').change_H.sum().reset_index()
df_aux.rename(columns = {'change_H':'change_H_adj'},inplace=True)df_final = pd.merge(df_final,df_aux, on =['ts_code_A','trade_date'],how='left')df_aux = df_final.groupby('ts_code_A').close_H.first().reset_index()
df_aux.rename(columns = {'close_H':'close_H_last'},inplace=True)
df_final = pd.merge(df_final,df_aux, on =['ts_code_A'],how='left')df_final['close_adj'] = df_final.close_H_last -df_final.change_H_adjdf_temp = df_final[['close_adj','ts_code_A','pretrade_date']].copy().rename(columns={'pretrade_date':'trade_date'})# step 3 : delete close_adj columns in df_final before merging
df_final.drop(columns=['close_adj'],inplace=True)# step 4 : merge
df_final = pd.merge(df_final,df_temp,how = 'left', on = ['ts_code_A','trade_date'])# step 5 : the close_adj of the newest day is null, fill it with close_H , here close_adj is the exact qfq pricedf_final.close_adj.fillna(df_final.close_H,inplace=True)
df_final.drop(columns=['close_H'],inplace=True)
df_final.rename(columns={'close_adj':'close_H'},inplace=True)'''
P4
AH_premium_rate
'''
# step 1  : observation, take zsyh as an example ;check whether  data is consistent with data from winddf_final['premium_rate'] = df_final.close_A/df_final.close_Hdf_zsyh = df_final[df_final.fullname == '招商银行股份有限公司']df_zsyh.to_excel('./df_zsyh.xlsx')# TBD..放假回来再写# percentile calculation
pctrank = lambda x: pd.Series(x).rank(method='max',pct=True).iloc[-1]df_zsyh.sort_values(['Date'],inplace=True)df_zsyh.reset_index(drop=True,inplace =True)# 计算分位值,最小五年 滚动十年
df_zsyh['prem_percentile']=df_zsyh.rolling(2000,min_periods = 750,on='Date').premiumrate_ah.apply(pctrank).reset_index()['premiumrate_ah']# 删除不够五年的
df_zsyh.dropna(subset=['prem_percentile'],inplace=True)df_zsyh['threshold'] =( df_zsyh.prem_percentile <= 0.2).apply(lambda x :int(x))df_zsyh.sort_values(['Date'],inplace=True)df_zsyh['threshold'] = df_zsyh['threshold'] *df_zsyh['close']plt.plot(df_zsyh.Date,df_zsyh.close,c= 'b')
plt.scatter(df_zsyh.Date,df_zsyh.threshold,c = 'r')

[Tushare+Python] AH股轮动策略基础相关推荐

  1. 搭建系统|继承backtrader的本地量化回测平台如何玩转多股轮动策略!

    前言 一个完整的量化交易系统离不开人机交互功能的应用,特别是在回测阶段,我们需要不断更改参数因子.更换交易策略以应对当前的市场.因此创建完整的.功能键全的GUI用户界面至关重要. 市面上也出现了很多相 ...

  2. 抱团股会一直涨?无脑执行大小盘轮动策略,轻松跑赢指数5倍【附Python代码】

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. 前言: 巴蛇吞象,扬州跨鹤.人性之贪婪,逝者如此, ...

  3. 股债轮动策略之行业版

    股债轮动策略之行业版 雪球上的 宜昌白云飞 的原创专栏里有一个系列文章, 现将其摘录如下: 年化20%七年无亏损的简单策略--股债轮动行业版(一) https://xueqiu.com/1884493 ...

  4. html如何设置轮动,手把手教你构建轮动策略

    A股市场具有明显的大小盘风格轮动现象,比如2015年以中证500为代表的中小盘全面跑赢沪深300指数(大盘),但在随后的几年中沪深300指数成为市场的主流,收益也大幅跑赢中证500. 而最近一年,市场 ...

  5. 量化选股——基于动量因子的行业风格轮动策略(第1部分—因子测算)

    文章目录 动量因子与行业轮动概述 动量因子的理解 投资视角下的行业轮动现象 投资者视角与奈特不确定性 动量因子在行业风格上的效果测算 动量因子效果测算流程概述 1. 行业选择:申万一级行业 2. 动量 ...

  6. akshare改写公募基金轮动策略

    群友说,行业指数不行,没办法跟买.这次我换成了etf进行动量策略,选择本周上涨最强的5个etf,平均持仓,一周后移仓.查看回测效果. 不废话,上传代码,但还是有点毛糙.下次加上日期这些数据,做成df格 ...

  7. 黄金避险有效?量化实测黄金资产与A股轮动真实收益

    通过持有黄金避险,是长期以来资产配置领域的话题.有古话"盛世藏古董,乱世藏黄金"就是说明这个道理,国际经济环境中,投资者一般都认同:一旦经济进入低迷期,股票.房地产.原油.期货等大 ...

  8. 量化选股——基于动量因子的行业风格轮动策略(第2部分—策略回测)

    文章目录 1. 交易策略 2. Backtrader回测程序 3. 回测效果 3.1 2020年1月1日 - 2021年1月1日 3.2 2021年1月1日 - 2022年1月1日 3.3 2022年 ...

  9. 量化交易 聚宽 市场ETF精选轮动策略(模拟交易)

    策略流程 回测结果 代码 # 导入函数库 from jqdata import * from six import BytesIO

最新文章

  1. Linux内核官方文档atomic_ops.txt【摘自Linux 内核文档】
  2. 织梦防html5,最近织梦DEDECMS被注入漏洞,如何做好防护措施。
  3. php 循环打开目录读取文件
  4. python第一周小测验_荐测验1: Python基本语法元素 (第1周)
  5. hihocoder-1615-矩阵游戏II
  6. Linux共享文件夹中毒,Linux find命名快速查找中毒文件操作实例
  7. OpenCASCADE绘制测试线束:拓扑命令之纹理映射到形状
  8. 网络I/O模型--04非阻塞模式(解除accept()、 read()方法阻塞)的基础上加入多线程技术...
  9. 高精度地图的学习笔记
  10. 设计模式之adapter模式
  11. JavaScript—call, apply, bind 函数(20)
  12. 七月算法机器学习 6 特征工程 小案例
  13. uniapp app 腾讯云 IM 通讯 UserSig 加密协议方案
  14. ◎Hspace 和vspace 的设定
  15. python修改系统时间_python修改操作系统时间的方法
  16. S3C2440-裸机篇-05 | S3C2440时钟体系详解(FCLK、PCLK、HCLK)
  17. [人工智能-深度学习-38]:卷积神经网络CNN - 常见分类网络- ResNet网络架构分析与详解
  18. 新课改计算机论文,新课改论文
  19. AgentWeb-Android-H5混合开发
  20. jxls2-java生成/导出excel工具!基于jxls2写的jxls增强版jxlss的完整教程

热门文章

  1. (个人杂记)第八章 按键输入实验
  2. sentence Bert解读及代码示例
  3. Java游戏编程---第一章 2D图形和动画
  4. JavaWeb-07-HTML学习笔记
  5. 梅林 自动订阅_如何为4万名订阅者编写自动令牌空投脚本
  6. 主流币仍被摁在地上摩擦,平台币已扬起一场美丽的春梦
  7. tkinter窗口布局pack方法详解
  8. 常用方法(图片逆光度、傅里叶变换、寻找波峰波谷、计算俯仰/侧脸)
  9. 【阿冈心情】住了15年医院的阿冈怕进医院!
  10. 灵魂发问,Java并发和线程池,只言片语真的可以讲清楚吗?