找出股票中的机会

# 0.设定基础数据
# 股票代码和日期
import pandas as pd
import numpy as np
%matplotlib inline
%matplotlib notebook
import matplotlib.pyplot as plt
import pandas_datareader.data as web
import timestock_code='600036.SS'
stock_date_from = '2010-01-01'
mask='01-2020'
ma_shift_before = 3# 筛选条件
ma1_higher_ma5_rate = 1.01
ma1_higher_ma10_rate = 1.01
ma1_higher_ma30_rate = 1.01
ma5_higher_ma10_rate = 1.01
ma5_higher_ma30_rate = 1.01
ma10_higher_ma30_rate = 1.01
ma1_lower_ma5_rate = 1
ma1_lower_ma10_rate = 1
ma1_lower_ma30_rate = 1.1
ma30_increase_day = 3
from datetime import datetime
now = datetime.now()
today='2020-10-26'
#today = ('{0}-{1}-{2}'.format(now.year,now.month,now.day-15))def get_gold_folk(stock_code,stock_date_from,mask,ma1_higher_ma30_rate,ma5_higher_ma30_rate,ma10_higher_ma30_rate,ma30_increase_day,today):
## 获得股票金叉时间点,若today是金叉日,则输出报表# 1.获得股票信息price = web.get_data_yahoo(stock_code, stock_date_from,today)['Adj Close']#price[-5:]# 2.1画图 历史数据ma5 = pd.DataFrame.rolling(price,5).mean()ma10 = pd.DataFrame.rolling(price,10).mean()ma30 = pd.DataFrame.rolling(price,30).mean()# 2.2画图 2020年1月之后ma1 = price#ma1.plot(label='ma1')ma5 = pd.DataFrame.rolling(price,5).mean()#ma5[mask:].plot(label='ma5')ma10 = pd.DataFrame.rolling(price,10).mean()#ma10[mask:].plot(label='ma10')ma30 = pd.DataFrame.rolling(price,30).mean()#ma30[mask:].plot(label='ma30')#plt.legend()#plt.savefig('{}.jpg'.format(stock_code),bbox='tight')# 3.将移动平均数整合成一个ma_df = pd.DataFrame([ma1,ma5,ma10,ma30],index=['ma1', 'ma5', 'ma10' ,'ma30'])# 通过T将日期设为indexma_df = ma_df.T#print(ma_df)# 4.1 整合条件# 条件4:ma30的变化率过去10日有8个为正ma_df_copy = ma_df.copy()ma_df_copy['shift1'] = ma_df_copy[['ma30']].pct_change().shift(1)ma_df_copy['shift2'] = ma_df_copy[['ma30']].pct_change().shift(2)ma_df_copy['shift3'] = ma_df_copy[['ma30']].pct_change().shift(3)ma_df_copy['shift4'] = ma_df_copy[['ma30']].pct_change().shift(4)ma_df_copy['shift5'] = ma_df_copy[['ma30']].pct_change().shift(5)ma_df_copy['shift6'] = ma_df_copy[['ma30']].pct_change().shift(6)ma_df_copy['shift7'] = ma_df_copy[['ma30']].pct_change().shift(7)ma_df_copy['shift8'] = ma_df_copy[['ma30']].pct_change().shift(8)ma_df_copy['shift9'] = ma_df_copy[['ma30']].pct_change().shift(9)ma_df_copy['shift10'] = ma_df_copy[['ma30']].pct_change().shift(10)# 将百分比转化为True,Falsema_df_copy = ma_df_copy[['shift1','shift2','shift3','shift4','shift5','shift6','shift7','shift8','shift9','shift10',]] > 0ma_df_copy = ma_df_copy.replace(False, 0)ma_df_copy = ma_df_copy.replace(True, 1)ma_df_copy['+_summary'] = (ma_df_copy.shift1 + ma_df_copy.shift2 + ma_df_copy.shift3 + ma_df_copy.shift4 + ma_df_copy.shift5 + ma_df_copy.shift6 + ma_df_copy.shift7 + ma_df_copy.shift8 + ma_df_copy.shift9 + ma_df_copy.shift10)#print(ma_df_copy)# 4.2 将summary合并到ma_df中ma_df2 = pd.merge(ma_df,ma_df_copy[['+_summary']],on=ma_df.index,left_index=True)ma_df2['stock_code'] = stock_codema_df2 = ma_df2[['stock_code','ma1','ma5','ma10','ma30','+_summary']]#print(ma_df2)# 4.3 将MA1.shift(5)小于MA30.shift(5)纳入考量范围ma_df_copy2 = ma_df.copy()ma_df_copy2['ma1_shift'] = ma_df_copy2[['ma1']].shift(ma_shift_before)ma_df_copy2['ma5_shift'] = ma_df_copy2[['ma5']].shift(ma_shift_before)ma_df_copy2['ma10_shift'] = ma_df_copy2[['ma10']].shift(ma_shift_before)ma_df_copy2['ma30_shift'] = ma_df_copy2[['ma30']].shift(ma_shift_before)# 将 ma1<ma5等条件合并到ma_df中ma_df2 = pd.merge(ma_df2,ma_df_copy2[['ma1_shift','ma5_shift','ma10_shift','ma30_shift']],on=ma_df2.index,left_index=True)ma_df2['stock_code'] = stock_codema_df2 = ma_df2[['stock_code','ma1','ma5','ma10','ma30','+_summary','ma1_shift','ma5_shift','ma10_shift','ma30_shift']]#print(ma_df2)# 5.进行金叉判断#   判断6:标记买入卖出# 标记买入mask = ((ma_df2['ma1']<=ma_df2['ma30']*0.88))ma_if_df = ma_df2[mask]ma_if_df['Buy'] = 'Buy'ma_df2 = ma_df2.join(ma_if_df[['Buy']])#标记卖出mask_sell = ((ma_df2['ma1']>=ma_df2['ma30']*1.12) )ma_if_df2 = ma_df2[mask_sell]ma_if_df2['Sell'] = 'Sell'ma_df2 = ma_df2.join(ma_if_df2[['Sell']])#  判断5:标记买入卖出
#    # 标记买入
#    mask = ((ma_df2['ma1']>=ma_df2['m30']*0.88) &
#                  (ma_df2['ma1']>=ma_df2['ma10']*ma1_higher_ma10_rate) &
#                  (ma_df2['ma1']>=ma_df2['ma30']*ma1_higher_ma30_rate) &
#                  (ma_df2['ma5_shift'] <= ma_df2['ma30_shift']) &
#                  (ma_df2['ma10_shift'] <= ma_df2['ma30_shift']) &
#                  (ma_df2['ma30'] >= ma_df2['ma30_shift']*0.95) )
#    ma_if_df = ma_df2[mask]
#    ma_if_df['Buy'] = 'Buy'
#    ma_df2 = ma_df2.join(ma_if_df[['Buy']])#    #标记卖出
#    mask_sell = ((ma_df2['ma1']>=ma_df2['ma30']*1.12) )
#    ma_if_df2 = ma_df2[mask_sell]
#    ma_if_df2['Sell'] = 'Sell'
#    ma_df2 = ma_df2.join(ma_if_df2[['Sell']])#  判断4:标记买入卖出
#    # 标记买入
#    mask = ((ma_df2['ma1']>=ma_df2['ma5']*ma1_higher_ma5_rate) &
#                  (ma_df2['ma1']>=ma_df2['ma10']*ma1_higher_ma10_rate) &
#                  (ma_df2['ma1']>=ma_df2['ma30']*ma1_higher_ma30_rate) &
#                  (ma_df2['ma5_shift'] <= ma_df2['ma30_shift']) &
#                  (ma_df2['ma10_shift'] <= ma_df2['ma30_shift']) )
#    ma_if_df = ma_df2[mask]
#    ma_if_df['Buy'] = 'Buy'
#    ma_df2 = ma_df2.join(ma_if_df[['Buy']])#    #标记卖出
#    mask_sell = ((ma_df2['ma1']<=ma_df2['ma5']*ma1_lower_ma5_rate) &
#                  (ma_df2['ma1']<=ma_df2['ma10']*ma1_lower_ma10_rate) &
#                  (ma_df2['ma1']<=ma_df2['ma30']*ma1_lower_ma30_rate) &
#                  (ma_df2['ma5_shift'] >= ma_df2['ma30_shift']) &
#                  (ma_df2['ma10_shift'] >= ma_df2['ma30_shift']) )
#    ma_if_df2 = ma_df2[mask_sell]
#    ma_if_df2['Sell'] = 'Sell'
#    ma_df2 = ma_df2.join(ma_if_df2[['Sell']])#  判断3:标记买入
#    mask = ((ma_df2['ma1']>=ma_df2['ma5']*ma1_higher_ma5_rate) &
#                  (ma_df2['ma1']>=ma_df2['ma10']*ma1_higher_ma10_rate) &
#                  (ma_df2['ma1']>=ma_df2['ma30']*ma1_higher_ma30_rate) &
#                  (ma_df2['ma5_shift'] <= ma_df2['ma30_shift']) &
#                  (ma_df2['ma10_shift'] <= ma_df2['ma30_shift']) )
#    ma_if_df = ma_df2[mask]
#    ma_if_df['Buy'] = 'Buy'
#    ma_df2 = ma_df2.join(ma_if_df[['Buy']])#    判断2:shift MA低于MA30
#    ma_if_df = ma_df2[(ma_df2['ma1']>=ma_df2['ma5']*ma1_higher_ma5_rate) &
#                  (ma_df2['ma1']>=ma_df2['ma10']*ma1_higher_ma10_rate) &
#                  (ma_df2['ma1']>=ma_df2['ma30']*ma1_higher_ma30_rate) &
#                  (ma_df2['ma5_shift'] <= ma_df2['ma30_shift']) &
#                  (ma_df2['ma10_shift'] <= ma_df2['ma30_shift']) ]#    判断1:连续上涨天数
#    ma_if_df = ma_df2[(ma_df2['ma1']>=ma_df2['ma5']*ma1_higher_ma5_rate) &
#                  (ma_df2['ma1']>=ma_df2['ma10']*ma1_higher_ma10_rate) &
#                  (ma_df2['ma1']>=ma_df2['ma30']*ma1_higher_ma30_rate) &
#                  (ma_df2['ma5']>=ma_df2['ma10']*ma5_higher_ma10_rate) &
#                  (ma_df2['ma5']>=ma_df2['ma30']*ma5_higher_ma30_rate) &
#                  (ma_df2['ma10']>=ma_df2['ma30']*ma10_higher_ma30_rate) &
#                  (ma_df2['+_summary']>=ma30_increase_day) &
#                  (ma_df2['+_summary']<=ma30_increase_day+2)]# 参考条件# 条件1:ma1>ma30+5%# 条件2:ma5>ma30+5%# 条件3:ma10>ma30+5%# 条件4:ma30的变化率过去10日有8个为正# 条件5:日期包含今天# 6.将符合条件的数据导出if ma_df2.iloc[-1,-2]=='Buy' and ma_df2.iloc[-1,-1]=='Sell':ma_if_df.to_excel('{}-stock-buy.xlsx'.format(stock_code))ma_if_df2.to_excel('{}-stock-sell.xlsx'.format(stock_code))ma_df2.to_excel('{}-stock-Detail.xlsx'.format(stock_code))print('导出-买入-卖出',stock_code)elif ma_df2.iloc[-1,-2]=='Buy':ma_if_df.to_excel('{}-stock-buy.xlsx'.format(stock_code))ma_df2.to_excel('{}-stock-Detail.xlsx'.format(stock_code))print('导出-买入',stock_code)elif ma_df2.iloc[-1,-1]=='Sell':ma_if_df2.to_excel('{}-stock-sell.xlsx'.format(stock_code))ma_df2.to_excel('{}-stock-Detail.xlsx'.format(stock_code))print('导出-卖出',stock_code)else:print('未导出',stock_code)ma_df2.to_excel('{}-stock-Detail.xlsx'.format(stock_code))#print(ma_if_df)
print('ok')

