用python进行股票分析 分析股票 哪个平台

1620人阅读
金融股票(1)
.cn/s/blog_02vkx7.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:335967次
积分:4605
积分:4605
排名:第6512名
原创:68篇
转载:490篇
评论:21条
(3)(2)(1)(14)(6)(9)(1)(1)(30)(41)(105)(22)(105)(123)(95)import tushare as ts
# 获取实时行情数据
hq = ts.get_today_all()
# 节选出股票代码code、名称name、涨跌幅changepercent、股价trade
hq = hq[['code','name','changepercent','trade']]
# 筛选出当前股价高于0元低于3元的股票信息
mins = hq.trade&0.00
maxs = hq.trade&=2.99
allselect = mins & maxs
data = hq[allselect].sort('trade')
123456789101112
import tushare as ts&# 获取实时行情数据hq = ts.get_today_all()# 节选出股票代码code、名称name、涨跌幅changepercent、股价tradehq = hq[['code','name','changepercent','trade']]&# 筛选出当前股价高于0元低于3元的股票信息mins = hq.trade&0.00maxs = hq.trade&=2.99allselect = mins & maxsdata = hq[allselect].sort('trade')
得到股价小于3元的低价股票信息,然后对深圳成指和异常股票进行剔除:
# 提取低价股股票代码,并剔除深圳成指股票
code_list = []
for c in data.code:
if c[0] != "0":
code_list.append(c)
# 提取低价股股票代码,并剔除深圳成指股票code_list = []for c in data.code:&&&&if c[0] != "0":&&&&&&&&code_list.append(c)code_list
得到九只股票的代码
['600401',
['600401', '601005', '600022', '601558', '601258', '601880', '600307', '600282', '600231'
然后获取至上证指数的历史行情数据:
# 获取至的上证指数历史行情数据
sh_hist_data = ts.get_hist_data(code='sh',start='',end='')
sh_hist_data = sh_hist_data[['open','high','close','low','volume','price_change','p_change']].sort_index()
# 获取至的上证指数历史行情数据sh_hist_data = ts.get_hist_data(code='sh',start='',end='')sh_hist_data = sh_hist_data[['open','high','close','low','volume','price_change','p_change']].sort_index()
引入matplotlib模块:
import matplotlib.pyplot as plt
from matplotlib.pylab import datestr2num
import matplotlib
# 设置中文字体
font = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
import matplotlib.pyplot as pltfrom matplotlib.pylab import datestr2numimport matplotlib# 设置中文字体font = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
二、对比上证指数每日最低价和各只低价股每日最低价的价格走势
%matplotlib inline
sh_hist_data.head(10)
dates = [datestr2num(i) for i in sh_hist_data.index]
plt.figure(figsize=(40,30))
# 新建一个子图,绘制上证指数走势
plt.subplot(311)
plt.title("日至日上证指数最低价走势",fontsize=30)
plt.xticks(rotation=20,fontsize=26)
plt.yticks(fontsize=26)
plt.plot_date(dates,sh_hist_data.low,'-',linewidth=2.5)
plt.grid(True)
# 遍历低价股代码列表,绘制股价走势
for i in code_list[0:4]:
hist_data = ts.get_hist_data(code=i,start='',end='')
code_data = hist_data[['open','high','close','low','volume','price_change','p_change']].sort_index()
dates = [datestr2num(t) for t in code_data.index]
plt.subplot(312)
plt.title("日至日各低价股最低价走势",fontsize=30)
plt.xticks(rotation=20,fontsize=26)
plt.yticks(fontsize=26)
plt.plot_date(dates,code_data['low'],'-',linewidth=2.5,label=i)
plt.legend(loc=1,fontsize=22)
plt.grid(True)
for i in code_list[4:]:
hist_data = ts.get_hist_data(code=i,start='',end='')
code_data = hist_data[['open','high','close','low','volume','price_change','p_change']].sort_index()
dates = [datestr2num(t) for t in code_data.index]
plt.subplot(313)
plt.title("日至日各低价股最低价价走势",fontsize=30)
plt.xticks(rotation=20,fontsize=26)
plt.yticks(fontsize=26)
plt.plot_date(dates,code_data['low'],'-',linewidth=2.5,label=i)
plt.legend(loc=1,fontsize=22)
plt.grid(True)
1234567891011121314151617181920212223242526272829303132333435
%matplotlib inline&sh_hist_data.head(10)dates = [datestr2num(i) for i in sh_hist_data.index]plt.figure(figsize=(40,30))# 新建一个子图,绘制上证指数走势plt.subplot(311)plt.title("日至日上证指数最低价走势",fontsize=30)plt.xticks(rotation=20,fontsize=26)plt.yticks(fontsize=26)plt.plot_date(dates,sh_hist_data.low,'-',linewidth=2.5)plt.grid(True)# 遍历低价股代码列表,绘制股价走势for i in code_list[0:4]:&&&&hist_data = ts.get_hist_data(code=i,start='',end='')&&&&code_data = hist_data[['open','high','close','low','volume','price_change','p_change']].sort_index()&&&&dates = [datestr2num(t) for t in code_data.index]&&&&plt.subplot(312)&&&&plt.title("日至日各低价股最低价走势",fontsize=30)&&&&plt.xticks(rotation=20,fontsize=26)&&&&plt.yticks(fontsize=26)&&&&plt.plot_date(dates,code_data['low'],'-',linewidth=2.5,label=i)&&&&plt.legend(loc=1,fontsize=22)&&&&plt.grid(True)for i in code_list[4:]:&&&&hist_data = ts.get_hist_data(code=i,start='',end='')&&&&code_data = hist_data[['open','high','close','low','volume','price_change','p_change']].sort_index()&&&&dates = [datestr2num(t) for t in code_data.index]&&&&plt.subplot(313)&&&&plt.title("日至日各低价股最低价价走势",fontsize=30)&&&&plt.xticks(rotation=20,fontsize=26)&&&&plt.yticks(fontsize=26)&&&&plt.plot_date(dates,code_data['low'],'-',linewidth=2.5,label=i)&&&&plt.legend(loc=1,fontsize=22)&&&&plt.grid(True)
得到以下图表:
看两年的最低价走势,与上证大盘走势最不吻合的股票有:、600401
三、对比各股历史平均成交量:
# 对各低价股的历史平均成交量做可视化处理
import numpy as np
font = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
codes = []
volumes = []
for i in code_list:
histdata = ts.get_hist_data(code=i,start='',end='')
volume_data = histdata['volume'].mean()/10000
codes.append(i)
volumes.append(volume_data)
print(codes,volumes)
x = np.arange(len(codes))
# 获取各只股票平均成交量的平均值
mean_volume = float(sum(volumes)/len(volumes))
# 将成交量均值绘制一条直线
plt.axhline(y=mean_volume,color='r')
plt.xticks(x,codes,rotation=45)
plt.title("各低价股两年平均成交量比较")
plt.bar(x,volumes,0.5,color='teal')
plt.xlabel("股票代码",fontproperties=font)
plt.ylabel("平均成交量(万元)",fontproperties=font)
plt.grid(True)
12345678910111213141516171819202122
# 对各低价股的历史平均成交量做可视化处理import numpy as npfont = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')codes = []volumes = []for i in code_list:&&&&histdata = ts.get_hist_data(code=i,start='',end='')&&&&volume_data = histdata['volume'].mean()/10000&&&&codes.append(i)&&&&volumes.append(volume_data)#&&&& print(codes,volumes)x = np.arange(len(codes))# 获取各只股票平均成交量的平均值mean_volume = float(sum(volumes)/len(volumes))# 将成交量均值绘制一条直线plt.axhline(y=mean_volume,color='r')plt.xticks(x,codes,rotation=45)plt.title("各低价股两年平均成交量比较")plt.bar(x,volumes,0.5,color='teal')plt.xlabel("股票代码",fontproperties=font)plt.ylabel("平均成交量(万元)",fontproperties=font)plt.grid(True)
得到如下柱状图:
两年平均成交量约为100(万元)
在其之上的股票有:
两年平均成交量最低的为:600231
四、对比上证和各股两年涨跌幅:
# 上证指数及各低价股两年涨跌幅
p_changes = []
codes = []
sh_change = sh_hist_data.p_change.sum()
for i in code_list:
code_change = ts.get_hist_data(code=i,start='',end='').p_change.sum()
codes.append(i)
p_changes.append(code_change)
codes[-1] = "上证"
p_changes[-1] = sh_change
x = np.arange(len(codes))
plt.axvline(x=sh_change,color='r')
plt.title('上证及各低价股两年涨跌幅')
plt.yticks(x,codes)
plt.xlabel("涨幅(百分比)")
# plt.barh([10],[sh_change],color='r')
rets = plt.barh(x,p_changes,color='sage',align="center")
plt.grid(True)
123456789101112131415161718
# 上证指数及各低价股两年涨跌幅p_changes = []codes = []sh_change = sh_hist_data.p_change.sum()for i in code_list:&&&&code_change = ts.get_hist_data(code=i,start='',end='').p_change.sum()&&&&codes.append(i)&&&&p_changes.append(code_change)codes[-1] = "上证"p_changes[-1] = sh_changex = np.arange(len(codes))plt.axvline(x=sh_change,color='r')plt.title('上证及各低价股两年涨跌幅')plt.yticks(x,codes)plt.xlabel("涨幅(百分比)")# plt.barh([10],[sh_change],color='r')rets = plt.barh(x,p_changes,color='sage',align="center")plt.grid(True)
上证两年的涨跌幅为30%
涨幅在此之下的股票有:
五、对比各股两年的平均换手率:
# 各低价股的换手率对比
codes = []
for i in code_list:
# 获取两年的历史行情数据
turnovers = ts.get_hist_data(code=i,start='',end='').turnover
# 获取存在数据天数
t_days = len(turnovers)
# 对换手率进行相加
turnovers = turnovers.sum()
# 计算平均换手率
avg_tur = turnovers/t_days
codes.append(i)
tur.append(avg_tur)
x = np.arange(len(codes))
plt.title("各低价股两年平均换手率")
plt.yticks(x,codes)
plt.barh(x,tur,color='darkslategrey',align='center')
plt.grid(True)
12345678910111213141516171819
# 各低价股的换手率对比codes = []tur = []for i in code_list:&&&&# 获取两年的历史行情数据&&&&turnovers = ts.get_hist_data(code=i,start='',end='').turnover&&&&# 获取存在数据天数&&&&t_days = len(turnovers)&&&&# 对换手率进行相加&&&&turnovers = turnovers.sum()&&&&# 计算平均换手率&&&&avg_tur = turnovers/t_days&&&&codes.append(i)&&&&tur.append(avg_tur)x = np.arange(len(codes))plt.title("各低价股两年平均换手率")plt.yticks(x,codes)plt.barh(x,tur,color='darkslategrey',align='center')plt.grid(True)
两年平均换手率最高的为:601005重庆钢铁
两年平均换手率最低的为:600022山东钢铁
嗯,简单的筛选就已经结束了,不知道你心里有没有心仪的低价股了?
不着调、瞎扯谈、乱翻书
如果本文对你有帮助,欢迎打赏一瓶怡宝:用Python浅析股票数据 - Python - 伯乐在线
& 用Python浅析股票数据
本文将使用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系,最后使用移动平均线方法初探投资策略。
这里将股票数据存储在stockData.txt文本文件中,我们使用pandas.read_table()函数将文件数据读入成DataFrame格式。
其中参数usecols=range(15)限制只读取前15列数据,parse_dates=[0]表示将第一列数据解析成时间格式,index_col=0则将第一列数据指定为索引。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
%pylab inline
pylab.rcParams['figure.figsize'] = (10, 6) #设置绘图尺寸
stock = pd.read_table('stockData.txt', usecols=range(15), parse_dates=[0], index_col=0)
stock = stock[::-1]
stock.head()
12345678910111213141516
import pandas as pdimport numpy as npimport matplotlib.pyplot as plt&%matplotlib inline&%config InlineBackend.figure_format = 'retina'&%pylab inline&pylab.rcParams['figure.figsize'] = (10, 6) #设置绘图尺寸&#读取数据stock = pd.read_table('stockData.txt', usecols=range(15), parse_dates=[0], index_col=0)stock = stock[::-1]&&#逆序排列stock.head()
以上显示了前5行数据,要得到数据的更多信息,可以使用.info()方法。它告诉我们该数据一共有20行,索引是时间格式,日期从日到日。总共有14列,并列出了每一列的名称和数据格式,并且没有缺失值。
stock.info()
&class 'pandas.core.frame.DataFrame'&
DatetimeIndex: 20 entries,
Data columns (total 14 columns):
20 non-null float64
20 non-null float64
20 non-null float64
20 non-null float64
20 non-null float64
price_change
20 non-null float64
20 non-null float64
20 non-null float64
20 non-null float64
20 non-null float64
20 non-null float64
20 non-null float64
20 non-null float64
20 non-null float64
dtypes: float64(14)
memory usage: 2.3 KB
12345678910111213141516171819
&class 'pandas.core.frame.DataFrame'&DatetimeIndex: 20 entries, 2015-01-05 to 2015-01-30Data columns (total 14 columns):&&&&open&&&&&&&&20 non-null float64high&&&&&&&&&&&&20 non-null float64close&&&&&&&&&& 20 non-null float64low&&&&&&&&&&&& 20 non-null float64volume&&&&&&&&&&20 non-null float64price_change&&&&20 non-null float64p_change&&&&&&&&20 non-null float64ma5&&&&&&&&&&&& 20 non-null float64ma10&&&&&&&&&&&&20 non-null float64ma20&&&&&&&&&&&&20 non-null float64v_ma5&&&&&&&&&& 20 non-null float64v_ma10&&&&&&&&&&20 non-null float64v_ma20&&&&&&&&&&20 non-null float64turnover&&&&&&&&20 non-null float64dtypes: float64(14)memory usage: 2.3 KB
在观察每一列的名称时,我们发现’open’的列名前面似乎与其它列名不太一样,为了更清楚地查看,使用.columns得到该数据所有的列名如下:
stock.columns
stock.columns
open', 'high', 'close', 'low', 'volume', 'price_change',
'p_change', 'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20',
'turnover'],
dtype='object')
Index(['&&&&open', 'high', 'close', 'low', 'volume', 'price_change',&&&&&& 'p_change', 'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20',&&&&&& 'turnover'],&&&&&&dtype='object')
于是发现’open’列名前存在多余的空格,我们使用如下方法修正列名。
stock.rename(columns={'
open':'open'}, inplace=True)
stock.rename(columns={'&&&&open':'open'}, inplace=True)
至此,我们完成了股票数据的导入和清洗工作,接下来将使用可视化的方法来观察这些数据。
首先,我们观察数据的列名,其含义对应如下:
price_change
这些指标总体可分为两类:
价格相关指标
当日价格:开盘、收盘价,最高、最低价
价格变化:价格变动和涨跌幅
均价:5、10、20日均价
成交量相关指标
换手率:成交量/发行总股数×100%
成交量均量:5、10、20日均量
由于这些指标都是随时间变化的,所以让我们先来观察它们的时间序列图。
时间序列图
以时间为横坐标,每日的收盘价为纵坐标,做折线图,可以观察股价随时间的波动情况。这里直接使用DataFrame数据格式自带的做图工具,其优点是能够快速做图,并自动优化图形输出形式。
stock['close'].plot(grid=True)
stock['close'].plot(grid=True)
如果我们将每日的开盘、收盘价和最高、最低价以折线的形式绘制在一起,难免显得凌乱,也不便于分析。那么有什么好的方法能够在一张图中显示出这四个指标?答案下面揭晓。
相传K线图起源于日本德川幕府时代,当时的商人用此图来记录米市的行情和价格波动,后来K线图被引入到股票市场。每天的四项指标数据用如下蜡烛形状的图形来记录,不同的颜色代表涨跌情况。
图片来源:/wiki/K线理论
Matplotlib.finance模块提供了绘制K线图的函数candlestick_ohlc(),但如果要绘制比较美观的K线图还是要下点功夫的。下面定义了pandas_candlestick_ohlc()函数来绘制适用于本文数据的K线图,其中大部分代码都是在设置坐标轴的格式。
from matplotlib.finance import candlestick_ohlc
from matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator, MONDAY
def pandas_candlestick_ohlc(stock_data, otherseries=None):
# 设置绘图参数,主要是坐标轴
mondays = WeekdayLocator(MONDAY)
alldays = DayLocator()
dayFormatter = DateFormatter('%d')
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
if stock_data.index[-1] - stock_data.index[0] & pd.Timedelta('730 days'):
weekFormatter = DateFormatter('%b %d')
ax.xaxis.set_major_locator(mondays)
ax.xaxis.set_minor_locator(alldays)
weekFormatter = DateFormatter('%b %d, %Y')
ax.xaxis.set_major_formatter(weekFormatter)
ax.grid(True)
# 创建K线图
stock_array = np.array(stock_data.reset_index()[['date','open','high','low','close']])
stock_array[:,0] = date2num(stock_array[:,0])
candlestick_ohlc(ax, stock_array, colorup = "red", colordown="green", width=0.4)
# 可同时绘制其他折线图
if otherseries is not None:
for each in otherseries:
plt.plot(stock_data[each], label=each)
plt.legend()
ax.xaxis_date()
ax.autoscale_view()
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.show()
123456789101112131415161718192021222324252627282930313233343536373839
from matplotlib.finance import candlestick_ohlcfrom matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator, MONDAY&def pandas_candlestick_ohlc(stock_data, otherseries=None):&&&&&&&&&# 设置绘图参数,主要是坐标轴 &&&&mondays = WeekdayLocator(MONDAY) &&&&alldays = DayLocator()&& &&&&dayFormatter = DateFormatter('%d')&&&&&fig, ax = plt.subplots()&&&&fig.subplots_adjust(bottom=0.2)&&&&if stock_data.index[-1] - stock_data.index[0] & pd.Timedelta('730 days'):&&&&&&&&weekFormatter = DateFormatter('%b %d')&&&&&&&&&&ax.xaxis.set_major_locator(mondays)&&&&&&&&ax.xaxis.set_minor_locator(alldays)&&&&else:&&&&&&&&weekFormatter = DateFormatter('%b %d, %Y')&&&&ax.xaxis.set_major_formatter(weekFormatter)&&&&ax.grid(True)&&&&&# 创建K线图&& &&&&stock_array = np.array(stock_data.reset_index()[['date','open','high','low','close']])&&&&stock_array[:,0] = date2num(stock_array[:,0])&&&&candlestick_ohlc(ax, stock_array, colorup = "red", colordown="green", width=0.4)&&&&&&# 可同时绘制其他折线图&&&&if otherseries is not None:&&&&&&&&for each in otherseries:&&&&&&&&&&&&plt.plot(stock_data[each], label=each)&&&&&&&&&&&&&&&&&&&&plt.legend()&&&&&&ax.xaxis_date()&&&&ax.autoscale_view()&&&&plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')&&&&&plt.show()
pandas_candlestick_ohlc(stock)
pandas_candlestick_ohlc(stock)
这里红色代表上涨,绿色代表下跌。
相对变化量
股票中关注的不是价格的绝对值,而是相对变化量。有多种方式可以衡量股价的相对值,最简单的方法就是将股价除以初始时的价格。
stock['return'] = stock['close'] / stock.close.iloc[0]
stock['return'].plot(grid=True)
stock['return'] = stock['close'] / stock.close.iloc[0]stock['return'].plot(grid=True)
第二种方法是计算每天的涨跌幅,但计算方式有两种:
这两者可能导致不同的分析结果,样例数据中的涨跌幅使用的是第一个公式,并乘上了100%。
stock['p_change'].plot(grid=True).axhline(y=0, color='black', lw=2)
stock['p_change'].plot(grid=True).axhline(y=0, color='black', lw=2)
为了解决第二种方法中的两难选择,我们引入第三种方法,就是计算价格的对数之差,公式如下:
close_price = stock['close']
log_change = np.log(close_price) - np.log(close_price.shift(1))
log_change.plot(grid=True).axhline(y=0, color='black', lw=2)
close_price = stock['close']log_change = np.log(close_price) - np.log(close_price.shift(1))log_change.plot(grid=True).axhline(y=0, color='black', lw=2)
在观察了价格的走势之后,我们来看看各指标之间的关系。下面挑选了部分代表性的指标,并使用pandas.scatter_matrix()函数,将各项指标数据两两关联做散点图,对角线是每个指标数据的直方图。
small = stock[['close', 'price_change', 'ma20','volume', 'v_ma20', 'turnover']]
_ = pd.scatter_matrix(small)
small = stock[['close', 'price_change', 'ma20','volume', 'v_ma20', 'turnover']]_ = pd.scatter_matrix(small)
图中可以明显发现成交量(volume)和换手率(turnover)有非常明显的线性关系,其实换手率的定义就是:成交量除以发行总股数,再乘以100%。所以下面的分析中我们将换手率指标去除,这里使用了相关性关系来实现数据降维。
上面的散点图看着有些眼花缭乱,我们可以使用numpy.corrcof()来直接计算各指标数据间的相关系数。
small = stock[['close', 'price_change', 'ma20','volume', 'v_ma20']]
cov = np.corrcoef(small.T)
small = stock[['close', 'price_change', 'ma20','volume', 'v_ma20']]cov = np.corrcoef(small.T)cov
array([[ 1.
0.3721832 , -0.],
[ 0., -0.,
0.3721832 , -0.,
[-0., -0.,
array([[ 1.&&&&&&&&,&&0.,&&0.,&&0., -0.],&&&&&& [ 0.,&&1.&&&&&&&&, -0.,&&0.3721832 , -0.],&&&&&& [ 0., -0.,&&1.&&&&&&&&, -0.,&&0.],&&&&&& [ 0.,&&0.3721832 , -0.,&&1.&&&&&&&&, -0.],&&&&&& [-0., -0.,&&0., -0.,&&1.&&&&&&&&]])
如果觉得看数字还是不够方便,我们继续将上述相关性矩阵转换成图形,如下图所示,其中用颜色来代表相关系数。我们发现位于(0,3)位置的相关系数非常大,查看数值达到0.91。这两个强烈正相关的指标是收盘价和成交量。
img = plt.matshow(cov,cmap=plt.cm.winter)
plt.colorbar(img, ticks=[-1,0,1])
plt.show()
img = plt.matshow(cov,cmap=plt.cm.winter)plt.colorbar(img, ticks=[-1,0,1])plt.show()
以上我们用矩阵图表的方式在多个指标中迅速找到了强相关的指标。接着做出收盘价和成交量的折线图,因为它们的数值差异很大,所以我们采用两套纵坐标体系来做图。
stock[['close','volume']].plot(secondary_y='volume', grid=True)
stock[['close','volume']].plot(secondary_y='volume', grid=True)
观察这两个指标的走势,在大部分时候股价上涨,成交量也上涨,反之亦然。但个别情况下则不成立,可能是成交量受到前期的惯性影响,或者还有其他因素。
移动平均线
吴军老师曾讲述他的投资经验,大意是说好的投资方式不是做预测,而是能在合适的时机做出合适的应对和决策。同样股市也没法预测,我们能做的是选择恰当的策略应对不同的情况。
好的指标是能驱动决策的。在上面的分析中我们一直没有使用的一类指标是5、10、20日均价,它们又称为移动平均值,下面我们就使用这项指标来演示一个简单的股票交易策略。(警告:这里仅仅是演示说明,并非投资建议。)
为了得到更多的数据来演示,我们使用pandas_datareader直接从雅虎中下载最近一段时间的谷歌股票数据。
import datetime
import pandas_datareader.data as web
# 设置股票数据的时间跨度
start = datetime.datetime()
end = datetime.date.today()
# 从yahoo中获取google的股价数据。
goog = web.DataReader("GOOG", "yahoo", start, end)
#修改索引和列的名称,以适应本文的分析
goog.index.rename('date', inplace=True)
goog.rename(columns={'Open':'open', 'High':'high', 'Low':'low', 'Close':'close'}, inplace=True)
goog.head()
123456789101112131415
import datetimeimport pandas_datareader.data as web&# 设置股票数据的时间跨度start = datetime.datetime(2016,10,1)end = datetime.date.today()&# 从yahoo中获取google的股价数据。goog = web.DataReader("GOOG", "yahoo", start, end)&#修改索引和列的名称,以适应本文的分析goog.index.rename('date', inplace=True)goog.rename(columns={'Open':'open', 'High':'high', 'Low':'low', 'Close':'close'}, inplace=True)&goog.head()
数据中只有每天的价格和成交量,所以我们需要自己算出5日均价和10日均价,并将均价的折线图(也称移动平均线)与K线图画在一起。
goog["ma5"] = np.round(goog["close"].rolling(window = 5, center = False).mean(), 2)
goog["ma20"] = np.round(goog["close"].rolling(window = 20, center = False).mean(), 2)
goog = goog['':]
pandas_candlestick_ohlc(goog, ['ma5','ma20'])
goog["ma5"] = np.round(goog["close"].rolling(window = 5, center = False).mean(), 2)goog["ma20"] = np.round(goog["close"].rolling(window = 20, center = False).mean(), 2)goog = goog['':]&pandas_candlestick_ohlc(goog, ['ma5','ma20'])
观察上图,我们发现5日均线与K线图较为接近,而20日均线则更平坦,可见移动平均线具有抹平短期波动的作用,更能反映长期的走势。比较5日均线和20日均线,特别是关注它们的交叉点,这些是交易的时机。移动平均线策略,最简单的方式就是:当5日均线从下方超越20日均线时,买入股票,当5日均线从上方越到20日均线之下时,卖出股票。
为了找出交易的时机,我们计算5日均价和20日均价的差值,并取其正负号,作于下图。当图中水平线出现跳跃的时候就是交易时机。
goog['ma5-20'] = goog['ma5'] - goog['ma20']
goog['diff'] = np.sign(goog['ma5-20'])
goog['diff'].plot(ylim=(-2,2)).axhline(y=0, color='black', lw=2)
goog['ma5-20'] = goog['ma5'] - goog['ma20']goog['diff'] = np.sign(goog['ma5-20'])goog['diff'].plot(ylim=(-2,2)).axhline(y=0, color='black', lw=2)
为了更方便观察,上述计算得到的均价差值,再取其相邻日期的差值,得到信号指标。当信号为1时,表示买入股票;当信号为-1时,表示卖出股票;当信号为0时,不进行任何操作。
goog['signal'] = np.sign(goog['diff'] - goog['diff'].shift(1))
goog['signal'].plot(ylim=(-2,2))
goog['signal'] = np.sign(goog['diff'] - goog['diff'].shift(1))goog['signal'].plot(ylim=(-2,2))
从上图中看出,从今年初到现在,一共有两轮买进和卖出的时机。到目前为止,似乎一切顺利,那么让我们看下这两轮交易的收益怎么样吧。
trade = pd.concat([
pd.DataFrame({"price": goog.loc[goog["signal"] == 1, "close"],
"operation": "Buy"}),
pd.DataFrame({"price": goog.loc[goog["signal"] == -1, "close"],
"operation": "Sell"})
trade.sort_index(inplace=True)
trade = pd.concat([&&&&pd.DataFrame({"price": goog.loc[goog["signal"] == 1, "close"],&&&&&&&&&&&&&&&&&&"operation": "Buy"}),&&&&pd.DataFrame({"price": goog.loc[goog["signal"] == -1, "close"],&&&&&&&&&&&&&&&&&&"operation": "Sell"})&&&&])&trade.sort_index(inplace=True)trade
上述表格列出了交易日期、操作和当天的价格。但很遗憾地发现,这两轮交易的卖出价都小于买入价,实际上按上述方法交易我们亏本了!!!
你是否很愤怒呢?原来分析到现在,都是假的呀!我之前就警告过,这里的分析只是演示移动平均线策略的思想,而并非真正的投资建议。股票市场是何其的复杂多变,又如何是一个小小的策略所能战胜的呢?
那么这个策略就一无是处吗?非也!如果考虑更长的时间跨度,比如5年、10年,并考虑更长的均线,比如将20日均线和50日均线比较;虽然过程中也有亏损的时候,但赢的概率更大。也就是说,在更长的时间尺度上该策略也是可行的。但即使你赚了,又能跑赢大盘吗?这时候还需用到其他方法,比如合理配置投资比例等。
还是那句话,股市有风险,投资需谨慎。本文不是分析股票的文章,而是借用股票数据来说明数据分析的基本方法,以及演示什么样的指标是好的指标。
参考资料:
请使用手机”扫一扫”x
可能感兴趣的话题
作者有git么 或者源码所在地址
o 248 回复
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线

我要回帖

更多关于 python 股票分析 源码 的文章

 

随机推荐