魔改版小市值策略

策略思路

最近几年,小市值策略一直都收益不错(当然,不包含17年和18年)。小市值因子对收益的影响是很大的。特别是行情不好的时候,大家都忙着炒作热点,那么这时候符合题材的小市值更加符合炒作标准了。

为什么说是魔改版的小市值策略呢,因为最终选取小市值的方法真的很玄学。

上收益效果图:
在这里插入图片描述
三年多,有7.45倍的收益,实属夸张了哈。有这个收益,还要什么自行车啊。

那么,这个策略玄学在哪里呢。

核心想法:

1、选取100个市值最小的股票,剔除ST股、次新股、科创板、北交所股票等等。

2、从剩下的股票中对证券代码进行排序,这就是最玄学的地方。然后选取排序靠前的5只股票。

3、每周第一个交易日早上进行轮换。

核心代码

def monthly_filter(context):today = context.current_dtyesterday = today -  datetime.timedelta(days=1)start_day = today -  datetime.timedelta(days=375)yesterday = yesterday.strftime('%Y-%m-%d')# 选出小市值的股票q = query(valuation.code,valuation.circulating_market_cap).filter(valuation.circulating_market_cap.between(0,1000)).order_by(valuation.circulating_market_cap.asc()).limit(100)codes = get_fundamentals(q).code.tolist()# 筛选出主板、创业板股票codes = [code for code in codes if code[:2] in ('60','00','30')]# log.info("Top 10 小市值:" + str(codes[:10]))# 过滤ST股票df = get_extras('is_st', codes, end_date=yesterday,count=1)df = df.Tdf.columns = ['is_st']df=df[df['is_st']==0]codes = df.index.tolist()# 过滤次新股q = query(finance.STK_LIST.code).filter(finance.STK_LIST.start_date <=start_day,finance.STK_LIST.code.in_(codes))codes = list(finance.run_query(q).code)g.pools = set(codes)def weekly_filter(context):today = context.current_dtyesterday = today -  datetime.timedelta(days=1)start_day = today -  datetime.timedelta(days=375)yesterday = yesterday.strftime('%Y-%m-%d')codes = list(g.pools)if codes != []:# 过滤ST股票df = get_extras('is_st', codes, end_date=yesterday,count=1)df = df.Tdf.columns = ['is_st']df=df[df['is_st']==0]codes = df.index.tolist()# codes = filter_st_stock(codes)g.pools = set(codes)else:# 选出小市值的股票q = query(valuation.code,valuation.circulating_market_cap).filter(valuation.circulating_market_cap.between(0,1000)).order_by(valuation.circulating_market_cap.asc()).limit(100)codes = get_fundamentals(q).code.tolist()# 筛选出主板、创业板股票codes = [code for code in codes if code[:2] in ('60','00','30')]# 过滤ST股票df = get_extras('is_st', codes, end_date=yesterday,count=1)df = df.Tdf.columns = ['is_st']df=df[df['is_st']==0]codes = df.index.tolist()# 过滤次新股q = query(finance.STK_LIST.code).filter(finance.STK_LIST.start_date <= start_day,finance.STK_LIST.code.in_(codes))codes = list(finance.run_query(q).code)g.pools = set(codes)# log.info('每周五选定的股票:', g.pools)#1-1 准备股票池
def prepare_stock_list(context):#获取已持有列表g.hold_list= list(context.portfolio.positions.keys())#获取昨日涨停列表if g.hold_list != []:df = get_price(g.hold_list, end_date=context.previous_date, frequency='daily', fields=['close','high_limit'], count=1, panel=False, fill_paused=False)df = df[df['close'] == df['high_limit']]g.yesterday_HL_list = list(df.code)else:g.yesterday_HL_list = []# 获取今天的日期today = context.current_dttoday_Year = today.strftime('%Y')NewYears = {'2010': '02-14', '2011': '02-03', '2012': '01-23', '2013': '02-10', '2014': '01-31', '2015': '02-19', '2016': '02-08', '2017': '01-28', '2018': '02-16', '2019': '02-05', '2020': '01-25', '2021': '02-12', '2022': '02-01', '2023': '01-22', '2024': '02-10', '2025': '01-29', '2026': '02-17', '2027': '02-06', '2028': '01-26', '2029': '02-13', '2030': '02-03'}spring_festival_date = NewYears[today_Year]#判断今天是否为账户资金再平衡的日期 或者 元旦到春节之间的日期g.no_trading_today_signal = today_is_between(context, '04-05', '04-30') or today_is_between(context, '01-01', spring_festival_date)def get_stock_list(context):final_list = set()initial_list = list(g.pools)if len(initial_list) == 0:return []initial_list = filter_paused_stock(initial_list)initial_list = filter_st_stock(initial_list)today = context.current_dt# 通过timedelta算出前一天的日期delta = datetime.timedelta(days=1)yesterday = today - deltayesterday = yesterday.strftime('%Y-%m-%d')q = query(valuation.code, valuation.circulating_market_cap).filter(valuation.code.in_(initial_list)).limit(g.stock_num)codes = get_fundamentals(q).code.tolist()circulating_market_cap_list = get_fundamentals(q).circulating_market_cap.tolist()log.info('数据库拉取的股票数量:{}'.format(len(codes)))log.info('最小市值:{}, 最大市值:{}'.format(min(circulating_market_cap_list), max(circulating_market_cap_list)))final_list = codes.copy()print('final_list数量:{}'.format(len(final_list)))final_list = filter_paused_stock(final_list)print('过滤停牌后的股票数量:{}'.format(len(final_list)))final_list = filter_st_stock(final_list)log.info('每周一买入的股票数量:'.format(len(final_list)))return final_list#1-3 整体调整持仓
def weekly_adjustment(context):if g.no_trading_today_signal:return#获取应买入列表 target_list = get_stock_list(context)#调仓卖出for stock in g.hold_list:if (stock not in target_list) and (stock not in g.yesterday_HL_list):log.info("卖出[%s]" % (stock))order_target(stock, 0)else:log.info("已持有[%s]" % (stock))#调仓买入position_count = len(context.portfolio.positions)target_num = len(target_list)if target_num > position_count:value = context.portfolio.cash / (target_num - position_count)for stock in target_list:if context.portfolio.positions[stock].total_amount == 0:if open_position(stock, value):if len(context.portfolio.positions) == target_num:break

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/318813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《使用ThinkPHP6开发项目》 - ThinkPHP6创建菜单模块

