数据分析03 /基于pandas进行股票分析

数据分析03 /基于pandas的DateFrame进行股票分析

需求1:对茅台股票分析

  • 使用tushare包获取某股票的历史行情数据。

    • tushare:财经数据接口包
    • pip install tushare
  • 输出该股票所有收盘比开盘上涨3%以上的日期。
  • 输出该股票所有开盘比前日收盘跌幅超过2%的日期。
  • 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
  • 代码实现:

    1.使用tushare包获取某股票的历史行情数据

    import tushare as ts
    import pandas as pd
    from pandas import Series,DataFrame
    
    # 使用tushare包获取某股票的历史行情数据
    df = ts.get_k_data('600519',start='1988-01-01')
    # 将获取的数据写入到本地进行持久化存储
    df.to_csv('./maotai.csv')
    
    # 将本地文本文件中的数据读取加载到DataFrame中
    df = pd.read_csv('./maotai.csv')
    df.head(10)
    
    # 将Unnamed: 0为无用的列删除
    df.drop(labels='Unnamed: 0',axis=1,inplace=True)
    df.head(5)  # 显示前五条,不写5默认也是显示的前5条,inplace是判断是否用新表替换原表
    
    # 将date列转成时间序列类型
    df['date'] = pd.to_datetime(df['date'])
    
    # 将date列作为元数据的行索引
    df.set_index(df['date'],inplace=True)
    
    # 删除原date列
    df.drop(labels='date',axis=1,inplace=True)
    df.head()

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

    # 伪代码:(收盘-开盘)/开盘  > 0.03
    (df['close'] - df['open'])/df['open'] > 0.03
    
    # boolean可以作为df的行索引
    df.loc[[True,False,True]]
    df.loc[(df['close'] - df['open'])/df['open'] > 0.03]
    
    df.loc[(df['close'] - df['open'])/df['open'] > 0.03].index

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

    #伪代码:(开盘-前日收盘)/前日收盘  < -0.02
    
    # 将收盘/close列下移一位,这样可以将open和close作用到一行,方便比较
    (df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02
    
    # boolean作为df的行索引
    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
    
    # shift(1):可以让一个Series中的数据整体下移一位

    4.假如从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,收益如何?

    分析:

    买入:一个完整的年需要买12次股票,一次买入一手(100支),一个完整的年需要买入1200支股票

    卖出:一个完整的年卖一次,一次卖出1200只股票

    代码实现:

    # 将2010-1-1 - 今天对应的交易数据取出
    data = df['2010':'2019']
    data.head()
    
    # 数据的重新取样,将每个月第一个交易日的数据拿到
    data_monthly = data.resample('M').first()
    
    # 一共花了多少钱
    cost_money = (data_monthly['open']*100).sum()
    
    # 卖出股票入手多少钱,将每年的最后一个交易日的数据拿到
    data_yeasly = data.resample('A').last()[:-1]
    recv_money = (data_yeasly['open']*1200).sum()
    
    # 19年手里剩余股票的价值也要计算到收益中
    last_money = 1200*data['close'][-1]
    
    # 最后总收益如下:
    last_monry + recv_money - cost_monry

需求2:双均线策略制定

1.使用tushare包获取某股票的历史行情数据

import tushare as ts
import pandas as pd
df = ts.get_k_data('601318',start='1990-01-01')

# 数据的预处理
df['date'] = pd.to_datetime(df['date'])
df.set_index(df['date'],inplace=True)
df.drop(labels='date',axis=1,inplace=True)
# df = df['2007-04-12':]

2.计算该股票历史数据的5日均线和30日均线

什么是均线
   对于每一个交易日,都可以计算出前N天的移动平均值,然后把这些移动平均值连起来,成为一条线,就叫做N日移动平均线。移动平均线常用线有5天、10天、30天、60天、120天和240天的指标。
   5天和10天的是短线操作的参照指标,称做日均线指标;
   30天和60天的是中期均线指标,称做季均线指标;
   120天和240天的是长期均线指标,称做年均线指标。
均线计算方法:MA=(C1+C2+C3+...+Cn)/N C:某日收盘价 N:移动平均周期(天数)
# rolling是第几个5天的值,mean()取均值
df['ma5'] = df['close'].rolling(5).mean()
df['ma30'] = df['close'].rolling(30).mean()

3.可视化历史数据两条均线

# 可视化历史数据两条均线,c代表颜色
import matplotlib.pyplot as plt
df_p = df[:300]
plt.plot(df_p.index,df_p['ma5'],c='red')
plt.plot(df_p.index,df_p['ma30'],c='blue')

4.分析输出所有金叉日期和死叉日期

股票分析技术中的金叉和死叉,可以简单解释为:
   分析指标中的两根线,一根为短时间内的指标线,另一根为较长时间的指标线。
   如果短时间的指标线方向拐头向上,并且穿过了较长时间的指标线,这种状态叫“金叉”;
   如果短时间的指标线方向拐头向下,并且穿过了较长时间的指标线,这种状态叫“死叉”;
一般情况下,出现金叉后,操作趋向买入;死叉则趋向卖出。当然,金叉和死叉只是分析指标之一,要和其他很多指标配合使用,才能增加操作的准确性。
# True:短期均线 低于 长期均线
# False:短期均线 高于 长期均线
# True ---> False 的过渡,对应的点是金叉
# False ---> True 的过渡,对应的点是死叉
sr1 = df['ma5'] < df['ma30']
sr2 = df['ma5'] >= df['ma30']

# 捕获死叉所有的日期   按位与:&
death_date = df.loc[sr1 & sr2.shift(1)].index

# 捕获所有的金叉日期  按位或:|   取反:~
golden_date = df.loc[~(sr1 | sr2.shift(1))].index

5.如果假如从开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,炒股收益率如何?

first_money = 100000 # 不变
money = first_money  #可变的
hold = 0  # 目前所持有股票的数量(单位:支)

from pandas import Series
s1 = Series(1,index=golden_date)  # 存储的是为金叉日期,用1表示
s2 = Series(0,index=death_date)   # 死叉日期,0表示
s = s1.append(s2)
s = s.sort_index()

# 使用开盘价进行股票的买卖
for i in range(0,len(s)): # 2010-07-07
    # 买入或卖出股票的单价:p
    p = df['open'][s.index[i]]
    if s[i] == 1: # 金叉日期:买入股票
        buy = money // (p*100)  # 买了多少手
        hold = buy * 100
        money -= buy*100*p
    else:  # 卖出
        money += hold * p
        hold = 0

money += hold * df['open'][-1]
result = money - first_money
print(result)

原文地址:https://www.cnblogs.com/liubing8/p/12037238.html

时间: 2024-10-01 06:36:57

数据分析03 /基于pandas进行股票分析的相关文章

数据分析03 /基于pandas的数据清洗、级联、合并

目录 数据分析03 /基于pandas的数据清洗.级联.合并 1. 处理丢失的数据 2. pandas处理空值操作 3. 数据清洗案例 4. 处理重复的数据 5. 处理异常的数据 6. 级联 7. 合并操作 数据分析03 /基于pandas的数据清洗.级联.合并 1. 处理丢失的数据 两种丢失的数据: 种类 None:None是对象类型,type(None):NoneType np.nan(NaN):是浮点型,type(np.nan):float 两种丢失数据的区别: object类型比floa

数据分析之A股市场技术分析是否可行

前言 这里并不是为了说明技术分析可行,也不是为了说明技术分析不可行,仅是以我浅薄的知识验证一些事情,测试方法及测试结果都会公布如下. 至于测试方法是否严谨, 就请读者自行判断吧. 数据获取 这里随机选择300支股票,并下载最近七年的日内行情数据. 导入必要库 import tushare as ts import random import os import json import datetime 筛选股票 num = 300 code_lis = [] # 获取中小板数据 zxb_df =

股票分析案例

使用tushare包获取某股票的历史行情数据 pip install tushare import tushare as ts import pandas as pd # 茅台的数据 maotai = ts.get_k_data(code='600519',start='1900-01-01') maotai.head() .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th

基于TableStore的数据采集分析系统介绍

摘要: 摘要 在互联网高度发达的今天,ipad.手机等智能终端设备随处可见,运行在其中的APP.网站也非常多,如何采集终端数据进行分析,提升软件的品质非常重要,例如PV/UV统计.用户行为数据统计与分析等.虽然场景简单,但是数据量大,对系统的吞吐量.实时性.分析能力.查询能力都有较高的要求,搭建起来并不容易. 摘要 在互联网高度发达的今天,ipad.手机等智能终端设备随处可见,运行在其中的APP.网站也非常多,如何采集终端数据进行分析,提升软件的品质非常重要,例如PV/UV统计.用户行为数据统计

SPSSAU数据分析思维培养系列3:分析思路

本文章为SPSSAU数据分析思维培养的第3期文章. 上文讲解如何选择正确的分析方法,除了有正确的分析方法外,还需要把分析方法进行灵活运用.拿到一份数据,应该如何进行分析,总共有几个步骤,第一步第二步应该做什么,需要有个宏观把控,只有这样才能有规范的研究科学的思维和逻辑. 本文章首先阐述数据的整体思维,即整体把控住应该如何剖析一份数据做到心理有数,接着针对常见的问卷进行思维剖析,并且提供思路框架,期许为大家带来一丝丝帮助. 第一部分 把控数据思维 如果想要把控好数据思维,简单来讲在拿到一份数据后如

基于社交网络的情绪化分析II

基于社交网络的情绪化分析II By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 上一篇进行了微博数据的抓取,这一篇进行数据的处理介绍. 无意义微博的定义 观察发现微博中有很多的微博是用户参与某些活动而转发的微博,比如:"SmashHit,作者:MediocreAB.推荐!"http://t.cn/8Fkgg9k":"刚刚下载了豆丁文档:项目公司运营简报模板"http://t.cn/RPjFZKf&qu

基于社交网络的情绪化分析IV

基于社交网络的情绪化分析IV By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 前面进行了微博数据的抓取,简单的处理,相似度分析,后面两篇进行学校微博的情感分析. 微博情感分析 这里试图通过字典分析的方式计算学校微博的情感倾向,主要分为积极情感,消极情感,客观. 这里字典分析的情感分析和机器学习方式进行情感分析均参考rzcoding的博客,这里只是根据他的思路和代码改装成了微博的情感分析. 字典分析 字典分析的原理是,给定一句微博,判断这句

基于tiny210的barebox分析(二)

代码分析 在上一篇文章中,我们已经对barebox的编译.烧写和运行有了一个大致的了解, 现在我们就要开始学习代码了. arch/arm/cpu/start.c line126 void __naked __section(.text_entry) start(void) { barebox_arm_head(); } 一般的bootloader都会以一个汇编文件作为起始,但是barebox没有这样. 这个c函数作为了整个iamge的入口,关键是__section(.text_entry)和ld

基于Qt的信号分析简单应用软件的设计

一.需求描述: 1.读取data.asc文件,分析其连续性: 2.绘制信号图像,并保存. 二.UI界面组成: 该应用的UI由以下几个控件组成: 3个PushButton:打开文件.图像保存.退出: 1个Combox:下拉框用于信号的选择: 1个Widget:用于确定绘图区域的坐标,并在Widget部件上绘制图像曲线. 3个Label:用于标注注释,及坐标轴 三.主要功能的实现 信号分析结果如下: 其中最主要的涉及信号数据的标准化处理,标准化处理计算公式: std=(当前信号值-此类信号的最小值)