金融量化项目案例 -- 股票分析

金融,量化,项目,案例,股票,分析 · 浏览次数 : 25

小编点评

```python # 获取股票数据 new_df = df.resample('M').first() # 买入股票花费的总金额 cost = new_df['open'].sum() * 100 # 卖出股票到手的钱 resv = new_df.resample('A').last()['open'].sum() * 1200 # 最后手中剩余的股票需要估量其价值 last_money = 200 * new_df['close'][-1] last_money190237.2 # 计算总收益 resv + last_money - cost ```

正文

博客地址:https://www.cnblogs.com/zylyehuo/

  • 股票分析
    • 使用tushare包获取某股票的历史行情数据。
    • 输出该股票所有收盘比开盘上涨3%以上的日期。
    • 输出该股票所有开盘比前日收盘跌幅超过2%的日期。

开发环境

  • anaconda
    • 集成环境:集成好了数据分析和机器学习中所需要的全部环境
    • 安装目录不可以有中文和特殊符号
  • jupyter
    • anaconda提供的一个基于浏览器的可视化开发工具

tushare财经数据接口包

!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tushare

import tushare as ts
import pandas as pd
from pandas import DataFrame,Series
import numpy as np

获取某只股票的历史行情数据

# code:字符串形式的股票代码
df = ts.get_k_data(code='600519',start='2000-01-01')
df

将互联网上获取的股票数据存储到本地

df.to_csv('./maotai.csv')  # 调用to_xxx方法将df中的数据写入到本地进行存储

将本地存储的数据读入到df

df = pd.read_csv('./maotai.csv')
df.head()

对读取出来的数据进行相关的处理

删除df中指定的一列

# 在 drop 函数中:axis=0 表示行  axis=1 表示列
# inplace=True 将操作直接应用到源数据中
df.drop(labels='Unnamed: 0',axis=1,inplace=True)

查看每一列的数据类型

