1、数据来源——Wind金融终端

在Wind数据库中下载到的宁德时代(代码300750.SZ)从2020-01-03到2021-12-31共485个数据,包括开盘价,最高价,最低价,收盘价以及交易量。
(需要数据进行操作的同学可以在我的资源上下载,由于Wind资讯金融终端不是免费的,而且作为喜欢白嫖的我们,有什么办法得到免费的数据呢,下次找到了一定分享给大家zll[doge])
在这里插入图片描述

2、数据读取及其基本描述

import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_excel('....../300750SZ.xls')

此处注意新版pandas.read_excel()函数并不支持.xlsx文件的读取,因此需要将数据文件类型转化为xls(或者可以用其他库函数,不过我觉得这个办法是最简单的)

df = pd.DataFrame(data)
df.head()

将数据data转化为DataFrame类型,并打印出前五行:
在这里插入图片描述

df.describe()	# 对数据进行描述

在这里插入图片描述

3、收盘价与成交量关系图

# 超级简单的收盘价曲线图
df['close'].plot()

在这里插入图片描述

# 将收盘价与成交量绘制在同一张图上
df[['close','volume']].plot(subplots=True)

在这里插入图片描述
基本上我们就可以得到收盘价与成交量之间的关系图了,但是从两张图中来看,其x轴均不是日期,并且成交量一般使用的是柱状图,所以,我们加一点点细节让图变得好看一些。

list_date = list(df['Date'])
df.index = list_date

price = df['close']
volumes = df['volume']
top = plt.subplot2grid((4,4), (0,0), rowspan=3, colspan=4)
top.plot(price.index, price, label='close')
plt.title('300750.SZ Close Price from 2020-2021')
plt.legend(loc=2)

bottom = plt.subplot2grid((4,4), (3,0), rowspan=1, colspan=4)
bottom.bar(volumes.index, volumes)
plt.title('300750.SZ Daily Trading Volume')

plt.gcf().set_size_inches(12,8)
plt.subplots_adjust(hspace=0.75)

在这里插入图片描述

4、收益率曲线

(>……<)先分享一个笨操作,由于不熟悉pandas的各种常见函数,导致我自己去计算每一天的收益率,有点复杂,可跳过。

from functools import reduce  

close_array = np.array(df['close'])
cc_array = [(close1,close2) for close1,close2 in zip(close_array[:-1],close_array[1:])]
change_array = list(map(lambda cc: reduce(lambda a,b:round((b-a)/a,3),cc),cc_array))
df2 = pd.DataFrame(change_array, index=list_date[1:])
df2.cumsum().plot()
plt.legend('Rate of return')

在这里插入图片描述
而利用函数之后,就是简简单单的四行:
每日收益率:

daily_changes = df['close'].pct_change(periods=1)
daily_changes.plot()

在这里插入图片描述
累加收益率:

df_cumsum = daily_changes.cumsum()
df_cumsum.plot()

在这里插入图片描述

5、K线图

%matplotlib inline
import quandl
from mpl_finance import candlestick_ohlc	# 这是一个旧版的,但还可以用,不过会提示用新版的mplfinance,具体操作我还没了解清楚
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

df['Date'] = df.index.map(mdates.date2num)
df_ohlc = df[['Date', 'open','high', 'low', 'close']]
figure, ax = plt.subplots(figsize = (24,12))
formatter = mdates.DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_formatter(formatter)
candlestick_ohlc(ax, df_ohlc.values, width=0.8,colorup='red',colordown='green')
plt.show()

在这里插入图片描述
由于时间跨度太大导致图像不清晰,我又重新做了一个一个月的K线图:

df_1m = df.loc['2021-03-01':'2021-03-31',:]
df_1m['Date'] = df_1m.index.map(mdates.date2num)
df_1m_ohlc = df_1m[['Date', 'open','high', 'low', 'close']]
figure, ax = plt.subplots(figsize = (24,12))
formatter = mdates.DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_formatter(formatter)
candlestick_ohlc(ax, df_1m_ohlc.values, width=0.8,colorup='red',colordown='green')
plt.show()

在这里插入图片描述

6、移动平均线

df_filled = df.asfreq('D', method='ffill')
df_close = df['close']
s_short = df_close.rolling(window=5, min_periods=5).mean()
s_long = df_close.rolling(window=30, min_periods=30).mean()
df_sma = pd.DataFrame(columns=['short', 'long'])
df_sma['short'] = s_short
df_sma['long'] = s_long
df_sma.plot()

在这里插入图片描述
通过5日移动平均线和30日移动平均线的交叉点时间及其股票价格可以发现:如果利用金叉死叉的策略在宁德时代的这只股票上进行买卖收益率还不错,不知道其他的股票怎么样,下次写一个量化交易及回测的项目试试看,如果收益率高的话就躺着赚钱 [不可能,绝对不可能!!!]。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