使用Python进行股票分析(1)

简介

Python具有非常好的数据分析和数据可视化的功能。在本文中,我们将通过使用Python获取股票的闭市价格,并且对股票价格进行分析从而向我们提供买卖股票的依据。

数据获取

需要说明的是在这里我们获取的是美国股票的数据。至于中国股市的数据大家可以分享一下哪里可以找到。

首先,我们先import我们需要用的modules:

import numpy as np
from pandas_datareader import data
import matplotlib.pyplot as plt
import pandas as pd

from datetime import date, timedelta

对于这些module不熟悉的同学可以自行去网上查找说明,总体上都是非常常用的进行数据分析和可视化的module。然后我们通过下面的代码从Google finance上获取我们定义的股票的交易数据。

tickers = ['U', 'SHOP', 'DDOG', 'SNOW']

# how many days looks back
days_backward = 365

start_date = (date.today() - timedelta(days=days_backward)).strftime('%Y-%m-%d')
end_date = date.today().strftime('%Y-%m-%d')

panel_data = data.DataReader(tickers, 'stooq', start_date, end_date)
panel_data.head()

在上面的代码中,我们定义4支股票的代码:U, SHOP, DDOG, 和SNOW。这四支股票都是成长股,具有一定的可比性。然后我们定义了获取交易数据的时间长度,定义为过去的365天。通过时间长度我们算出开始的日期。结束的日期就定义为今天。然后我们就可以通过stooq从Google finance上获取交易数据了。关于Python如何获取远程数据以及更多可用的数据源大家看看这篇文档。我们得到的DataFrame看起来如下图所示:

我们看到我们获取了闭市的价格,还是最高价,最低价,和开市的价格,还有成交的数量。我们想用的是闭市的价格,通过以下的代码获取:

close = panel_data['Close']

# data range with business day frequency - https://pandas.pydata.org/docs/reference/api/pandas.date_range.html
all_weekdays = pd.date_range(start=start_date, end=end_date, freq='B')

close = close.reindex(all_weekdays)

# Fill values by propagating the last valid observation to next valid - https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.fillna.html
close = close.fillna(method='ffill')

close.head(10)

这里我们获取了闭市的数据,同时我们还对数据重新进行了索引,并且对不可用的数据重新进行了填充。现在我们的数据看起来是这样的:

计算股票的累计盈亏

我们要计算每一支股票累计上升或者下跌的百分比。之所以用百分比而不是直接用价格是因为每支股票的价格区别比较大。将价格的变化转换为百分比相当于对各支股票的价格变化进行正规化处理。我们使用如下的代码计算各支股票的累计盈亏:

# Relative returns - https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pct_change.html
returns = close.pct_change(1)

total_returns = returns.cumsum().tail(1).transpose();
total_returns.sort_values(by=total_returns.columns[0], ascending=False, inplace=True)
total_returns

这里我们按照股票盈亏从大到小进行了排序并输出:

然后我们可以用如下的代码通过柱状图将各支股票的盈亏百分比可视化:

import seaborn as sns
sns.set(style='darkgrid', context='talk', palette='Dark2')

total_returns.plot(kind='bar');

输出如下:

我们还可以用如下代码绘制各支股票盈亏百分比的变化情况:

plt.figure(figsize=(16, 6))
for c in returns:
    plt.plot(log_returns.index, 100*(np.exp(log_returns[c].cumsum()) - 1), label=str(c))
    
plt.ylabel('Total relative returns (%)')
plt.legend(loc='best')

plt.show()

输出:

决定如何购买股票

在这里,我们做一个假设,股票的历史表现可以复制到未来的表现。这在股市当中是很合理的假设。因为公司表现的好坏非常有可能延续下去。所以我们如果有一定金额的资金想投资到这些股票上,一种策略是基于每支股票之前的表现,按照比例分配购买的资金。但是我们发现还有一个问题,有些股票可能是亏损的。所以我们在按照比例分配购买资金前,要先将这样的股票剔除出去。我们定义如下的函数完成这个工作:

