需要安装的第三方库
tushare
代码
import tushare as ts
import matplotlib.pyplot as plt
import numpy as np
import datetime as dt
def _get_today():
"""
获取今天的日期
"""
today = dt.datetime.today()
return str(today.strftime("%Y-%m-%d"))
def _get_data(code):
"""
获取并返回股票代码为code的历史数据
"""
today = _get_today()
#cols = ['open','high','close','low','price_change']
d = ts.get_hist_data(code,end=today) #[cols]
d.to_excel(r'D:\file\office2016\Excel\stock\%s.xlsx' %code) #保存历史数据
return d
def _describe_data(code):
"""
返回历史数据统计信息
"""
cols = ['open','high','close','low','price_change']
return print(_get_data(code).describe()[cols])
def _recent_data(code,n):
"""
返回最近n条的数据
"""
cols = ['open','high','close','low','price_change']
return _get_data(code)[cols].head(n).sort_values(by='date',ascending=True)
def _show_recent(code,n):
"""
显示最近n条数据
"""
return print(_recent_data(code,n))
def _draw_trends(code,n):
"""
绘制最近n条数据的开盘价、最高价、最低价、收盘价的趋势图
"""
#获取最近一个月的数据
data = _recent_data(code,n)
#获取开盘价、最高价、最低价、收盘价及其平均值
open_price = data['open']
high_price = data['high']
close_price = data['close']
low_price = data['low']
mean_open = [np.mean(open_price)]*n
mean_high = [np.mean(high_price)]*n
mean_close = [np.mean(close_price)]*n
mean_low = [np.mean(low_price)]*n
price_change = data['price_change'] + mean_open[0]
#绘制属性设置
plt.style.use('ggplot')
#plt.grid(False)
plt.rcParams['font.sans-serif']=['SimHei']
ax = plt.gca()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
#绘制最近n条数据的开盘价、最高价、最低价、收盘价的趋势图
plt.title('股票代码: %s' %code)
time = np.arange(n)
plt.plot(time,open_price,'ro-',alpha=0.4,label='开盘价')
plt.plot(time,high_price,'y^-',alpha=0.8,label='最高价')
plt.plot(time,close_price,'go-',alpha=0.4,label='收盘价')
plt.plot(time,low_price,'bv-',alpha=0.8,label='最低价')
#绘制平均值
plt.plot(time,mean_open,'r--',alpha=0.4,label="平均开盘价: {:.3f}".format(mean_open[0]))
plt.plot(time,mean_high,'y--',alpha=0.4,label="平均最高价: {:.3f}".format(mean_high[0]))
plt.plot(time,mean_close,'g--',alpha=0.4,label="平均收盘价: {:.3f}".format(mean_close[0]))
plt.plot(time,mean_low,'b--',alpha=0.4,label="平均最低价: {:.3f}".format(mean_low[0]))
#绘制涨跌曲线
plt.plot(time,price_change,'cs--',alpha=0.2,label='涨跌曲线(以平均开盘价为参考线)')
#显示设置
plt.xticks(range(n),range(1,n+1))
plt.legend(loc=0)
plt.grid(False)
def show():
"""
显示
"""
code=input("输入代码: ")
n=int(input("查看条数: "))
print("历史数据统计")
_describe_data(code)
print("最近数据")
_show_recent(code,n)
_draw_trends(code,n)
plt.show()
def cal():
"""
计算
"""
code=input("输入代码: ")
buyprice=float(input("买入价格: "))
buynumbers=float(input("买入数量: "))
if code[:3] in ['600','601']:
if buyprice*buynumbers*3/1000<=5:
if buynumbers<=1000:
costprice=buyprice*buynumbers+5+1
else:
costprice=buyprice*buynumbers+5+buynumbers/1000
else:
if buynumbers<=1000:
costprice=buyprice*buynumbers*(1+3/1000)+1
else:
costprice=buyprice*buynumbers*(1+3/1000)+buynumbers/1000
else:
if buyprice*buynumbers*3/1000<=5:
costprice=buyprice*buynumbers+5
else:
costprice=buyprice*buynumbers*(1+3/1000)
print("成本价格: {:.3f}".format(costprice/buynumbers))
sellprice=float(input("卖出价格: "))
sellnumbers=float(input("卖出数量: "))
if code[:3] in ['600','601']:
if sellprice*sellnumbers*1/1000<=5:
netsell=sellprice*sellnumbers-5
else:
netsell=sellprice*sellnumbers*(1-1/1000)
else:
if sellprice*sellnumbers*1/1000<=5:
netsell=sellprice*sellnumbers-5
else:
netsell=sellprice*sellnumbers*(1-1/1000)
print(" 收入: {:0.3f}".format(netsell-costprice))
print(" 收益率: {:0.3f}%".format(100*(netsell-costprice)/netsell))
if __name__ == "__main__":
pass