# df['date'].dtype
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5289 entries, 0 to 5288
Data columns (total 7 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   date    5289 non-null   object 
 1   open    5289 non-null   float64
 2   close   5289 non-null   float64
 3   high    5289 non-null   float64
 4   low     5289 non-null   float64
 5   volume  5289 non-null   float64
 6   code    5289 non-null   int64  
dtypes: float64(5), int64(1), object(1)
memory usage: 289.4+ KB

将date列转为时间序列类型

df['date'] = pd.to_datetime(df['date'])
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5289 entries, 0 to 5288
Data columns (total 7 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   date    5289 non-null   datetime64[ns]
 1   open    5289 non-null   float64       
 2   close   5289 non-null   float64       
 3   high    5289 non-null   float64       
 4   low     5289 non-null   float64       
 5   volume  5289 non-null   float64       
 6   code    5289 non-null   int64         
dtypes: datetime64[ns](1), float64(5), int64(1)
memory usage: 289.4 KB

将date列作为源数据的行索引

df.set_index('date',inplace=True)
df.head()

输出该股票所有收盘比开盘上涨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的行数据
DatetimeIndex(['2006-12-14', '2006-12-18', '2007-01-12', '2007-01-18',
               '2007-01-19', '2007-01-24', '2007-02-01', '2007-03-06',
               '2007-04-12', '2007-04-13',
               ...
               '2021-12-29', '2022-01-13', '2022-01-28', '2022-03-07',
               '2022-10-10', '2022-10-19', '2022-10-24', '2022-10-27',
               '2023-04-12', '2023-08-28'],
              dtype='datetime64[ns]', name='date', length=798, freq=None)

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

# 伪代码:(开盘-前日收盘)/前日收盘 < -0.02
(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02
# 将布尔值作为源数据的行索引取出True对应的行数据
# df['close'].shift(1) 将整列数据下移,用NaN补空
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
DatetimeIndex(['2001-09-12', '2002-06-26', '2002-12-13', '2004-07-01',
               '2004-10-29', '2006-08-21', '2006-08-23', '2007-01-25',
               '2007-02-01', '2007-02-06', '2007-03-19', '2007-05-21',
               '2007-05-30', '2007-06-05', '2007-07-27', '2007-09-05',
               '2007-09-10', '2008-03-13', '2008-03-17', '2008-03-25',
               '2008-03-27', '2008-04-22', '2008-04-23', '2008-04-29',
               '2008-05-13', '2008-06-10', '2008-06-13', '2008-06-24',
               '2008-06-27', '2008-08-11', '2008-08-19', '2008-09-23',
               '2008-10-10', '2008-10-15', '2008-10-16', '2008-10-20',
               '2008-10-23', '2008-10-27', '2008-11-06', '2008-11-12',
               '2008-11-20', '2008-11-21', '2008-12-02', '2009-02-27',
               '2009-03-25', '2009-08-13', '2010-04-26', '2010-04-30',
               '2011-08-05', '2012-03-27', '2012-08-10', '2012-11-22',
               '2012-12-04', '2012-12-24', '2013-01-16', '2013-01-25',
               '2013-09-02', '2014-04-25', '2015-01-19', '2015-05-25',
               '2015-07-03', '2015-07-08', '2015-07-13', '2015-08-24',
               '2015-09-02', '2015-09-15', '2017-11-17', '2018-02-06',
               '2018-02-09', '2018-03-23', '2018-03-28', '2018-07-11',
               '2018-10-11', '2018-10-24', '2018-10-25', '2018-10-29',
               '2018-10-30', '2019-05-06', '2019-05-08', '2019-10-16',
               '2020-01-02', '2020-02-03'],
              dtype='datetime64[ns]', name='date', freq=None)

需求

============================================
假如我从2010年1月1日开始,每月第一个交易日买入一手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
============================================
  • 分析:
    • 时间节点:2010-2020
    • 一手股票:100支股票
    • 买:
      • 一个完整的年需要买入1200支股票
    • 卖:
      • 一个完整的年需要卖出1200支股票
    • 买卖股票的单价:开盘价
new_df = df['2010-01':'2020-02']  # 必须得是时间序列才能这样切
new_df

new_df.head(2)

买股票

# 找每个月的第一个交易日对应的行数据(捕获到开盘价)==> 每月的第一行数据
# M:根据月份从原始数据中提取指定的数据
# 每月第一个交易日对应的行数据
df_monthly = new_df.resample('M').first()  # 数据的重新取样
df_monthly

# 买入股票花费的总金额
cost = df_monthly['open'].sum()*100
cost
2397463.1

卖股票

# 卖出股票到手的钱
# 特殊情况:2020年买入的股票卖不出去(要到每年最后一个交易日才能卖出所有股票)
new_df.resample('A').last()
# 将最后一行2020年的数据切出去
# A:根据年份从原始数据中提取指定的数据
df_yearly = new_df.resample('A').last()[:-1]
df_yearly

# 卖出股票到手的钱
resv = df_yearly['open'].sum()*1200
resv
2798833.1999999997
# 最后手中剩余的股票需要估量其价值计算到总收益中
# 使用昨天的收盘价作为剩余股票的单价
last_money = 200*new_df['close'][-1]
last_money
190237.2
# 计算总收益
resv+last_money-cost
591607.2999999998

与金融量化项目案例 -- 股票分析相似的内容:

金融量化项目案例 -- 股票分析

博客地址:https://www.cnblogs.com/zylyehuo/ 股票分析 使用tushare包获取某股票的历史行情数据。 输出该股票所有收盘比开盘上涨3%以上的日期。 输出该股票所有开盘比前日收盘跌幅超过2%的日期。 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所

金融量化项目案例 -- 双均线策略制定

博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jupyter anaconda提供的一个基于浏览器的可视化开发工具 使用tushare包获取某股票的历史

如何使用Tushare+ Backtrader进行股票量化策略回测

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 典型股票量化回测流程 典型的股票量化策略回测流程包括以下几个步骤: 数据获取:首先需要获取所需的股票市场数据,包括股票价格、交易量、财务数据等。这些数据可以从金融数据供应商、交易所、财经网站或者专门的数据

算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 不要轻易使用 For 循环 For 循环,老铁们在编程中经常用到的一个基本结构,特别是在处理列表、字典这类数据结构时。但是,这东西真的是个双刃剑。虽然看起来挺直白,一用就上手,但是,有时

金融科技 DevOps 的最佳实践

随着软件技术的发展,越来越多的企业已经开始意识到 DevOps 文化的重要价值。DevOps 能够消除改变公司业务开展方式,并以更快的速度实现交付,同时创建迭代反馈循环以实现持续改进。而对于金融科技(FinTech)行业来说,拥有一套企业量身定制的 DevOps 流程变得至关重要。因为 FinTec

互动玩法任务平台介绍

任务平台是科技内各业务方开展互动玩法的中心化平台,支撑科技内拉新、促活、交易等业务场景,包含基础任务、基于任务的通用活动玩法和业务投放能力。提供了任务玩法的创建、投放、曝光、完成等全生命周期的精细化管理,打造了基于任务的裂变、时间轴等通用活动玩法的规则化运营,致力于提升在多场景、多玩法、多频次的业务投放能力。任务中心主要战场是金融APP,目前日均500W的完成量,月UV100W,大促期间日完成量达

【转帖】ChatGPT重塑Windows!微软王炸更新:操作系统全面接入,Bing也能用插件了

https://cloud.tencent.com/developer/article/2291078?areaSource=&traceId= 金磊 丰色 西风 发自 凹非寺 量子位 | 公众号 QbitAI 一夜之间,微软彻底重新定义了PC交互。 因为这一次,它把Bing和ChatGPT插件的能

金融大模型落地新挑战

文章学习:外滩大会 | 金智塔科技首席科学家郑小林教授出席大会探讨金融大模型落地新挑战 大模型的构建非常依赖算料、算力,对高校而言,从模型合规性、隐私保护的角度去做研究是很好的切入点。依托浙大科研团队,金智塔科技在大模型的研究中发现绝大多数的数据都分布在客户手中,比如金融机构场景建设需要用到政务数据

如何实现千万级优惠文章的优惠信息同步

金融社区优惠文章是基于京东商城优惠商品批量化自动生成的,每日通过不同的渠道获取到待生成的SKU列表,并根据条件生成优惠文章。 但是,生成优惠文章之后续衍生问题:该商品无优惠了,对应文章需要做取消推荐或下架处理,怎样能更快的知道该商品无优惠了呢?

支付对接常用的加密方式介绍以及java代码实现

金融场景里如何让收银和支付更安全?背后的基础原件是加密方式的设计架构。本文重点讲解在京东金融中,我们如何用Java来实现支付加密。