股票分析
- 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 |
只显示感兴趣的四列(开、收盘价,最高、最低价)
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)
|
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)
|
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()
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()
|
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]
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
hold += len(df_monthly[str(year)]['open'])*100
if year != 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 |