#CSDN 年度征文&#xff5c;回顾 2023&#xff0c;赢专属铭牌等定制奖品# 一、创建菜单模块 1、创建系统菜单表 CREATE TABLE menu (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 菜单ID,menu_name varchar(32) NOT NULL DEFAULT COMMENT 菜单名称,path varchar(2…

技术学习|CDA level I 描述性统计分析(常用的数据分布)

推断性统计分析方法的基础理论——常用的分布&#xff08;两点分布、二项分布、正态分布[含标准正态分布]、χ2分布、t分布、F分布。 随机试验&#xff1a;结果不确定的实验&#xff0c;例如&#xff0c;进行一次抛硬币实验&#xff0c;结果是不确定的。对于随机试验的结果&am…

EM算法公式详细推导

EM算法是什么&#xff1f; EM算法是一种迭代算法&#xff0c;用于含隐变量概率模型参数的极大似然估计&#xff0c;或极大后验概率估计。EM算法由两步组成&#xff1a;E步&#xff0c;求期望&#xff1b;M步&#xff1a;求极大。EM算法的优点是简单性和普适性。 符号说明&…

关于系统设计的一些思考

0.前言 当我们站在系统设计的起点&#xff0c;面对一个新的需求&#xff0c;我们该如何开始呢&#xff1f;这是许多处于系统分析与设计领域的新手常常思考的问题。有些人可能会误以为&#xff0c;只要掌握了诸如面向对象、统一建模语言、设计模式、微服务、Serverless、Servic…

Postman版IDEA插件!免费!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

CMU15-445-Spring-2023-Project #0 - C++ Primer

前置任务。 Task #1 - Copy-On-Write Trie Copy-on-write (COW) Trie 在进行修改时&#xff0c;不会立即复制整个数据结构。相反&#xff0c;它会在需要修改的节点被多个引用的时候才进行复制。当要对某个节点进行写操作&#xff08;添加子节点或者继续向下insert&#xff09…

花了一小时,拿python手搓了一个考研背单词软件

听说没有好用的电脑端背单词软件&#xff1f;只好麻烦一下&#xff0c;花了一小时&#xff0c;拿python手搓了一个考研背单词软件。 代码已经开源在我的github上&#xff0c;欢迎大家STAR&#xff01; 其中&#xff0c;数据是存放在sqlite中&#xff0c;形近词跳转是根据jaro …

OpenHarmony源码转换器—多线程特性转换

本文讨论了如何将多线程的 Java 代码转换为 OpenHarmony ArkTS 代码​ 一、简介 Java 内存共享模型 以下示例伪代码和示意图展示了如何使用内存共享模型解决生产者消费者问题。 生产者消费者与共享内存间交互示意图 为了避免不同生产者或消费者同时访问一块共享内存的容器时…

【小程序开发】解决 HBuilder X “本项目类型无法运行到小程序模拟器”

今天遇到一个奇怪的问题&#xff0c;从git导入的微信小程序项目准备运行到小程序模拟器时菜单没有展示出模拟器工具列表&#xff0c;而是展示了这么一个子菜单“本项目类型无法运行到小程序模拟器&#xff0c;点击看详情”。如下图&#xff1a; 点击是跳转到一个web链接。 我通…

【零基础入门TypeScript】判断条件和循环

目录 定环 无限循环 示例&#xff1a;while 与 do..while 中断语句 句法 流程图 例子 继续语句 句法 流程图 例子 输出 无限循环 语法&#xff1a;使用 for 循环的无限循环 示例&#xff1a;使用 for 循环的无限循环 语法&#xff1a;使用 while 循环进行无限循…

使用生成式AI查询大型BI表

在拥有大量表格形式数据的组织中&#xff0c;数据分析师的工作是通过提取、转换和围绕数据构建故事来理解这些数据。 分析师访问数据的主要工具是 SQL。 鉴于大型语言模型 (LLM) 令人印象深刻的功能&#xff0c;我们很自然地想知道人工智能是否可以帮助我们将信息需求转化为格式…

优雅地展示20w单细胞热图|非Doheatmap 超大数据集 细胞数太多

单细胞超大数据集的热图怎么画&#xff1f;昨天刚做完展示20万单细胞的热图要这么画吗&#xff1f; 今天就有人发消息问我为啥他画出来的热图有问题。 问题起源 昨天分享完 20万单细胞的热图要这么画吗&#xff1f;&#xff0c;就有人问为啥他的数据会出错。我们先来看下他的…