Python量化交易07——散户反买策略

news2024/12/26 0:25:40

参考来源:b站up 邢不行


我们都知道在A股,散户一直是最大的韭菜贡献组群。散户买入多的个股,大概率可能跌的很惨,散户卖出多的股票,大概率会涨。

跟着北向资金买能赚钱,那么跟着散户反买,是不是也有很好的盈利效果呢?

下面用A股所有的历史数据进行测试。


数据展示

所有A股历史数据,放在一个stock文件夹里面 

 

其中一个文件长这个样子,基本都包括正常的股票交易数据等。


代码过程 

导入包,定义读取函数:

import os
import numpy as np
import pandas as pd
def load_file(path, file):
    path += file
    df = pd.read_csv(path, encoding='gbk',usecols=['股票代码','交易日期','收盘价',
                                                   '前收盘价','成交额','散户资金卖出额'],
                     parse_dates=['交易日期'], skiprows=1)
    return df

获取stock文件夹下面所有的股票代码文件名称:

file_path = r'./stock/'
file_list = os.listdir(file_path)
file_list = [f for f in file_list if '.csv' in f]
file_list[:3]

显示前三个

 定义测试的时间段:

# 测试时间段
start_time = '20070101'
end_time = '20220331'

计算所有股票日交易数据的后一天,三天,五天的收益率:

dfs = []
for f in file_list:
    print(f)
    df = load_file(file_path, f)
    df['散户资金占比'] = df['散户资金卖出额'] * 10000/ df['成交额']
    for i in [1, 3, 5]:
        df['未来%d日涨跌幅' % i] = df['收盘价'].shift(-i) / df['前收盘价'].shift(-1) - 1
    df.dropna(subset=['散户资金卖出额', '成交额'], how='any',inplace=True, axis=0)
    dfs.append(df)
all_df = pd.concat(dfs, ignore_index=True)
all_df.head()

过滤一下时间:

all_df = all_df[all_df['交易日期'] >= pd.to_datetime(start_time)]
all_df = all_df[all_df['交易日期'] <= pd.to_datetime(end_time)]
all_df.shape

 总共900w多条数据。

计算最终结果表格数据:

# ===计算最终表格
result = pd.DataFrame()  # 创建一个空的表格
for flow in np.arange(0,1,0.1):
    # 筛选出净买入大于flow的情况
    t_df = all_df[all_df['散户资金占比'] > flow]
    # 计算出现次数
    result.loc[flow, '出现次数'] = t_df.shape[0]
    # 计算未来N天数据
    for i in [1, 3, 5]:
        result.loc[flow, '未来%d日上涨次数' % i] = t_df[t_df['未来%d日涨跌幅' % i] > 0].shape[0]
        result['未来%d日上涨概率' % i] = result['未来%d日上涨次数' % i] / result['出现次数']
        result.loc[flow, '未来%d日上涨平均涨幅' % i] = t_df['未来%d日涨跌幅' % i].mean()


结果展示

由于对颜色有选择困难症,,,就用代码随机生成颜色:

import random   #定义随机生成颜色函数
def randomcolor():
    colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    color ="#"+''.join([random.choice(colorArr) for i in range(6)])
    return color

结果进行样式展示:

result.rename_axis("散户资金卖出占比") # 索引重命名
.reset_index()
.style.bar(color=randomcolor(), subset=['未来1日上涨概率','未来3日上涨概率','未来5日上涨概率'],vmin=0.3, vmax=0.9)
.bar(color=randomcolor(), subset=['未来1日上涨平均涨幅','未来3日上涨平均涨幅','未来5日上涨平均涨幅'],vmin=0.000, vmax=0.014)
.format({'出现次数':"{:.0f}",'未来1日上涨次数': "{:.0f}",'未来3日上涨次数': "{:.0f}",'未来5日上涨次数': "{:.0f}"})
.format({'未来1日上涨概率': "{:.2%}",'未来3日上涨概率': "{:.2%}",'未来5日上涨概率': "{:.2%}"})
.format({'未来1日上涨平均涨幅': "{:.3%}",'未来3日上涨平均涨幅': "{:.3%}",'未来5日上涨平均涨幅': "{:.3%}"})
.format({'散户资金卖出占比':'>{:.1f}'}) 

 

可以把计算结果进行存储:

#result.to_csv('result.csv', encoding='gbk')

 我们可以看到上述结果,随着散户资金卖出的占比越来越高,在A股上所有的历史数据中出现的次数也越来越少,而且未来几日上涨的次数也越来越少。
