1、策略概述

北向资金是指通过港交所流入A 股的资金,资金来源可能是外资、港资,也有可能是国内借道香港的“出口转内销”资金,托管方是在香港营业的银行或者券商。北向资金总体上主要流向白马股,它们的规模虽然在A股市场中的比例不大,但是从2014年底以来,长期持续流入的北向资金在一定程度上影响了A股市场的因子风格,而北向资金自己也在其中获取了丰厚的回报。
因此,参考北向资金进行投资,是一个值得探讨的方向。有的研究报告将北向资金又分成托管在银行的资金和托管在券商的资金,认为前者持仓相对较长,是白马股的坚定持有者,后者更类似短期炒作资金,虽然交易标的物也是白马股,但是并不是被动持仓,而会根据市场的短期情况高抛低吸。由于数据源的原因,无法拿到北向资金的托管数据,因此本贴子只关注总体情况。

2、策略规则

1、取北向资金的每日总数,生成其 bollinger 指标,公式为:

mid = sma(north_money, 252)
up_band = mid + std(north_money, 252) * 1.5
dn_band = mid - std(north_money, 252) * 1.5

2、当某日的北上资金总额上穿 up_band,第二天开盘时在沪深300指数上开多;下穿 dn_band 时,第二天开盘时在沪深300指数上平多。
3、暂不考虑手续费和滑点

3、策略实现

1、数据从本地数据库中获取。
2、策略在自建的事件驱动框架上实现,相关介绍见 自建基于事件驱动的策略回测、因子/指标计算框架简介
3、show me the code

