Python进行股票分析

Python进行股票分析

1.准备工作
可以结合视频进行学习,视频链接:视频

2.工具以及所需库

  jupyter notebooktushare、pandas、numpy、matplotlib

3.库的安装

  打开anaconda prompt命令框输入以下命令:conda install pandasconda install numpyconda install matplotlibconda install tushare

4.项目介绍

需求:股票分析
使用tushare包获取某股票的历史行情数据
输出该股票所有收盘比开盘上涨3%以上的日期
输出该股票所有开盘比前日收盘跌幅超过2%的日期
问如果我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?

tushare官网:官网

5.项目步骤

5.1 导入模块

# 导入相关的模块
import tushare as ts
import pandas as pd
from pandas import DataFrame,Series
import numpy as np

5.2 数据的获取写入以及读取

代码中所用到的数据集是从tushare官网上获取的,然后将其写入本地,再进行数据的读取。

 # 获取某只股票的历史行情数据
df=ts.get_k_data(code='600519',start='2000-01-01')  #ts.get_k_data(code=None,start='',end='',)# 将互联网上的股票数据写入到本地
df.to_csv('./gp.csv')   #调用to_xxx方法将df中的数据写入到本地进行存储  本地会生成一个gupiao.csv的文件
# 将本地存储的数据读入到df
df=pd.read_csv('./gp.csv')
df.head()  #显示前五行的数据

5.3 处理数据

# 需要对读取出来的数据进行相关的处理
# 删除df中指定的一列
df.drop(labels='Unnamed: 0',axis=1,inplace=True)   #drop中axis=1表示的是列,inplace=True更改原始数据,从前五行的数据可看出Unnamed: 0这一列没用需要给删去
# 这里有个问题:注意Unnamed:和0中间是有一个空格的
# 查看每一列的数据类型
df.info()  #info()可以查数据类型,也可以看出是否有空值缺失值
# data :object 字符串类型
# 将date列转换为时间序列类型
df['date']=pd.to_datetime(df['date'])
# 行隐式索引没有什么用
# 可以将date列作为源数据的行索引,因为股票是随着时间进行变化的,一条记录对应一个时间
df.set_index('date',inplace=True)
df.head()   

5.4 输出该股票所有收盘比开盘上涨3%以上的日期

#这个功能的实现视频中没有讲解,但是注释很清楚:
#df['open']取的是开盘的数据, df['close']取的是收盘的数据,
#满足条件的布尔值为True,可以将True作为df的行索引,那么利用df.loc[布尔值为True的行索引]
#就可以取出布尔值为True的行索引所对应的行数据
#输出该股票所有收盘比开盘上涨3%以上的日期
#伪代码:(收盘-开盘)/开盘 > 0.03
(df['open'] - df['close']) / df['open'] > 0.03#在分析的过程中如果产生了boolean值则下一步马上将布尔值作为源数据的行索引#如果布尔值作为df的行索引,则可以取出true对应的行数据,忽略false对应的行数据
df.loc[(df['open'] - df['close']) / df['open'] > 0.03] #获取了True对应的行数据(满足需求的行数据)
df.loc[(df['open'] - df['close']) / df['open'] > 0.03].index #df的行数据,对应的是日期行索引

结果图如下所示:
运行图

5.5 输出该股票所有开盘比前日收盘跌幅超过2%的日期

