Tushare Day5——超简单的策略实现

股票分析

  • 1  用tushare包获取某支股票的历史行情数据
    • 1.1  查询茅台酒的股票编码并获取数据
    • 1.2  只显示感兴趣的四列(开、收盘价,最高、最低价)
  • 2  输出该股票所有收盘比开盘上涨大于等于3%及以上的日期
    • 2.1  该股票所有收盘比开盘上涨大于等于3%的行
    • 2.2  该股票所有收盘比开盘上涨大于等于3%的日期
    • 2.3  该股票所有收盘比开盘上涨大于等于10%的行
  • 3  输出该股票所有开盘比前日收盘跌幅超过2%的日期
    • 3.1  所有列错位下移
    • 3.2  所有列上移
    • 3.3  收盘价单列下移
    • 3.4  输出该股票所有开盘比前日收盘跌幅超过2%的行
    • 3.5  输出该股票所有开盘比前日收盘跌幅超过2%的日期
  • 4  策略实现:假如从tushare有记录日期开始,每月第一个交易日买入一手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
    • 4.1  剔除无用数据(最前最后的月数据不全),并尝试各月汇总
    • 4.2  取出每月月初第一支股票信息
    • 4.3  resample的用法
    • 4.4  取出每年的最后一支股票
    • 4.5  去掉信息不全的17年的最后一支股票
    • 4.6  把2001所有的月初股票信息取出来
    • 4.7  取得最后未卖出股票的价值(获取股票最后一天的开盘价)
    • 4.8  策略代码(输出每年的收益及最终收益)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts

用tushare包获取某支股票的历史行情数据

查询茅台酒的股票编码并获取数据

df=ts.get_k_data("600519",start='1988-01-01')  
df.to_csv("600519.csv")
df.head(5)
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
date open close high low volume code
0 2001-08-27 5.392 5.554 5.902 5.132 406318.00 600519
1 2001-08-28 5.467 5.759 5.781 5.407 129647.79 600519
2 2001-08-29 5.777 5.684 5.781 5.640 53252.75 600519
3 2001-08-30 5.668 5.796 5.860 5.624 48013.06 600519
4 2001-08-31 5.804 5.782 5.877 5.749 23231.48 600519

只显示感兴趣的四列(开、收盘价,最高、最低价)

#将date列设置为索引,并把它变为时间对象,最后只显示保留四个特征的矩阵
df=pd.read_csv("600519.csv",index_col="date",parse_dates=["date"])[['open','close','high','low']]
df.head(5)
open close high low
date
2001-08-27 5.392 5.554 5.902 5.132
2001-08-28 5.467 5.759 5.781 5.407
2001-08-29 5.777 5.684 5.781 5.640
2001-08-30 5.668 5.796 5.860 5.624
2001-08-31 5.804 5.782 5.877 5.749

输出该股票所有收盘比开盘上涨大于等于3%及以上的日期

该股票所有收盘比开盘上涨大于等于3%的行

(df["close"]-df["open"])/df["open"] #增长率
df[(df["close"]-df["open"])/df["open"]>=0.03 ].head(5)#将符合算式的行都输出出来
open close high low
date
2001-08-27 5.392 5.554 5.902 5.132
2001-08-28 5.467 5.759 5.781 5.407
2001-09-10 5.531 5.734 5.757 5.470
2001-12-21 5.421 5.604 5.620 5.421
2002-01-18 5.437 5.726 5.762 5.421

该股票所有收盘比开盘上涨大于等于3%的日期

df[(df["close"]-df["open"])/df["open"]>=0.03 ].index #将符合算式的列输出来
DatetimeIndex(['2001-08-27', '2001-08-28', '2001-09-10', '2001-12-21',
               '2002-01-18', '2002-01-31', '2003-01-14', '2003-10-29',
               '2004-01-05', '2004-01-14',
               ...
               '2020-07-06', '2020-07-07', '2020-07-13', '2020-12-30',
               '2021-01-05', '2021-01-12', '2021-01-25', '2021-02-04',
               '2021-02-09', '2021-02-10'],
              dtype='datetime64[ns]', name='date', length=322, freq=None)