读取股票数据

# 读取股票数据
import openpyxl
from openpyxl import load_workbook
wb = load_workbook("AA_stock_config.xlsx")
sheet = wb.get_sheet_by_name('stock')
rows=sheet.max_row
stock_codes=[]for i in range(1,rows+1):stock_code_i = sheet.cell(row=i,column=1).valuestock_codes.append('{}.SS'.format(stock_code_i))
print(stock_codes[:5])
# ['600000.SS', '600004.SS', '600006.SS', '600008.SS', '600009.SS']

产生股票推荐结果

for stock_code in stock_codes[:]:get_gold_folk(stock_code,stock_date_from,mask,ma1_higher_ma30_rate,ma5_higher_ma30_rate,ma10_higher_ma30_rate,ma30_increase_day,today)time.sleep(0.2)

标记特定股票的买卖点

# annotate
import matplotlib.pyplot as plt
%matplotlib inline
%matplotlib notebookstock_file='{}-stock-Detail.xlsx'.format(stock_code)stock = pd.read_excel(stock_file,index_col=0)
stock = stock['2018-01':'2020-10']
stock = stock[['ma1','ma5','ma10','ma30','Buy','Sell']]# 导出原始图表
fig = plt.figure(figsize=(7,7))
ax = fig.add_subplot(1,1,1)
#stock.plot(ax=ax,style=['g','y','r','b'])
stock.plot(ax=ax)
# 修正图表1# 找出buy的date
index1 = stock[stock['Buy']=='Buy'].index
crisis_data_buy = [x for x in index1]
#print(crisis_data_buy)
crisis_data1 = [(i,'.') for i in crisis_data_buy]for date,label in crisis_data1:ax.annotate(label,xy=(date,stock['ma1'].asof(date)-0.01),xytext=(date,stock['ma1'].asof(date)-0.2),arrowprops=dict(arrowstyle="simple",facecolor='red'),horizontalalignment='center',verticalalignment='top')# 修正图表2
index2 = stock[stock['Sell']=='Sell'].index
crisis_data_sell = [x for x in index2]
#print(crisis_data_sell)
crisis_data2 = [(i,'.') for i in crisis_data_sell]#crisis_data2 = [(datetime(2020,4,22),'.'),(datetime(2020,8,25),'.')]for date,label in crisis_data2:ax.annotate(label,xy=(date,stock['ma1'].asof(date)+0.01),xytext=(date,stock['ma1'].asof(date)+0.2),arrowprops=dict(arrowstyle="simple",facecolor='blue'),horizontalalignment='center',verticalalignment='top')#ax.set_xlim(['1/1/2020','12/31/2020'])
#ax.set_ylim([600,1800])
ax.set_title('Important dates in {}'.format(stock_code))