from abc import ABC
from os import getcwd
from os.path import basename, abspath, dirname
from pandas import Series
from time import strftime
from typing import List, Dict
from numpy import nanfrom core.const import Product, Slippage, db_dict
from core.utility import Timer, ColorLogger
from strategy.strategy_equity import StrategyEquity
from data_center.access_data_sqlite import connect_ts, connect_db, connect_dolphindb_dailyclass NorthMoneyTiming(StrategyEquity, ABC):def __init__(self,clog: any,start: str, end: str, account: List, geteway: str = 'quandomo'):super(NorthMoneyTiming, self).__init__(clog, start, end, account, geteway)self.set_trading_cost('zero')# 指标值self.indicator_value = self.get_indicator()# 取指数数据cur_sql = f"select ts_code,trade_date,open,high,low,close,vol from index_daily " \f"where ts_code='000300.SH'"self.index_daily = self.db_ts.get_data(cur_sql, 'frame', 'trade_date')# self.index_daily = self.index_daily.reset_index().set_index(['ts_code', 'trade_date'])self.index_daily = self.index_daily.reset_index()self.index_daily['sma20'] = self.index_daily['close'].rolling(20).mean()def get_indicator(self) -> Series:"""取指标值"""cur_sql = f"select trade_date,north_money from moneyflow_hsgt " \f"where trade_date between '{self.start}' and '{self.end}' and north_money != 0"cur_indicator = self.origin_db_list[0].get_data_from_sqlite(cur_sql, 'frame').set_index('trade_date')cur_indicator['ma'] = cur_indicator['north_money'].rolling(252).mean()cur_indicator['std'] = cur_indicator['north_money'].rolling(252).std()cur_indicator['up_band'] = cur_indicator['ma'] + cur_indicator['ma'] * 1.5cur_indicator['dn_band'] = cur_indicator['ma'] - cur_indicator['ma'] * 1.5return cur_indicatordef get_trade_signal(self, dt: str) -> int:""" 生成交易信号 """signal = 0try:if self.pre_dt and self.indicator_value.loc[self.pre_dt, 'ma'] is not nan:if self.indicator_value.loc[self.pre_dt, 'north_money'] < self.indicator_value.loc[self.pre_dt, 'up_band'] \and self.indicator_value.loc[dt, 'north_money'] >= self.indicator_value.loc[dt, 'up_band']:signal = 1elif self.indicator_value.loc[self.pre_dt, 'north_money'] >= self.indicator_value.loc[self.pre_dt, 'dn_band'] \and self.indicator_value.loc[dt, 'north_money'] < self.indicator_value.loc[dt, 'dn_band']:signal = -1except (KeyError, ValueError, IndexError, NameError):passreturn signaldef handle_bar(self, event_bar):""" 逐个 bar 运行回测 """self.activate_trade_signal = Falseself.trade_signal[event_bar.dt] = self.get_trade_signal(event_bar.dt)if self.trade_signal[event_bar.dt] > 0 and self.market_position('000300.SH') < 1:self.position_lst[event_bar.dt] = ['000300.SH']self.activate_trade_signal = True   # 已有交易,本日不再做资产调整elif self.trade_signal[event_bar.dt] < 0 and self.market_position('000300.SH') > 0:self.position_lst[event_bar.dt] = []self.activate_trade_signal = True  # 已有交易,本日不再做资产调整def handle_trade(self, event_trade):""" 委托成交 """super(NorthMoneyTiming, self).handle_trade(event_trade)self.context.logger.info(f'-- [on_trade] {event_trade.data.symbol} 在 {event_trade.data.datetime} 的委托单 'f'{event_trade.data.order_id} [{event_trade.data.comments}],开盘后成交,'f'成交价格是 {event_trade.data.price}, 成交量是 {round(event_trade.data.volume, 2)}')if __name__ == "__main__":root_path = abspath(dirname(getcwd()))      # 取本脚本文件所在目录的父目录export_path = '/export/'# 新建 log 文件log_path = '/log/'log_name = f"{basename(__file__)[:-3]} {strftime('%Y-%m-%d_%H%M%S')}.log"color_logger = ColorLogger(log_name=root_path + log_path + log_name)strat_account = [{'name': 'MyAccount', 'equity': 20000000}]benchmark = '000300.SH'cur_start_date = '20141117'cur_end_date = '20210407'   # '20210223'# end_date = f"{strftime('%Y%m%d')}"fields = ['open', 'high', 'low', 'close', 'volume']strategy_type = 'timing_only'# 显示运行完整个策略所需时间time_test = Timer(True)with time_test:color_logger.info(f'**************** 开始运行策略 *****************')color_logger.info(f'')# 策略实例化,并给变量赋值trial_strategy = NorthMoneyTiming(clog=color_logger,start=cur_start_date,end=cur_end_date,account=strat_account)trial_strategy.run_strategy(fields, strategy_type)trial_strategy.performance_analysis(root_path + export_path, benchmark)  # 绩效分析trial_strategy.plot_results(root_path + export_path, basename(__file__)[:-3])

4、策略绩效

1、策略净值曲线

2、绩效统计

3、策略的逐月回报统计

参考资料:
1、2020-08-03,北向资金走向预示市场短期或震荡——华泰金工量化资产配置 7月月报