该股票所有收盘比开盘上涨大于等于10%的行

df[(df["close"]-df["open"])/df["open"]>=0.1 ].head(5)
open close high low
date
2004-03-02 5.463 6.031 6.079 5.463
2005-06-08 11.383 12.555 12.639 11.383

最后发现只有上涨等于10%的股票,是因为中国的涨幅上限为10%

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

所有列错位下移

df.shift(1).head(5) #用shift下移
open close high low
date
2001-08-27 NaN NaN NaN NaN
2001-08-28 5.392 5.554 5.902 5.132
2001-08-29 5.467 5.759 5.781 5.407
2001-08-30 5.777 5.684 5.781 5.640
2001-08-31 5.668 5.796 5.860 5.624

所有列上移

df.shift(-1).head(5)  #用shift上移
open close high low
date
2001-08-27 5.467 5.759 5.781 5.407
2001-08-28 5.777 5.684 5.781 5.640
2001-08-29 5.668 5.796 5.860 5.624
2001-08-30 5.804 5.782 5.877 5.749
2001-08-31 5.812 5.779 5.870 5.757

收盘价单列下移

df["close"].shift(1).head(5)
date
2001-08-27      NaN
2001-08-28    5.554
2001-08-29    5.759
2001-08-30    5.684
2001-08-31    5.796
Name: close, dtype: float64

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

df[(df["open"]-df["close"].shift(1))/df["close"].shift(1)<=-0.02].head(5)
open close high low
date
2001-09-12 5.520 5.621 5.656 5.515
2002-06-26 5.824 5.757 5.843 5.712
2002-12-13 4.508 4.628 4.670 4.508
2004-07-01 6.357 6.792 6.810 6.355
2004-10-29 9.658 9.899 9.986 9.658
df[(df["open"]-df["close"].shift(1))/df["close"].shift(1)<=-0.02].shape
(85, 4)

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

df[(df["open"]-df["close"].shift(1))/df["close"].shift(1)<=-0.02].head(5).index
DatetimeIndex(['2001-09-12', '2002-06-26', '2002-12-13', '2004-07-01',
               '2004-10-29'],
              dtype='datetime64[ns]', name='date', freq=None)

策略实现:假如从tushare有记录日期开始,每月第一个交易日买入一手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?

剔除无用数据(最前最后的月数据不全),并尝试各月汇总

df=df["2001-09":"2017-11"]#剔除所有无用数据
df
df.resample("M").sum().head(5) #重新取样,设置频率为月,将这个月加总
open close high low
date
2001-09-30 113.752 113.933 115.265 112.730
2001-10-31 99.743 98.974 100.669 97.761
2001-11-30 119.185 119.028 120.324 117.904
2001-12-31 118.281 118.624 119.923 117.189
2002-01-31 113.996 114.204 116.206 112.190

取出每月月初第一支股票信息

df.resample("MS").last().head(5)
open close high low
date
2001-09-01 5.765 5.795 5.812 5.702
2001-10-01 5.468 5.476 5.482 5.437
2001-11-01 5.442 5.521 5.538 5.437
2001-12-01 5.885 6.023 6.140 5.852
2002-01-01 5.624 5.874 5.937 5.624
df_monthly = df.resample("MS").first() #MS为每月的开始
df_monthly.head(5) 
open close high low
date
2001-09-01 5.812 5.779 5.870 5.757
2001-10-01 5.781 5.715 5.809 5.663
2001-11-01 5.476 5.557 5.568 5.460
2001-12-01 5.523 5.651 5.667 5.521
2002-01-01 6.049 5.866 6.062 5.851

resample的用法

  • print(ts.resample(‘5D’).mean(),‘→ 求平均值\n’)
  • print(ts.resample(‘5D’).max(),‘→ 求最大值\n’)
  • print(ts.resample(‘5D’).min(),‘→ 求最小值\n’)
  • print(ts.resample(‘5D’).median(),‘→ 求中值\n’)
  • print(ts.resample(‘5D’).first(),‘→ 返回第一个值\n’)
  • print(ts.resample(‘5D’).last(),‘→ 返回最后一个值\n’)
  • print(ts.resample(‘5D’).ohlc(),‘→ OHLC重采样\n’)