,并且很明显,当散户资金卖出战成交额占比大于60%以上时,未来一日,三日,五日上涨的概率都明显大于50%,而且获得的平均涨幅的收益也是较高的。并且随着这个散户卖出占比比例越高,这个胜率和涨幅也越来越高。
很明显,跟着散户反卖这个策略是能够获得盈利的。


回测结果 

利用这个策略,我们实施了一个这样的交易逻辑,即每日选择所有股票中,散户卖出占比最高的三只股票进行买入,仓位分散为1/3,每三天重新计算卖出占比,轮流换一次仓。
这个策略的代码会很复杂,需要借助专门的量化框架来进行回测。
这里就给出最终的回撤结果的一个画图展示:

import pandas as pd
import matplotlib.pyplot as plt
equity = pd.read_csv(r'回测结果_event_资金流_1_3_3_3.csv', encoding='gbk', parse_dates=['交易日期'])
equity.set_index(['交易日期'], inplace=True)
equity.head()

 画图:

equity[['净值', '基准净值']].plot(figsize=(9, 5), grid=False, fontsize=20)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.savefig(r'散户反买策略.png')
plt.show()

可以看到,作为基准收益的指数收益很低,几乎变了不了什么。但是这个策略的收益高达60倍,即从2007年到现在,15年左右能获得60倍的收益,年化收益30%左右,是一个很厉害的策略了。

当然还可以配合各种财务指标,因子模型进一步选择优化策略。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝塔面板部署Django项目教程(手把手)

一、测试环境 系统&#xff1a;centos 7.9 CPU&#xff1a;1核 内存&#xff1a;2G 二、安装宝塔面板 输入命令&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec 后面会…

【nvidia CUDA 高级编程】使用cub库优化分布式计算下的原子操作

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

MySQL数据库相关错题本

1) MySQL数据库相关错题本1、存储引擎相关1、MySql的存储引擎的不同MySQL存储引擎主要有InnoDB, MyISAM, Memory, 这三个区别在于:Memory是内存数据引擎, 会断电重启(在双M或者主从架构下会产生较多异常), 且不支持行级锁. 默认索引是数组索引, 支持B索引InnoDB和MyISAM的区别:…

【React全家桶】react简介(一)

react简介创建项目creat-react-app1.1 React特点1.2 引入文件1.3 JSX1.3.1 为什么要用JSX1.3.2 JSX语法规则1.4 虚拟DOM1.5 模块与组件1.5.1 模块React面向组件编程2.1 创建组件2.1.1 函数式组件2.1.2 类式组件2.2 组件实例的三大属性2.2.1 state属性2.2.2 props属性2.2.3 refs…

jvm学习的核心(三)---运行时数据区详解(2)

文章目录1.堆&#xff08;heap&#xff09;1.1 堆的概述1.2 堆的内部结构1.3 堆分代垃圾回收流程的简单理解2.方法区&#xff08; Method Area&#xff09;2.1 HotSpot方法区的演进2.2方法区的内部结构2.3.1 常量池和运行时常量池概念区别1.堆&#xff08;heap&#xff09; 1.1…

Linux常用命令——supervisord命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) supervisord 配置后台服务/常驻进程的进程管家工具 安装 # 安装 supervisord apt-get install supervisor实例 生成配置文件/etc/supervisord.conf [program:app] command/usr/bin/gunicorn -w 1 wsgiapp:ap…

Java面试2

Java面试2目录概述需求&#xff1a;设计思路实现思路分析1.java 面试题参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive.…

学习记录665@项目管理之项目成本管理

友情提示&#xff1a;对于这部分书上的内容&#xff0c;我个人认为是花里胡哨&#xff0c;形式大于内容的&#xff0c;特别是涉及到很多挣值管理有些指标和公式&#xff0c;没有任何例子&#xff0c;死板生硬。 什么是项目成本管理 项目管理受范围、时间、成本和质量的约束&am…

回溯——排列组合

1.组合(结果不区分顺序) 1.同一个集合求组合需要startindex 需要startindex 1.元素可以重复使用 startindex为i 例&#xff1a; lc39[组合总和] 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组…

C进阶_内存库函数_和这群虫豸在一起,怎能搞好政治呢?

