根据指数做波段年化利率分析

news2024/12/25 9:23:28

根据指数做波段年化利率分析

股票投资,是众多投资方式中的一种。然而,每个人有不同的炒股方式,对股票不同的操作也会获得不同的收益/损失。作为“金融消费者”,如何做好自己在股票中的消费行为,是一门巨大的学问。这里根据指数做波段操作下,进行年化利率计算及分析。通过数据来看,不同买卖下年化收益率的差别。

安装依赖

# 安装 efinance
# !pip install efinance

获取上证指数历史行情数据

import efinance as ef
import datetime
from tqdm import tqdm
import numpy as np
import pandas as pd


# 股票代码
stock_code = '上证指数'

# 这里取10年的间隔作为基准,抛弃过早的数据
delta_year=10
today = datetime.date.today()
end = today.strftime("%Y%m%d")
beg = today.replace(year=today.year-delta_year).strftime("%Y%m%d")

# 获取上证指数历史行情数据
df = ef.stock.get_quote_history(stock_code, beg = beg, end = end)
df
/opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm
股票名称股票代码日期开盘收盘最高最低成交量成交额振幅涨跌幅涨跌额换手率
0上证指数0000012014-10-082368.582382.792382.792354.292043973271.803376e+111.210.8018.920.44
1上证指数0000012014-10-092383.862389.372391.352367.112359200102.002718e+111.020.286.580.51
2上证指数0000012014-10-102380.752374.542386.282365.072246711271.922482e+110.89-0.62-14.830.48
3上证指数0000012014-10-132366.432366.012366.862341.122008993151.754251e+111.08-0.36-8.530.43
4上证指数0000012014-10-142362.802359.482380.512349.191968314191.701601e+111.32-0.28-6.530.42
..........................................
2427上证指数0000012024-09-252901.422896.312952.452889.055682598165.166981e+112.211.1633.181.23
2428上证指数0000012024-09-262893.753000.953000.952889.015763192615.246691e+113.863.61104.641.24
2429上证指数0000012024-09-273049.103087.533087.533017.454922871634.806126e+112.342.8986.581.06
2430上证指数0000012024-09-303194.723336.503358.593153.7011023379171.167773e+126.648.06248.972.38
2431上证指数0000012024-10-083674.403489.783674.403372.1913134601951.510513e+129.064.59153.282.83

2432 rows × 13 columns

# 获取上证指数10年的开盘价数据
# 作为买入卖出的价格基准
# 这里也可以采用收盘价或者其他价位
# 由于指数本身就是统计数据
# 采用任何数值都会有所偏差
# 在分析时,选用开盘价认为是一种合理的取舍
stock_data = np.array(df["开盘"])
# 给数据排个序,便于取区间
arg = stock_data.argsort()
stock_data.sort()
print(stock_data)

# 获取上证指数10年的最低最高列数据,取出来转为数组加快后续计算
stock_min = np.array(df["最低"])
stock_max = np.array(df["最高"])
stock_date = np.array(df["日期"])
[2293.57 2294.01 2303.08 ... 5143.34 5145.98 5174.42]

统计年化利率及交易周期

df_arr = []
# 跑得比较慢,要半小时左右,耐心等等吧
for i,idx in tqdm(enumerate(arg[:-1])):
    # 将开盘价作为买入价和卖出价
    purchase = stock_data[i]
    # 秉持 T+1 的原则,当天买入,只能第二天后卖出
    for sell in stock_data[i+1:]:
        # true买入,false卖出
        quote_sign = True
        period = {}
        quote_periods = []
        for index in range(idx, arg.size):
            if quote_sign and stock_min[index] <= purchase and stock_max[index] >= purchase:
                # 买入
                quote_sign = False
                period["买入日期"] = stock_date[index]
            elif not quote_sign and stock_min[index] <= sell and stock_max[index]>=sell:
                # 卖出
                quote_sign = True
                period["卖出日期"] = stock_date[index]
                quote_periods.append(period)
                period = {}
        quote_count = len(quote_periods)
        if quote_count > 0:
            profit = (sell - purchase)*quote_count/delta_year/purchase
            dic = {"买入价":purchase,"卖出价":sell,"交易次数": quote_count,"年化利率":profit, "交易周期":quote_periods}
            df_arr.append(dic)
print(len(df_arr))
2431it [16:57,  2.39it/s]

2715762

查看统计结果

profit_df = pd.DataFrame(df_arr)
profit_df
买入价卖出价交易次数年化利率交易周期
02293.572294.0110.000019[{'买入日期': '2014-10-27', '卖出日期': '2014-10-28'}]
12293.572303.0810.000415[{'买入日期': '2014-10-27', '卖出日期': '2014-10-28'}]
22293.572322.3210.001254[{'买入日期': '2014-10-27', '卖出日期': '2014-10-28'}]
32293.572343.7210.002187[{'买入日期': '2014-10-27', '卖出日期': '2014-10-29'}]
42293.572346.0510.002288[{'买入日期': '2014-10-27', '卖出日期': '2014-10-29'}]
..................
27157575101.445145.9810.000873[{'买入日期': '2015-06-11', '卖出日期': '2015-06-12'}]
27157585101.445174.4210.001431[{'买入日期': '2015-06-11', '卖出日期': '2015-06-12'}]
27157595143.345145.9810.000051[{'买入日期': '2015-06-12', '卖出日期': '2015-06-15'}]
27157605143.345174.4210.000604[{'买入日期': '2015-06-12', '卖出日期': '2015-06-15'}]
27157615145.985174.4210.000553[{'买入日期': '2015-06-09', '卖出日期': '2015-06-12'}]