蓝色卖出,红色买入

# 导出最终图表
plt.savefig('Stock.jpg',bbox_inches='tight')

用Python实现选股票(Pandas,Matplotlib)相关推荐

  1. # Python 数据分析三剑客 numpy / pandas / matplotlib (numpy篇②)

    接着上一讲 切片是引用 切片在内存中使用的是引用机制. 引用机制意味着,Python并没有为b分配新的空间来存储它的值,而是让b指向了a所分配的内存空间,因此,改变b会改变a的值: a = np.ar ...

  2. 利用python建立股票量化交易系统(一)——小市值选股票模型

    从今天开始正式开启我的博客之旅,博客内容全部是我自己的量化心得,主要还是为自己将来中工作之中遇到相似问题,可以方便的找到答案,如果能帮到有相似问题的其他同学,我也很开心,如果帮不到的话,不喜勿喷,如果 ...

  3. Python numpy+pandas+matplotlib学习笔记

    Python numpy+pandas+matplotlib 本文是根据b站路飞学城Python数据分析全套教程的学习视频整理归纳的学习文档,主要目的是方便自己进行查阅,详细的还得去b站看原视频.另外 ...

  4. python 数据分析工具之 numpy pandas matplotlib

    作为一个网络技术人员,机器学习是一种很有必要学习的技术,在这个数据爆炸的时代更是如此. python做数据分析,最常用以下几个库 numpy pandas matplotlib 一.Numpy库 为了 ...

  5. python显示图像某列的颜色值_Python Pandas Matplotlib图由单列中定义的类型值着色

    我有以下格式的数据: import pandas as ps table={'time':[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5],\ 'data':[1,1,2,2,2,1,2 ...

  6. Python+pandas+matplotlib数据分析与可视化案例(附源码)

    问题描述:运行下面的程序,在当前文件夹中生成饭店营业额模拟数据文件data.csv 然后完成下面的任务: 1)使用pandas读取文件data.csv中的数据,创建DataFrame对象,并删除其中所 ...

  7. Python中装入包pandas和matplotlib

    安装 matplotlib和pandas 1,执行python -m pip install -U pip setuptools进行升级. 2,python -m pip install matplo ...

  8. python科学计算之numpy+pandas+matplotlib+mysql

    简介 本文主要介绍了读取mysql中的数据,将其保存至numpy和pandas中,通过matplotlib进行可视化数据分析. 一.环境搭建 使用anaconda搭建科学计算环境,并安装相关软件包. ...

  9. 【Python学习】使用pandas和matplotlib分析1949-2016年中国各省市历年GDP数据

    [Python学习]使用pandas和matplotlib分析1949-2016年中国各省市历年GDP数据 导入包 读取数据 设置颜色列表 绘图分析 导入包 由于我是在jupyter notebook ...

最新文章

  1. 使用VS自带的混淆器防止你的程序被反编译
  2. NLP语言模型任务数据准备及实战
  3. JAVA实现查看详情功能_【JavaWeb】111:详情页面的实现
  4. @ConfigurationProperties 注解
  5. Android SQLite开发调试工具 Android Debug Database
  6. 对称振子天线matlab程序,对称振子天线详解.ppt
  7. MapReduce 源码分析(一)准备阶段
  8. 去掉a标签下划线_条码软件如何修改条码标签的字体格式
  9. php 控制304,php静态文件返回304技巧分享
  10. gkz cloud sql_使用Cloud SQL的Google App Engine全文搜索
  11. zen3架构_AMD YES! Zen3架构亮相,消费者CPU市场的竞争热闹了
  12. 小作业-drawline换成drawrectangle和fillRectangle
  13. 解决工商银行网银插件报‘非正常运行的网银工具’问题
  14. PHP面试要点---mysql
  15. python中else是指什么意思_python中elif什么意思?
  16. Opencv 实现 运动模糊的添加(motion blur)与消除(demotion blur)
  17. 2006年十二生肖开运大预言
  18. 写给自己的python基础
  19. JSP+Servlet+Mysqll银行柜员业务绩效考核系统的设计与实现(附论文)
  20. python repair修复功能_NI 技术支持|我的插件显示需要修复(REPAIR)了该怎么办?...

热门文章

  1. 被数万人使用的产品设计模板怎么做成的?
  2. Verilog门级实现二选一多路选择器
  3. Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记
  4. 中控OPC系统服务器,OPC Server For SUPCON(浙大中控)
  5. Linux:CentOS7安装SQLServer
  6. python通过pil为png图片填充上背景颜色的代码
  7. Proteus8.9 VSM Studio SDCC编译器仿真STC15W4K32S4系列013_iic_09_AT24C512
  8. 仿王者荣耀对战资料选项中的【雷达网图展示详细数据】
  9. vite中使用scss
  10. 2022.12四级真题第2套的听力原文(中英文都有)