def get_profitable_stocks(returns):
    cum_sum = returns.cumsum()
    return list(cum_sum.loc[:, (cum_sum.iloc[[-1]] > 0).any()].keys())

get_profitable_stocks(returns) 

我们发现目前为止所有的股票都是盈利的。然后我们定义如下的函数完成按照盈利的比例分配购买资金的功能:

# calculate ratio of buying power for stocks based on accumulative earning.
def calc_fund(returns, fund, max_stock_count = 10):
    column = total_returns.columns[0]
    positive_total_returns = total_returns[total_returns[column] > 0]
    
    stock_count = min(len(positive_total_returns), max_stock_count)
    
    
    positive_total_returns['ratio'] = positive_total_returns[column] / positive_total_returns[column].sum()
    positive_total_returns['fund'] = positive_total_returns['ratio'] * fund
    return positive_total_returns['fund']

现在假设我们有1000元,我们测试以下得到的结果如何:

总结

在本文中我们获取了感兴趣的股票的闭市价格。然后我们计算了各支股票的累计盈亏百分比,并且对该数据进行了可视化。最后我们定义了一种简单的交易策略,并且实现了函数可以帮助我们自动计算出交易策略。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

0环PEB断链

在操作系统层面上,进程本质上就是一个结构体,当操作系统想要创建一个进程时,就分配一块内存,填入一个结构体,并为结构体中的每一项填充一些具体值。而这个结构体,就是EPROCESS 在0x088 偏移处有一个指针Act…

windows安装Chocolatey方法注意事项,以及安装openssl方法

chock是一个很强大的软件包管理工具官方:Chocolatey Software | Installing Chocolatey 使用管理员打开powershell工具: 必须以管理员打开,不然安装失败,提示没有权限 然后输入: Get-ExecutionPolicy 如果返回&…

大模型笔记:最少到最多提示过程 (Least to Most prompting, LtM)

LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS 2023 ICLR 1 概述 进一步发展维链提示过程 (CoT prompting) 分为两个阶段: 第一阶段:向语言模型提出查询,将问题分解成子问题。第二阶段:再次向语…

表单提交 滚动到必填校验位置

