python - 股票买卖实例


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

上一篇:java接口应用


下一篇:element关闭模态框清空表单验证