2715762 rows × 5 columns

获取年化收益最大的波段

根据结果可见,买入价为2667.82,卖出价为3586.84时,10年内成交共4次,年化利率约为13.78%

profit_max = profit_df.loc[np.array(profit_df["年化利率"]).argmax()]
profit_max
买入价                                               2667.82
卖出价                                               3586.84
交易次数                                                    4
年化利率                                             0.137793
交易周期    [{'买入日期': '2014-12-02', '卖出日期': '2015-03-19'},...
Name: 279415, dtype: object

绘制一下前5收益的年化利率及交易价格区间图

由于利率相近的往往买入/卖出价格也相近,所以,设置disc来过滤一下

根据区间图可以看出,在2670左右买入,3550左右卖出,基本可以做到年化13%

import matplotlib.pyplot as plt

plt.figure(figsize=(4, 8))  # 单位为英寸

# 按年化利率进行排序并获取下标
profit_idx = np.array(profit_df["年化利率"]).argsort()[::-1]

pre_price = [0,0]
disc = 5
i = 1
for idx in profit_idx:
    if i>5:
        break
    # 收益率为y轴
    profit = profit_df["年化利率"].loc[idx]
    profit_y = [profit,profit]
    # 买入/卖出价格作为x轴
    price = [profit_df["买入价"].loc[idx], profit_df["卖出价"].loc[idx]]
    # 由于买入卖出价格可能重叠,这里过滤一下,便于更好区分
    if abs(pre_price[0]-price[0])<disc or abs(pre_price[1]-price[1])<disc:
        continue
    pre_price = price
    i+=1
    plt.plot(price, profit_y)
    plt.text(price[0], profit_y[0], f'{price[0]}',fontsize=8)
    plt.text(price[1], profit_y[1], f'{price[1]}',fontsize=8)

plt.title('Distribution Chart of Top 5 Yield Prices in the Shanghai Composite Index Band')
plt.xlabel('purchase/sell price')
plt.ylabel('annualized return')
plt.savefig('result.png')
plt.show()

在这里插入图片描述

去掉此次大盘的异常涨幅

today = datetime.date.today()
today = today.replace(month=today.month-1,day=20)

再来分析年化利率:

买入价 2289.09

卖出价 5174.42

交易次数 1

年化利率 0.126047

交易周期 [{‘买入日期’: ‘2014-09-23’, ‘卖出日期’: ‘2015-06-12’}]

这次,结果就存在较大问题了,因为,很难复现2015年的价格,基本不具备任何参考性

总结

炒股有风险,投资需谨慎。
此次数据分析仅作为参考,不作为任何建议。基于历史数据做的任何分析,在未来的不确定下,都会存在很多偏差,还请“金融消费者”们理性看待!!!

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

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

相关文章

D31【python 接口自动化学习】- python基础之输入输出与文件操作

day31 文件的打开 学习日期&#xff1a;20241008 学习目标&#xff1a;输入输出与文件操作&#xfe63;-43 常见常新&#xff1a;文件的打开 学习笔记&#xff1a; 文件的概念 使用open()函数打开文件 文件路径处理 文件打开模式 总结 文件操作包括&#xff1a;打开&#…

C++:string (用法篇)

文章目录 前言一、string 是什么&#xff1f;二、C语法补充1. auto2. 范围for 三、string类对象的常见构造1. Construct string object2. String destructor3. operator 四、string迭代器相关1. begin与end1&#xff09;begin2&#xff09;end3&#xff09;使用 2. rbegin 与 r…

第33次CCF计算机软件能力认证-第4题十滴水

题干&#xff1a; 十滴水是一个非常经典的小游戏。 小 C C C 正在玩一个一维版本的十滴水游戏。 我们通过一个例子描述游戏的基本规则。 游戏在一个 1 c 1c 1c 的网格上进行&#xff0c;格子用整数 x ( 1 ≤ x ≤ c ) x(1≤x≤c) x(1≤x≤c) 编号&#xff0c;编号从左往…

Metal之旅——数据

顶点数据 顶点数据&#xff08;Vertex Data&#xff09;是指一系列顶点的集合&#xff0c;这些顶点用于图形渲染管线的输入。每个顶点通常包含位置、颜色、纹理坐标等属性信息 mesh网络 Mesh网络是指metal中通过将不同数量形状的三角形拼在一起覆盖在要绘制图形表面的网络 顶…

007集—— 自动获取图形的外边界(外轮廓)(CAD—C#二次开发入门)

本文只适用于闭合多段线组成的图像,其他情况(圆、弧、椭圆、未封闭line)暂不支持。 效果如下图所示: 原始图: 代码运行后图: 附代码: public class 外轮廓{Database db = HostApplicationServices.WorkingDatabase;[CommandMethod("xx")]public void Demo(…

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下&#xff1a; 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速&#xff0c;土地资源变得日益紧缺&#xff0c;停车难问题已成为许多城市面临的共同挑战。随…

【Redis】List类型的常用命令大全

这里的list列表相当于一个双端队列&#xff0c;也可以认为是双向链表&#xff0c;也可以认为是数组&#xff0c;后续的很多命令都使用到下标。 list的特点&#xff1a; list中的每个元素也都是String类型里面的元素可以重复列表中的元素是有序的&#xff0c;如果里面元素顺序进…

epoll究竟是同步的还是异步的?

简单说一句话&#xff0c;你需要分层看这个事&#xff1a; epoll 这个系统调用&#xff0c;是同步的&#xff0c;也就是必须等待操作系统返回值。 而底层用了 epoll 的封装后的框架&#xff0c;可以是异步的&#xff0c;只要你暴露给外部的接口&#xff0c;无需等待你的返回值…

DDD简介

概述 传统的数据驱动开发模式&#xff0c;View、Service、Dao这种三层分层模式&#xff0c;会很自然的写出过程式代码&#xff0c;这种开发方式中的对象只是数据载体&#xff0c;而没有行为&#xff0c;是一种贫血对象模型。以数据为中心&#xff0c;以数据库ER图为设计驱动&a…

什么是变阻器?

变阻器是一种电子元件&#xff0c;主要用于调整电路中的电阻值&#xff0c;从而实现对电流、电压等电学参数的控制。它在电路中起到非常重要的作用&#xff0c;广泛应用于各种电子设备和实验装置中。 变阻器的主要作用是改变电路中的电阻值。在电路中&#xff0c;电阻值的大小…

二部图简单理解

目录 二部图简单理解 一、定义 二、性质与定理 三、原理举例 四、应用 二部图简单理解 二部图(Bipartite Graph),又称二分图,是图论中的一种特殊模型。以下是对二部图的详细介绍及原理举例: 一、定义 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(…

目标检测or实例分割中AP、MAP的计算

参考链接&#xff1a; 目标检测中AP、MAP的计算_51CTO博客_目标检测map计算 举个例子&#xff1a;

【JVM】内存分析工具JConsole/Visual VM

1 缘起 日常补充JVM调优&#xff0c;调优实践前需要学习一些理论做支撑&#xff0c; JVM调优三步&#xff1a;理论>GC分析>JVM调优&#xff0c; 我们会有一些玩笑话说&#xff0c;做了这么久Java开发&#xff0c;做过JVM调优吗&#xff1f; 做过&#xff0c;面试时。当然…

【深度学习】yolov8n模型的剪枝操作记录

原始 剪枝微调后 可以看到模型大小了&#xff0c; 测试结果显示再cpu 上加速5%-10% from ultralytics import YOLOimport time # Load a pretrained YOLO11n model count_num 500 def test1():model YOLO("/home/justin/Desktop/code/v8_prun/runs/detect/train3/weig…

LC刷题专题:记忆化搜索

文章目录 576. 出界的路径数 本刷题专栏记录自己的记忆化搜索的做题。 576. 出界的路径数 题目链接及描述&#xff1a; https://leetcode.cn/problems/out-of-boundary-paths/description/ 第一次看到这个题目可能先入为主了&#xff0c;首先想到的是使用动态规划做&#xff…

19.安卓逆向-frida基础-hook分析调试技巧1-hookMD5

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

C#多线程基本使用和探讨

线程是并发编程的基础概念之一。在现代应用程序中&#xff0c;我们通常需要执行多个任务并行处理&#xff0c;以提高性能。C# 提供了多种并发编程工具&#xff0c;如Thread、Task、异步编程和Parallel等。 Thread 类 Thread 类是最基本的线程实现方法。使用Thread类&#xff0…

【题解】【模拟】—— [NOIP2013 普及组] 表达式求值

【题解】【模拟】—— [NOIP2013 普及组] 表达式求值 [NOIP2013 普及组] 表达式求值题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2输入 #3输出 #3 提示 1.简单做法1.1.题意解析1.2.AC代码 2.使用栈的做法2.1.题意解析2.2.AC代码 [NOIP2013 普及组…

C高级--shell脚本实现分支判断

题目&#xff1a; 分支结构结合test指令完成一下编程 1>判断闰年 2>输入一个数判断是否为偶数 3>使用test指令实现等级判断 90--100A 60--89B 0-50C 其他错误 代码如下&#xff1a; #!/bin/bash read -p "请输入一个年份&#xff1a;" year if [ $((y…

Cisco Meraki平台登陆

登陆以下网址 https://n4.meraki.cn/ 输入之前注册的邮箱&#xff0c;点击Next 输入之前注册时输入的密码&#xff0c;注意不是企业邮箱的密码&#xff01; 查看邮箱&#xff0c;将验证码输入&#xff0c;点击Verify&#xff08;验证&#xff09;&#xff0c;此验证码10分…