handleCommit(flag) {this.$refs["form"].validate((valid, object) > {if (valid) {this.form.checkState flag;this.form.checkLevel 1;this.form.type 1; //规划this.form.filingsId this.form.id;checkFilings(this.form).then((response) > {this.$mo…

nestjs10.x使用jwt生成token

1 安装依赖: pnpm install --save nestjs/jwtpnpm install passport passport-jwt nestjs/jwtpnpm install types/passport-jwt --save-dev 2 可以使用命令新建auth鉴权文件夹 nest g mo auth // auth.module.ts nest g s auth // auth.service.ts nest g co …

香橙派AIpro外设接口样例大全(附源码)

Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇腾 AI 处理器,可提供 8TOPS INT8 的计算能力,内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算,可广泛用于教育、机器…

备忘 clang diagnostic 类的应用示例 ubuntu 22.04

系统的ncurses环境有些问题 通过源码安装了ncurses6.3后,才可以在 llvmort-18.1.rc4中编译通过示例: 1,折腾环境 ncurses-6.3$ ./configure ncurses-6.3$ make -j ncurses-6.3$ sudo make install sudo apt install libtinfo5 sudo…

机器学习的魔法(一)从零开始理解吴恩达的精炼笔记

一、机器学习是什么? 1、机器学习的概念 机器学习是一种人工智能领域的技术和方法,旨在使计算机系统能够从经验数据中自动学习和改进,而无需显式地进行编程。它涉及开发算法和模型,使计算机能够自动分析和理解数据,并…

MES组件车间解决方案:提高生产管理效率和质量的关键

市场环境的变化得越来越恶劣,现代生产管理理念不断更新,制造型企业是否进入管理的良性循环,关键在于“计划”与“执行”的密切配合,企业和车间管理人员必须在最短的时间内掌握生产现场的变化,并做出准确的判断和应对措…

龙芯第四代3A6000主板与龙芯3A500龙架构兼容,具备丰富的接口和扩展性

龙芯 3A6000 处理器完全自主设计、性能优异,代表了我国自主桌面 CPU 设计领域的最新里程碑成果。龙芯 3A6000 处理器的推出,说明国产 CPU 在自主可控程度和产品性能上已双双达到新高度,也证明了国内有能力在自研 CPU 架构上做出一流的产品。 …

洗车行业小程序源码系统 带完整的安装代码包以及搭建教程

大家好!今天来给大家分享一款洗车行业小程序源码系统,通过小程序,用户可以方便地预约洗车服务、查看服务进度,洗车店也可以实时管理订单、安排人员,从而提高服务效率。同时,小程序界面简洁明了,…

蓝牙耳机什么牌子好?全价位段盘点,真人实测带你避开雷区!

​无线耳机已经成为现代生活中的必备数码产品,尤其在感受到无线带来的自由后,很难再适应有线耳机的束缚。因此,耳机市场竞争激烈,各种类型和外观的耳机层出不穷。在此,我为大家总结了五款使用体验很不错的蓝牙耳机&…

VsCode搭建Spring Boot项目环境

VsCode搭建Spring Boot项目环境 1、前提条件:配置Java环境 下载安装JDK配置环境变量 2、VsCode配置SpringBoot环境 安装扩展 配置Maven 找到Maven配置文件,进行打开settings.json,添加如下代码: "workbench.iconThem…

工具 | 解决IDEA每次git拉取远程代码 default changelist 都会出现 .idea文件修改记录

问题描述: 每次我在拉取远程代码的时候,git都会默认将 .idea当中的文件(例如:compiler.xml or workspace.xml)都会莫名其妙的自动修改。 这里吐槽一下很离谱的一个现象,仔细看下修改的内容,最离…

邮件营销新手必读指南?怎样做好邮件营销?

邮件营销的全流程及步骤?做好邮件营销有哪些注意点? 邮件营销作为一种传统却依然高效的推广手段,被众多企业所青睐。对于新手来说,如何开展邮件营销,却是一个值得探讨的话题。AokSend将为你提供一份邮件营销新手必读指…

盘点热门的5个AI视频工具(上):附保姆级教程,居然还有免费的?(建议收藏)

一条完全使用 AI 做出的短视频,点赞上万,转发上万! 你敢信,这是我在前几天刷视频的时候,看到的一个 AI 视频案例。 这种 AI 视频为什么会火? AI 虽然不是什么新的领域,但 2023 年&#xff0c…

mini-spring|把AOP动态代理,融入到Bean的生命周期

本文完成 AOP 核心功能与 Spring 框架的整合,最终能通过在 Spring 配置的方式完成切面的操作。 解决问题: 怎么借着 BeanPostProcessor 把动态代理融入到 Bean 的生命周期中,以及如何组装各项切点、拦截、前置的功能和适配对应的代理器。 …

c++ 中const

对于基础类型直接赋值 void test01(){const int data10;cout<<"data"<<data<<endl;int * p (int*)&data;*p 1000;cout<<"*p"<<*p<<endl;cout<<"after data"<<data; } c中&#xff0c;对于…

Github 2024-03-02 开源项目日报Top9

根据Github Trendings的统计&#xff0c;今日(2024-03-02统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目2Rust项目1JavaScript项目1Shell项目1C项目1TypeScript项目1C#项目1Python项目1 任天堂Switch模…

47. 【Linux教程】逻辑卷的简单使用

本小节介绍创建 LVM 的步骤&#xff0c;并介绍如何简单的使用 LVM&#xff0c;主要分为&#xff1a;定义物理卷、创建卷组、创建逻辑卷、创建文件系统、修改 LVM。 1.LVM 中的几个概念 PV(physical volume)&#xff0c;物理卷在逻辑卷管理系统最底层&#xff0c;可为整个物理硬…