其实之前我写过这篇……但是不够详细&#xff01;今天重新写一下。 目录 memcpy 模拟实现memcpy memmove 模拟实现memmove memcpy 它的函数原型是&#xff1a; void * memcpy ( void * destination, const void * source, size_t num ); 查阅文档它的文档&#xff1a; C…

帮助有一定计算机基础的人 快速复习并重新拾起C语言基础(数据类型篇)

数据类型 帮助有一定计算机基础的人 快速复习并重新拾起C语言基础C语言数据类型分类基本数据类型整型类型的分类整型类型的基本用法有符号与无符号的区别字符型数据转义字符char 类型的范围浮点数类型数据字符串常量字符串输入之scanf函数字符输入输出函数算术运算符比较运算符…

SPI-读写串行FLASH

简介 是由摩托罗拉公司提出的通讯协议&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广 泛地使用在ADC、LCD等设备与MCU间&#xff0c;要求通讯速率较高的场合。特性 1、全双工&#xff08;即可以同时收发&#xff09;2、最少需要占用4条线&…

图解统计学 10 | 贝叶斯公式与全概率公式

文章目录概率联合概率条件概率全概率公式贝叶斯公式过年了&#xff0c;作为水果店老板的我们&#xff0c;一共进了三种水果&#xff0c;其中&#xff1a;西瓜&#xff1a;50个 香蕉&#xff1a;30个 橙子&#xff1a;20个 为了方便顾客挑选&#xff0c;放在如下的格子里&…

[Android]Shape Drawable

ShapeDrawable可以理解为通过颜色来构造的图形 <android.widget.Buttonandroid:id"id/button1"android:layout_width"wrap_content"android:layout_height"wrap_content"android:text"Button"android:background"drawable/sha…

MongoDB学习笔记【part4】SpringBoot集成MongoDB、MongoTemplate开发CURD

一、Spring Boot 集成 Mongodb spring-data-mongodb 提供了 MongoTemplate 与 MongoRepository 两种方式访问mongodb&#xff0c;MongoRepository 操作简单&#xff0c;但 MongoTemplate 更加灵活&#xff0c;我们在项目中可以灵活使用这两种方式操作mongodb。 第一步&#x…

铸造性能监控平台【grafana+influxdb/prometheus+Linux/Windows】

目录一、grafanainfluxdbjmeter1、前言2、安装grafana和influxdb3、启动grafana4、访问grafana5、启动influxdb6、配置influxdb和jmeter7、在grafana中显示数据8、其他模板二、grafanaprometheusexporter1、前言2、grafana启动3、exporter安装与运行4、prometheus安装与运行5、…

代码随想录算法训练营第23天 二叉树 java : 669. 修剪二叉搜索树108.将有序数组转换为二叉搜索树538.把二叉搜索树转换为累加树

文章目录LeetCode 669. 修剪二叉搜索树题目讲解思路LeetCode 108.将有序数组转换为二叉搜索树题目讲解思路LeetCode 538.把二叉搜索树转换为累加树题解思路总结LeetCode 669. 修剪二叉搜索树 题目讲解 思路 在1到3的区间选择 元素 如何超过3 或者 小于1 如果小于1 叫要考虑 …

NeRF: Representing Scenesas Neural Radiance Fieldsfor View Synthesis论文阅读

注意&#xff1a;和很多文章一样&#xff0c;在Google搜索到最终版本时&#xff0c;有链接指出其有7个历史版本&#xff0c;但内容较详细的却不是最终版本&#xff0c;而是ECCV (2020)版&#xff0c;阅读时可以两个版本配合着阅读。 1. 摘要 我们提出了一种方法&#xff0c;通…

202301读书笔记|《命运》蔡崇达

202301读书笔记|《命运》蔡崇达 《命运》是我读的蔡崇达的第二本书&#xff0c;第一本是《皮囊》印象最深的一句就是“肉体是拿来用来的&#xff0c;不是拿来伺候的。” 当时读完第一本就很受触动&#xff0c;这一次读完《命运》依然很触动我。作者真的很厉害&#xff0c;这个故…

SpringBoot看这一篇文章就够了

第一章 SpringBoot简介 第1节 SpringBoot是什么 1 21.SpringBoot是一个可以快速创建可运行的、独立的、生产级的基于Spring的应用程序 2.SpringBoot采用一种约定优于配置的设计理念,可以快速让用户创建出一个可运行的基于Spring的应用第2节 SpringBoot的优势 1 2 3 4 51.快速构…