当前位置:文档之家› Python获取股票历史数据并分析

Python获取股票历史数据并分析

Python获取股票历史数据并简单分析
最近股市又跌的厉害,又有人鼓吹股灾了。

纵观最近2年的A股几乎每隔一段实际就一次大调整,然后每次的调整都亏一大把。

心想有没有办法可以预测这种调整,经过几度分析,发现一个简单的规律,就是每次有大调整时,跌幅大于3%的股票就会出现很多。

于是想是不是可以以跌幅大于3%的比例作为一种参考呢。

于是就开始验证这种预警是否可靠。

要验证这种猜想需要大量的数据,基本需要每只股票的每天交易数据。

下面就要想办法获取这些历史数据。

数据包含:股票编码、交易日、开盘价、最高价、收盘价、最低价、价格涨幅、涨幅、5日、10日、20日均线
5日、10日、20日平均成交量
一共获取3198只股票最近三年的成交数据,一共190万条数据。

下面看看每日的上证指数、股票涨幅超过3%的比率(up3)、以及股票跌幅超过3%的比率三者之间的关系图如下:
再看看每日的上证指数涨幅、股票涨幅超过3%的比率(up3)、以及股票跌幅超过3%的比率三者之间的关系图如下:
如上有几个简单规律
1、当跌幅超过3%的股票占比超过10%时,意味股市的调整开始了。

所以大家要小心
2、上证上涨时,涨幅超过3%的股票占比变化不明显,说明上涨起来慢,不让你发现。

跌起来快不让你逃跑。

3、当跌幅超过3%的股票占比超过20%时,一定要先出来,意味着后面还有调整
获取股票历史数据以及分析源码如下:
#以下为股票数据获取的源码
import sqlite3
import pandas as pd
import datetime
import math
import tushare as ts
dbname='stocks'
if 'stocks' not in dir():
stocks=ts.get_stock_basics()
def getTag(x):
tag=math.floor(x)
if tag>=8 :
return 8
elif tag<=-8:
return -8
else:
return tag
def tableCheck():
curs= conn.cursor()
sql="SELECT name num FROM sqlite_master WHERE type='table' AND name='stocks'"
curs.execute(sql)
isexists=curs.fetchall()
if len(isexists)>0:
curs.close()
else:
sql="""CREATE TABLE stocks (
date TEXT,
open REAL,
high REAL,
close REAL,
low REAL,
volume REAL,
price_change REAL,
p_change REAL,
ma5 REAL,
ma10 REAL,
ma20 REAL,
v_ma5 REAL,
v_ma10 REAL,
v_ma20 REAL,
code TEXT,
tag REAL
)"""
curs.execute(sql)
curs.close()
def getLastDate():
curs= conn.cursor()
sql="SELECT code,date(ifnull(max(date),'2000-01-01'),'start of day','1 day') maxdate FROM stocks group by code"
curs.execute(sql)
dates=curs.fetchall()
if len(dates)>0:
return dict(dates)
else:
return {'1000':'2000-01-01'}
if __name__=='__main__':
yes_time = datetime.datetime.now() + datetime.timedelta(days=-1) enddate=yes_time.strftime("%Y-%m-%d")
conn = sqlite3.connect("E:/myprog/TestData.db") #
tableCheck()
mapdate=getLastDate()
i=1
total=len(stocks)
stlist=list(stocks.index)
stlist.append('sh')
stlist.append('sz')
for code in stlist:
print("正在获取第",i,"个,共:",total,"-----",code)
if code in mapdate.keys():
startdate=mapdate[code]
else:
startdate='2001-01-01'
i=i+1
if enddate>startdate:
d=ts.get_hist_data(code,startdate,enddate)
if len(d)>0:
d['code']=code
d['tag']=d['p_change'].apply(getTag)
d.to_sql(dbname,conn,flavor='sqlite',if_exists='append')
conn.close()
#data=pd.read_sql('select * from stocks',conn)
#以下为数据分析源码
import tushare as ts
import sqlite3
import pandas as pd
import datetime
if __name__=='__main__':
yes_time = datetime.datetime.now() + datetime.timedelta(days=-1) enddate=yes_time.strftime("%Y-%m-%d")
conn = sqlite3.connect("E:/myprog/TestData.db") #
#data=pd.read_sql('select * from stocks',conn)
st=data.groupby(['date','tag'])['code'].count()#.reset_index()
m=st.unstack().fillna(0)
p=m.copy()
for i in range(p.shape[1]):
if i>0:
p.iloc[:,i]=p.iloc[:,i]+p.iloc[:,i-1]
st=pd.DataFrame()
st['un7']=p[-8]*100/p[8]
st['un5']=p[-6]*100/p[8]
st['un3']=p[-4]*100/p[8]
st['un1']=p[-2]*100/p[8]
st['fall']=p[-1]*100/p[8]
st['up1']=100-p[0]*100/p[8]
st['up3']=100-p[2]*100/p[8]
st['up5']=100-p[4]*100/p[8]
st['up7']=100-p[6]*100/p[8]
sh=pd.read_sql("select date,close,p_change from stocks where code='sh'",conn,index_col='date') st=st.join(sh,how='inner')
st=st.sort_index()
st=st[st.index>'2016-10-01']
st[['un3','up3','close']].plot(kind='line',figsize=(22,10),secondary_y='close',grid=True)
st[['un3','up3','p_change']].plot(kind='line',figsize=(22,10),secondary_y='p_change',grid=True)。

相关主题