ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python - 股票买卖实例

2021-12-26 22:01:12  阅读:210  来源: 互联网

标签:股票买卖 index python money df 实例 close open loc



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

import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from pandas import DataFrame, Series

# 获取股票历史数据
df = ts.get_k_data(code='600519', start='2000-01-01')
# 将股票数据存入到本地
df.to_csv('./maotai.csv')
# 读取本地数据
df = pd.read_csv('./maotai.csv')
# 显示前5行数据
df.head()

# 删除Unnamed这一列
df.drop(labels='Unnamed: 0', axis=1, inplace=True)
# drop里面 0代表行,1代表列
df.info()
# 将df转为时间序列
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
df.head()


'''
筛选上涨超过3%的日期
df['open']取的是开盘的数据, df['close']取的是收盘的数据
满足条件的布尔值为True,可以将True作为df的行索引
利用df.loc[布尔值为True的行索引]
取出布尔值为True的行索引所对应的行数据
'''
# 获取满足需求的行数据的行数据
df.loc[(df['open'] - df['close']) / df['open'] > 0.03]
# 对应的是日期为行索引
df.loc[(df['open'] - df['close']) / df['open'] > 0.03].index

# 筛选上涨超过3%的日期
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

'''
从2010-01开始买股票到本月
每年最后一个工作日卖出
每月第一天买入一手股票,既100支股票
以开盘价作为单价
'''
# 时间
new_df = df['2010-01':'2021-12']

# 买股票 开盘价为单价
# 找出每个月的第一个交易日对应的行数据,每月的第一行数据
# 重新取样,每个月的第一行数据,索引是错误但是数据是对的
df_monthly = new_df.resample('M').first()

# 买入总金额
cost = df_monthly['open'].sum() * 100

# 卖出股票的钱
# 2021年股票不能卖出
# 最后一行2021年的数据用不到
new_df.resample('A').last()

# 将2021年最后一行数据切出
df_yearly = new_df.resample('A').last()[:-1]

# 卖出股票的钱
recv = df_yearly['open'].sum() * 1200

# 昨天的收盘价作为剩余股票的价格
last_money = 1200 * new_df['close'][-1]

# 计算总收益
recv + last_money - cost

'''
双均线策略

计算该股票历史数据的5日均线和6日均线
均线:对于每一个交易日,都可以计算出前N天的平均值
把平均值连接成一条线,既N日移动平均线。
均线:MA=(C1+C2+C3+...+Cn)/N
C:某日收盘价
N:移动平均周期
'''

df = pd.read_csv('./maotai.csv').drop(labels='Unnamed: 0', axis=1)
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)

# 5日均线
ma5 = df['close'].rolling(5).mean()
# 30日均线
ma30 = df['close'].rolling(30).mean()

plt.plot(ma5)
plt.plot(ma30)

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

'''
金叉和死叉
'''

ma5 = ma5[30:]
ma30 = ma30[30:]
s1 = ma5 < ma30
s2 = ma5 > ma30

df = df[30:]

# 死叉条件
death_ex = s1 & s2.shift(1)
# 死叉对应行数据
df.loc[death_ex]
death_date = df.loc[death_ex].index

# 金叉条件
golden_ex = -(s1 | s2.shift(1))
# 金叉对应行数据
df.loc[golden_ex]
# 金叉的时间
golden_date = df.loc[golden_ex].index

'''
如果我从2010年1月1日开始,初始资金为100000元,
金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何?
买卖股票:金叉或者死叉
如果最后一天为金叉,则买入股票,要估量剩余股票的价值计算到总收益
剩余股票的单价为最后一天的收盘价
'''

# 对金叉: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

for i in range(0, len(s)):
    if s[i] == 1:
        # 金叉
        time = s.index[i]
        # 金叉时间对应的开盘价即股票的单价
        p = df.loc[time]['open']
        hand_count = money // (p * 100)
        hold = hand_count * 100

        money -= (hold * p)  # 买股票要花钱呐

    else:
        death_time = s.index[i]
        # 卖出价格为死叉对应的时间的开盘价
        p_death = df.loc[death_time]['open']
        # 卖出
        money += (p_death * hold)
        # 卖出之后将其置为0
        hold = 0

last_money = hold * df['close'][-1]
total = money + last_money - first_money

标签:股票买卖,index,python,money,df,实例,close,open,loc
来源: https://blog.csdn.net/weixin_41755116/article/details/122159307

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有