Python获取股票历史数据并分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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]):