取出每年的最后一支股票

df.resample('A').last()  #年用A表示,虽然date显示的是每年12月31号的值,但实际是表格里有的最后一天的值(如果12.31没有记录就显示当年最后一天的值)
open close high low
date
2001-12-31 5.885 6.023 6.140 5.852
2002-12-31 4.473 4.448 4.504 4.447
2003-12-31 4.940 4.921 4.940 4.888
2004-12-31 9.325 9.310 9.579 9.168
2005-12-31 14.309 14.039 14.316 13.817
2006-12-31 53.482 54.946 57.617 52.900
2007-12-31 139.495 144.783 144.846 137.085
2008-12-31 68.502 68.818 69.318 68.058
2009-12-31 107.993 108.369 108.516 107.718
2010-12-31 117.103 118.469 118.701 116.620
2011-12-31 138.039 138.468 139.600 136.105
2012-12-31 155.208 152.087 156.292 150.144
2013-12-31 93.188 96.480 97.179 92.061
2014-12-31 157.642 161.056 161.379 157.132
2015-12-31 207.487 207.458 208.704 207.106
2016-12-31 317.239 324.563 325.670 317.239
2017-12-31 626.613 622.166 639.401 617.236

去掉信息不全的17年的最后一支股票

df_yearly = df.resample('A').last()[:-1]#由于17年最后一天还没有,所以切掉倒数第一行
df_yearly
open close high low
date
2001-12-31 5.885 6.023 6.140 5.852
2002-12-31 4.473 4.448 4.504 4.447
2003-12-31 4.940 4.921 4.940 4.888
2004-12-31 9.325 9.310 9.579 9.168
2005-12-31 14.309 14.039 14.316 13.817
2006-12-31 53.482 54.946 57.617 52.900
2007-12-31 139.495 144.783 144.846 137.085
2008-12-31 68.502 68.818 69.318 68.058
2009-12-31 107.993 108.369 108.516 107.718
2010-12-31 117.103 118.469 118.701 116.620
2011-12-31 138.039 138.468 139.600 136.105
2012-12-31 155.208 152.087 156.292 150.144
2013-12-31 93.188 96.480 97.179 92.061
2014-12-31 157.642 161.056 161.379 157.132
2015-12-31 207.487 207.458 208.704 207.106
2016-12-31 317.239 324.563 325.670 317.239

把2001所有的月初股票信息取出来

df_monthly["2001"]
open close high low
date
2001-09-01 5.812 5.779 5.870 5.757
2001-10-01 5.781 5.715 5.809 5.663
2001-11-01 5.476 5.557 5.568 5.460
2001-12-01 5.523 5.651 5.667 5.521

取得最后未卖出股票的价值(获取股票最后一天的开盘价)

price_last=df['open'][-1]  #最后一天每卖出股票的开盘价

策略代码(输出每年的收益及最终收益)

cost_money = 0
hold = 0
for year in range(2001,2018):
    
    cost_money += df_monthly[str(year)]['open'].sum()*100 #df_monthly[str(year)]['open'].sum()*100是计算每年花的钱
    hold += len(df_monthly[str(year)]['open'])*100  #计算共有多少支股票已入手
    if year != 2017:  #2017年买的还没卖出去
        cost_money -= df_yearly[str(year)]['open'][0]*hold    #卖出去的价格
        hold=0
        print(-cost_money)

cost_money -= hold * price_last
print(-cost_money)

94.80000000000018
-1082.6999999999998
-493.4999999999982
2027.2000000000025
3889.5000000000055
38129.100000000006
110589.8
70515.90000000001
96941.2
116591.6
123173.59999999998
116746.5
78106.39999999998
121609.49999999996
143901.09999999998
212044.10000000003
425573.8
最终收益为42.55738

取出某行信息:

df_yearly['2001']
open close high low
date
2001-12-31 5.885 6.023 6.14 5.852

你可能感兴趣的:(金融量化,数据分析,python)