#这里需要注意的是前日收盘我们应该如何处理:因为我们进行计算需要是同行数据进行计算,
#所以利用shift(1)将收盘的数据全部下移一行再与开盘进行计算即将开盘和前日收盘进行计算
#输出该股票所有开盘比前日收盘跌幅超过2%的日期
#伪代码:(开盘-前日收盘)/前日收盘 < -0.02  负数要小于才是超过
(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02
#将布尔值作为源数据的行索引取出True对应的行数据,shift(1)即将close一列下移一行,因为要减去的是前日收盘的 shift(-1)上移一位
df.loc[(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02]   # 取出满足条件的数据
df.loc[(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02].index   # 时间索引

结果图如下所示:
运行结果图

5.6 解决问题

#需求:如果我从2010年1月1日开始,每月第一个交易日买入      1%手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
#时间节点:2010-2021 原始数据时间从2001开始 所以需要拆分时间
#一手股票:100支股票
#买股票money:一年买入12手股票共1200支股票
#卖股票money:一年卖出1200支股票
#买卖股票的单价:另开盘价作为单价
# 时间控制在2010-2021
new_df=df['2010-01':'2021-04']  #[时间序列]# 买股票 开盘价为单价
# 找出每个月的第一个交易日对应的行数据(捕获到开盘价)===》每月的第一行数据
df_monthly=new_df.resample('M').first() #数据的重新取样,每个月的第一行数据,这里日期索引是错误的,但是数据是对的# 买入股票花费的总金额
cost=df_monthly['open'].sum()*100  #求和乘100# 卖出股票的钱
# 特殊情况:2021年的股票目前还不能卖出
new_df.resample('A').last()   #最后一行2021年的数据目前用不到# 将2021年最后一行数据切出
df_yearly=new_df.resample('A').last()[:-1]# 卖出股票的钱
recv=df_yearly['open'].sum()*1200  # 收益 最后手中的股票需要估量其价值计算到总数中
# 使用昨天的收盘价作为剩余股票的单价
last_money=400*new_df['close'][-1]# 计算总收益
recv+last_money-cost

5.7 双均线策略制定

#计算该股票历史数据的5日均线和6日均线
#均线:对于每一个交易日,都可以计算出前N天的移动平均      值,
#然后把这些移动平均值连起来,成为一条线,就叫做N日移动平均线。
#移动平均线常用线有5天、 10天、30天、60天、120天和240天的指标。  
#5天和10天的是短线操作的参照指标,称做日均线指标;
#30天和60天的是中期均线指标,称做季均线指标;
#120天和240天的是长期均线指标,称做年均线指标。#均线计算方法:MA=(C1+C2+C3+...+Cn)/N C:某日收盘价 N:移动平均周期(天数)
# 使用tushare包获取某股票的历史行情数据,返回新的表df
df=pd.read_csv('./gp.csv').drop(labels='Unnamed: 0',axis=1)# 将date列转为时间序列,并作为源数据的行索引
df['date']=pd.to_datetime(df['date'])
df.set_index('date',inplace=True)ma5=df['close'].rolling(5).mean()  # rolling(5)以5天为单位计算close总和,前四天不够五天所以为NaN
ma30=df['close'].rolling(30).mean()  #前29天为NaNimport matplotlib.pyplot as plt
%matplotlib inline
plt.plot(ma5)
plt.plot(ma30) 

结果如下所示:
运行结果图

plt.plot(ma5[50:180])
plt.plot(ma30[50:180])

结果如下所示:
运行结果图

金叉和死叉这部分代码可以结合下图进行理解:
理解图

# 要对ma5和m30进行比较,考虑到各自的缺失值,要对缺失值进行过滤
ma5=ma5[30:]
ma30=ma30[30:]s1=ma5<ma30
s2=ma5>ma30df=df[30:]death_ex=s1&s2.shift(1)  #判定死叉的条件
df.loc[death_ex]  #死叉对应的行数据
death_date=df.loc[death_ex].indexgolden_ex=-(s1|s2.shift(1))  #判定金叉的条件
df.loc[golden_ex]  #金叉对应的行数据
golden_date=df.loc[golden_ex].index #金叉的时间

5.8 解决问题

#如果我从2010年1月1日开始,初始资金为100000元,
#金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何?
#分析:买卖股票的单价使用开盘价
#买卖股票的时机(金叉或者死叉)
#最后手里可能没卖出去,如果最后一天为金叉,则买入股票,
#也就是手里会有股票,所以我们要估量剩余股票的价值计算到总收益
#剩余股票的单价使用最后一天的收盘价
# 划定时间区间2010-2021
# 对金叉和死叉进行标识,1为金叉,0为死叉
s1=Series(data=1,index=golden_date)  
s2=Series(data=0,index=death_date)
s=s1.append(s2)
s=s.sort_index()  #存储金叉和死叉的时间s=s['2010':'2021']​first_money=100000 #本金不变
money=first_money  #可变的,买卖股票的钱
hold=0  #持有股票的数量(100股=1手)for i in range(0,len(s)):  #i表示的是s这个Series中的隐式索引if s[i]==1:  #金叉
#         基于100000的本金尽可能的买入股票
#         获取股票的单价(金叉时间对应的行数据中的开盘价)time=s.index[i]  #金叉的时间p=df.loc[time]['open']  #金叉时间对应的开盘价即股票的单价hand_count=money//(p*100)  #使用100000最多买入的股票数hold=hand_count*100money-=(hold*p)  #买股票要花钱呐else:death_time=s.index[i]p_death=df.loc[death_time]['open']  #买股票的单价即死叉对应的时间的开盘价money+=(p_death*hold)  #收钱啦,hold如果是金叉就是0,死叉就是剩余的数量hold=0  #卖出之后将其置为0#如何判定最后一天是金叉还是死叉
last_money=hold*df['close'][-1]  #剩余的股票价值,金叉hold就是hold,死叉hold就是0# # 总收益
total=money+last_money-first_money
total

文中有什么错误的地方欢迎提出哈!一起玩耍,一起学习,一起进步!大家都是最棒滴!

最后,送大家一句话:起风了,唯有努力生存!我们都要加油啊!

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

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

相关文章

我用Python写了个股票大数据分析工具,真香!

近日A股指数大波动&#xff0c;各路股神又纷纷登场&#xff01;但相比个人&#xff0c;通过Python技术来实现的量化交易更值得相信&#xff01; 什么是量化交易&#xff1f; 我们利用计算机技术&#xff0c;通过建模分析、优化参数等手段&#xff0c;从历史金融数据中挖掘出影响…

Python3对股票数据进行分析

目录 一、量化交易概述 1、量化交易&#xff08;投资方法&#xff09; 2、算法交易&#xff08;自动交易、黑盒交易或机器交易&#xff09; 3、量化策略 4、量化选股 5、股票回测 二、股票数据 三、股票数据分析 1、导入股票时间序列数据 2、绘制股票成交量的时间序列…

python股票数据简单分析

一、简单说明 1、需求 2、数据 3、 部分结果 画的图 筛选的股票 二、学习收获 1、如何将DataFrame列的object类型转为自己需要float类型&#xff1f; 这里成交量为例子 转为相应float类型&#xff1f; 具体方法是&#xff1a; 首先先将该字段转换成列表类型&#xff0c;列…

自己动手写股票数据分析软件之数据获取

前言 本文旨在分享编程经验&#xff0c;非炒股指导软件。 一、Tushare数据介绍 Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程&#xff0c;能够为金融分析人员提供快速、整洁、和多样的便于分析的数据&a…

程序员在群里“匿名”骂老板,第二天被开除,聊天记录曝光

程序员的工作是很辛苦的&#xff0c;不过报酬也是比较丰富&#xff0c;一个经验丰富的程序员&#xff0c;几万的工资很正常&#xff0c;要是有别的收入&#xff0c;兼职写代码&#xff0c;也能赚到不少钱。现在的程序员呢&#xff0c;是越来越多人想要去做了。好多人对程序员似…

百度程序员妻子质疑老公不忠!每天很晚回家!周五下班不回家,说领导带他喝酒!结婚一年就出轨?...

请点击上面  一键关注&#xff01; 前几天我们刚刚爆料了华为工程师因为老加班导致妻子出轨的故事&#xff0c;今天又有一位百度员工的妻子怀疑自己老公出轨.......互联网的世界究竟有多乱&#xff1f; 每天很晚回家&#xff0c;周五晚上说自己跟领导去喝酒......妻子心里忐忑…

AI大模型接管谷歌搜索:一夜之间,整个领域变天了

来源&#xff1a;机器之心 最近几个月&#xff0c;我们已经见识到各种 AI 工具被重新发明&#xff0c;微软先后将 Office 全家桶接入 GPT-4&#xff0c;最近又把必应和 ChatGPT 插件的能力全部注入到 Windows 系统。 与此同时&#xff0c;在搜索领域占据重要地位的谷歌也不甘落…

推荐 - 腾讯云技术社区公众号

今天向各位推荐的是腾讯云技术社区的公众号&#xff0c;是腾讯官方推出的技术知识分享阵地&#xff0c;每周公开腾讯最新的技术工程方案&#xff08;例如微信、健康码、王者荣耀等知名业务的技术架构&#xff09;、ChatGPT 等行业前沿热点解读、研发经验和工作方法等干货&#…

LLM系列 | 13: 如何链接多个Prompt处理复杂任务?以智能客服为例

简介 溪云初起日沉阁&#xff0c;山雨欲来风满楼。 小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;卖老班章的小女孩。紧接前面几篇ChatGPT Prompt工程和应用系列文章&#xff1a; 04:ChatGPT Prompt编写指南05:如何优化ChatGPT Prompt&…

chatgpt赋能python:Python调用蓝牙:从入门到实战

Python调用蓝牙&#xff1a;从入门到实战 如果你想要通过Python调用蓝牙&#xff0c;以此来读取和操作周围的设备&#xff0c;那么你已经来到了正确的地方。在本篇文章中&#xff0c;我们将探讨如何使用Python编程语言来与周围的蓝牙设备进行通信&#xff0c;为你的应用程序增…

chatgpt赋能python:如何使用Python操作蓝牙——一篇详细的教程

如何使用Python操作蓝牙——一篇详细的教程 蓝牙技术已经成为了我们生活中不可或缺的一部分&#xff0c;它可用于连接各种设备&#xff0c;例如耳机、音箱、手表&#xff0c;甚至是汽车。而Python作为一种广泛应用于各种领域的高级编程语言&#xff0c;也可以用来操作蓝牙设备…

做什么生意是最稳定的呢?

只要做生意就会有风险&#xff0c;钱存在银行最没有风险。 风险的大小取决于你承受能力&#xff0c;如果你只有几万元&#xff0c;那么摆地摊进货对于你来说都是大风险。如果你有几千万上亿&#xff0c;炒个十万的期货都对你来说无关紧要。 房产投资风险最小 投资也可以算是…

教你怎么鉴别发霉大米?

珍宝岛大米是黑龙江省鸡西虎林市的名优土特产&#xff0c;是鸡西市的三大地理标志保护产品之一。黑龙江省虎林市的虎林镇、杨岗镇、虎头镇、迎春镇、宝东镇、东方红镇、伟光乡、新乐乡、忠诚乡、阿北乡、珍宝岛乡等12个乡镇是经过我国农业部门实地考察过亲自验证的名优产地&…

设计模式——命令模式

在软件开发系统中&#xff0c;“方法的请求者”与“方法的实现者”之间经常存在紧密的耦合关系&#xff0c;这不利于软件功能的扩展与维护。例如&#xff0c;想对方法进行“撤销、重做、记录”等处理都很不方便&#xff0c;因此“如何将方法的请求者与实现者解耦&#xff1f;”…

java毕业设计——基于java+JavaBean+jsp的网上零食销售系统设计与实现(毕业论文+程序源码)——网上零食销售系统

基于javaJavaBeanjsp的网上零食销售系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javaJavaBeanjsp的网上零食销售系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答…

2021年中国电饭锅(电饭煲)行业现状及前景分析:个性化消费推动市场向高端、智能化发展[图]

一、电饭锅&#xff08;电饭煲&#xff09;产业链 电饭煲又称作电锅&#xff0c;电饭锅。是利用转变为热能的&#xff0c;具有对进行、、炖、煲、煨等多种操作功能&#xff0c;使用方便、安全可靠。它不但能够把食物做熟&#xff0c;而且能够保温&#xff0c;使用起来清洁卫生&…

设计模式 -- 命令模式(14)

目录 前言定义优点与缺点优点缺点 结构与实现实现需求代码 前言 在现实生活中&#xff0c;命令模式的例子也很多。比如看电视时&#xff0c;我们只需要轻轻一按遥控器就能完成频道的切换&#xff0c;这就是命令模式&#xff0c;将换台请求和换台处理完全解耦了。电视机遥控器&…

我所理解的生活!

写于:2013-7 无码的睁大眼睛看&#xff0c;有码的眯起眼睛看&#xff0c;没有情节的直接删除 ----------------------这就是我所理解的生活&#xff01; 我也许能够一直打着寻找自我的幌子&#xff0c;继续在这个社会招摇撞骗。凭良心说我喜欢千奇百怪的结果&#xff0c;于是…

我用Python爬取美食网站3032个菜谱并分析,没有我不会做的菜!

这是巨变的中国&#xff0c;人和食物&#xff0c;比任何时候走的更快。近日&#xff0c;J哥为了寻味中国&#xff0c;奔走于某五线城市的大街小巷&#xff0c;结果除了累&#xff0c;啥也没寻到。 于是&#xff0c;J哥默默打开了各大美食网站&#xff0c;如豆果美食、下厨房、…

一年时间,拿到了人生中的第一个20万

目录 一、2021年度博客之星评选第二名二、博客新星导师三、哪吒社区四、粉丝群五、付费专栏六、Java学习路线总结&#xff0c;搬砖工逆袭Java架构师七、关于读书八、你好2023 一、2021年度博客之星评选第二名 2022年&#xff0c;是哪吒收获的一年&#xff0c;收获了人生中的第…