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