择时策略 —— 基于北上资金的沪深300指数择时相关推荐

  1. 择时策略 —— 基于 RSRS 指标的沪深300指数择时

    1.策略概述 RSRS 指标是每天将最近 N 根 k 线的最高价.最低价进行回归后的 beta 值(斜率),如果斜率值比较大,即支撑强度大于阻力强度,价格后续上涨的可能性比较大,其他情况以此类推. 参 ...

  2. 择时策略 —— 基于扩散指标的沪深300指数择时

    1.策略概述 扩散指标的原始值是最近一段时间以来,股票池中符合要求的股票占股票池总数的比例,如果这个指标值比较高,一般认为说明市场方向性比较明确.理论上来说,任何单个股票的指标都能"扩散化& ...

  3. 沪深300指数进行择时,看看能否获取超额收益

    一 研究问题 尝试对沪深300指数进行择时,看看能否获取超额收益. 当模型预测到指数未来10个交易日的收益率大,则买入,否则持有现金. 二 初步的结论 沪深300指数的未来10个交易日的收益具有一定的 ...

  4. Barra 结构化风险模型实现(1)——沪深300指数的风格因子暴露度分析

    米筐科技(RiceQuant)策略研究报告:Barra 结构化风险模型实现(1)--沪深300指数的风格因子暴露度分析 江嘉键 1 年前1 概述 Barra 结构化风险模型是全球知名的投资组合表现和风 ...

  5. 结构化风险模型----转:沪深300指数的风格因子暴露度分析(一)

    from: https://xueqiu.com/7381621247/73649418 1 概述 Barra 结构化风险模型是全球知名的投资组合表现和风险分析工具.最近一段时间,我们米筐科技量化策略 ...

  6. tushare获取沪深300指数历史_TuShare -财经数据接口包

    在Pro版接口中,我们也增加了通用通用行情接口,可以方便获得各种资产各种频度的数据,欢迎使用. 获取个股历史交易数据(包括均线数据),可以通过参数设置获取日k线.周k线.月k线,以及5分钟.15分钟. ...

  7. python分析数据走势图_左大营 | python数据分析篇系列1——探索沪深300指数(附代码)(中)...

    探索沪深300指数(HS300)--基于Python(中) [承接上文] 写在前面:本文只做分析,提供观点,不构成投资建议 如需转载请微信联系:eosO_oke 佛系更新,关注不迷路 沪深300指数是 ...

  8. 沪深300指数市盈率粗算

    根据中证指数发布的2015-12-11的数据,沪深300在3608点的市盈率是14.42倍. 这样简单粗略推算: 2014年6月时沪深300指数2100点的市盈率是8.4倍 2015年6月时沪深300 ...

  9. 【系统收藏——中天证券创鑫软件 官方版 [同时支持三板、港股行情、沪深300指数。]】

    中天证券创鑫软件是中天证券自主研发,多位资深咨询师智慧的结晶.同时支持三板.港股行情.沪深300指数.中天证券创鑫软件支持绿色通道.支持开放式基金. 功能介绍 闪电下单;支持多帐户操作;行情交易合一. ...

最新文章

  1. Learn OpenGL (五):向量
  2. 工作10年从大公司离职去小公司当CTO,被同事鄙视竟然不回netty
  3. 深度残差网络 - Deep Residual Learning for Image Recognition
  4. memento模式_Java中的Memento设计模式-示例教程
  5. rust投递箱连接箱子_海门市围板箱定制围板箱内衬
  6. 线性规划——单纯形法
  7. Python学习笔记(15)-Python常用模块总结
  8. datastore java_Java Datastore.find方法代码示例
  9. 服务器设置静态IP地址教程,在Ubuntu服务器18.04上设置静态IP地址
  10. Nature综述:Rob Knight带你分析微生物组数据
  11. three.js加载3D模型,在网页上展示3D模型(.glb.gltf.fbx格式)
  12. 广义表的概念及存储表示
  13. 守护云原生安全,青藤让浙江移动“心里更有底”
  14. 女人最想让男人知道的48件事(zt)
  15. 愤怒的老王,每天都想暗杀一个同事...
  16. 畅想未来计算机的绘画作品小学生,畅想未来儿童画绘画作品
  17. 博客系统与CSDN博客
  18. 写给初学JAVA的人
  19. 介绍一款2023年新出的mysql管理工具: FlyBird Database Manager
  20. Android 设备蓝牙连接扫描枪获取扫描内容

热门文章

  1. Ariduino入门笔记——9. Arduino 默认函数(串口通信)
  2. 操作系统实验--30天自制操作系统第5天实验日志
  3. c语言数组元素下标下限1,C语言中,数组元素的下标下限为
  4. 词法、语法、语义分析实验
  5. 抖音矩阵系统,短视频矩阵系统,抖音SEO源码。look here
  6. python 字符视频_Python20行代码实现视频字符化
  7. python做一个小游戏_12岁的少年教你用Python做小游戏
  8. 【概率论】条件概率与独立性题目
  9. [读书笔记]编程之美(三)
  10. AntDesign前端表格排序