来源:雪球App,作者: Python金融量化,(https://xueqiu.com/1444657641/139331726)

01引言

在股票市场上,一切交易行为的成功皆为概率事件,交易获利的核心在于选择了上涨概率较高的股票。因此,利用高概率的上升形态来选股,是技术分析的重要方法之一。威廉·欧奈尔在《笑傲股市》中通过研究100多只超级牛股,总结出看涨形态中出现最为普遍的一种形态——杯柄形态。欧奈尔杯柄选股模型的买点,说白了是股价放量上升即将创出新高的时点。也就是说,最佳买点是在股价经过回调整理,股价即将创出新高且成交量放大50%以上。

欧奈尔“逢高买入”的逻辑主要基于三点,一是“逢高买入”可以规避股票长时间在底部盘整时的等待;二是在牛市初期和调整期,越早结束底部盘整创出新高的股票,未来的涨幅通常越大;三是在牛市初期和调整期,先买入更早结束盘整创出新高的股票,待其上涨获利部分卖出再建仓后启动的股票,可以提高资金使用效率。

本文基于欧奈尔“杯柄形态”和“逢高买入”的技术分析思想,使用Python基于个股价量形态进行简单的量化选股,以期对股票价格形态量化选股起到抛砖引玉的作用。实际上欧奈尔的选股精髓在于技术面和基本面的有机结合,并提出了CANSLIM七步选股法,感兴趣的可参见其原书《笑傲股市》。废话少说,下面直接给出Python价量选股代码。注意,文中提及股票仅作为分析案例,不构成任何投资建议!

02Python选股代码

Python实现的步骤主要包括数据获取及清洗、价量突破规则设定、股票筛选和可视化分析。数据获取基于tushare开源框架,使用Python自带的Sqlit3轻量级数据库进行数据管理,参见推文《【手把手教你】Python面向对象编程入门及股票数据管理应用实例》。下面要引入的base、update_sql、plot_stock均是为方便数据管理写的个人脚本文件,在运行时可以注释掉使用自己的数据来替换和画图。加入知识星球获取可获取所有完整代码。

(数据管理的py文件和选股分析的ipynb文件)

#更新数据库信息

from update_sql import update_sql,info_sql

#画K线图

from plot_stock import stock_plot

更新数据库信息

update_sql()

输出结果:数据已经是最新的!

获取数据库信息info_sql()

输出结果:

数据库包含股票个数:3760

统计查询的总数:7873981

数据期间:20050104——20200113

文件大小为918M。

import pandas as pd

#base是个人写的脚本文件

from base import sql_engine,ts_pro

from datetime import datetime,timedelta

pro=ts_pro()

engine = sql_engine()

从数据库中获取复权价格和成交量

def get_price_vol_data():

now=datetime.now()

date=(now-timedelta(360)).strftime('%Y%m%d')

sql=f'select * from daily_data where trade_date>{date}'

all_data=pd.read_sql(sql,engine)

all_data=all_data.sort_values(['ts_code','trade_date'])

codes=list(all_data.ts_code.unique())

#前复权

all_data['adjclose']=all_data.groupby('ts_code').apply(lambda x:x.close*x.adj_factor/x.adj_factor.iloc[-1]).values

all_data['adjvol']=all_data.groupby('ts_code').apply(lambda x:x.vol*x.adj_factor/x.adj_factor.iloc[-1]).values

all_data['adjopen']=all_data.groupby('ts_code').apply(lambda x:x.open*x.adj_factor/x.adj_factor.iloc[-1]).values

all_data['adjhigh']=all_data.groupby('ts_code').apply(lambda x:x.high*x.adj_factor/x.adj_factor.iloc[-1]).values

all_data['adjlow']=all_data.groupby('ts_code').apply(lambda x:x.low*x.adj_factor/x.adj_factor.iloc[-1]).values

#设置索引

all_data=all_data.set_index(['trade_date','ts_code'])[['adjclose','adjvol','adjopen','adjhigh','adjlow']]

#转成面板数据

all_data=all_data.unstack()

return codes,all_data

筛选价格和成交量突破N日阈值的个股

def find_price_vol_stock(n,r=1.2):

codes,all_data=get_price_vol_data()

up_list=[]

for code in codes:

close=all_data['adjclose'][code]

open_=all_data['adjopen'][code]

high=all_data['adjhigh'][code]

low=all_data['adjlow'][code]

vol=all_data['adjvol'][code]

#剔除一字涨停

flag=True

if close.iloc[-1]==open_.iloc[-1]==high.iloc[-1]==low.iloc[-1]:

flag=False

break

#最近五日没有长上影线,以单日回撤3%为长上影线

for i in range(5):

if close[-5:][i]*1.03

flag=False

break

#价格突破前N日新高

p=close.iloc[-1] #当前价格

p0=close[-n:-1].min()

p1=close[-n:-1].max() #前n-1日最高价

#价格短期已上涨超过50%,涨幅过大不宜介入

'''

if (p-p0)/p0>r:

flag=False

break '''

#价格突破且放量上涨

if flag==True and \

p1

vol[-5:].mean()/vol[-10:-5].mean()>2.0:

up_list.append(code)

return up_list

运行选股函数:

stocks_60=find_price_vol_stock(60)

print('突破60日量价的个股为:\n')

print(stocks_60)

print(f'突破60日量价个股个数为:{len(stocks_60)}')

突破60日量价的个股为:

['000417.SZ', '000885.SZ']

突破60日量价个股个数为:2

对选出的个股K线可视化

stock_plot(stocks_20[0]).kline_plot(ktype=0)

stock_plot(stocks_20[1]).kline_plot(ktype=0)

下面不考虑成交量,主要基于价格形态,寻找W底或圆底形态的个股。

#RPS是用于计算欧奈尔RPS相对强弱指标的脚本文件

from RPS import get_data

data=get_data()

#data.tail()

剔除了次新股和ST股后对剩下的2871只股票进行筛选。

def find_stock(data,n=20):

stock_list=[]

for c in data.columns:

d0=data[c][-n]

d1=data[c][-(n-2):-1].max()

d2=data[c][-1]

#考虑股价在3-20元个股情况

if 3

stock_list.append(c)

#print(len(stock_list))

return stock_list

运行函数:

ss_20=find_stock(data)

print(ss_20)

#输出结果:

['恒华科技', '东方电缆', '立霸股份', '鼎信通讯', '普洛药业']

基于60天价格形态。

ss_60=find_stock(data,n=60)

print(ss_60)#输出结果:

['中航重机', '鲁阳节能', '金牛化工', '农尚环境', '北汽蓝谷']

价格形态的可视化,其中stock_plot是使用pyecharts0.5.11版本写的画图脚本文件,ktype=0为普通K线,=1为修正K线图。

stock_plot(ss_20[0]).kline_plot(ktype=0)

stock_plot(ss_20[1]).kline_plot(ktype=0)

stock_plot(ss_60[0]).kline_plot(ktype=0)

stock_plot(ss_60[1]).kline_plot(ktype=0)

stock_plot(ss_60[2]).kline_plot(ktype=0)

03结语随着股票数量的增多,借助技术手段进行量化选股已越来越普遍,不少平台也用上了AI的手段。市场讯息万变,往往体现在量价关系的变化中。因此采用技术分析的量价时空分析,可以提高选股的成功概率。但所有技术分析都基于对历史的归纳,而历史并不总是全然相似,所处的市场环境和公司情况也不尽相同,未来的发展走势也可能不一样。技术分析本身是存在一定局限性的,凭借高概率的价格形态选股能够判定一只股票未来上涨,但也未必如你所愿的方式上涨,可能中间的震荡又将你洗出局。本文以Python为工具,对A股3700多只股票进行价量分析,利用价量突破进行选股,为股票技术分析的量化提供了一种简单的视角,具有一定的实战意义。具体应用中还可结合市场横截面的强弱指标——欧奈尔的RPS和基本面业绩指标进一步优化。以上分析仅供参考,不构成任何投资建议!

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

手把手教你python实现量价形态选股知乎_【手把手教你】Python实现量价形态选股...相关推荐

  1. 手把手教你python实现量价形态选股知乎_如何通过量价形态选股

    原标题:如何通过量价形态选股 许多股民投资者对于成交量变化的规律不清楚,K线分析只有与成交量的分析相结合,才能真正地读懂市场的语言,洞悉股价变化的奥妙.成交量是价格变化的原动力,其在实战技术分析中的地 ...

  2. 手把手教你python实现量价形态选股知乎_怎样通过量价形态选股?量价选股技巧...

    许多股民投资者对于成交量变化的规律不清楚,K线分析只有与成交量的分析相结合,才能真正地读懂市场的语言,洞悉股价变化的奥妙.成交量是价格变化的原动力,其在实战技术分析中的地位不言自明.今天小编就和大家介 ...

  3. python编程快速上手-----让繁琐工作自动化_每周一书《Python编程快速上手 让繁琐工作自动化》分享!...

    内容简介 如今,人们面临的大多数任务都可以通过编写计算机软件来完成.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过Python编程,我们能够解决现实生活中的很多任务. 本书是 ...

  4. python零基础能学吗 知乎-如何零基础入门 Python?

    从17年6月入门Python到今天有大半年了,总结一下这半年来自学Python的路径. 本人只在两年前接触过HTML和CSS,但严格来说这两门只能算是标记语言而非编程语言,而且开始学Python的时候 ...

  5. python 用if判断一个数是不是整数_五天学会Python基础02(下)

    函数和模块的使用 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案.想到这一点问题的答案就呼之 ...

  6. 为什么python打开pygame秒关闭后在运行_当我运行Python程序时,pygame窗口打开片刻,然后退出 - python...

    我是一个刚开始尝试通过在线课程使用python和pygame制作游戏的程序员.但是,当我运行以下代码时,pygame窗口将打开一秒钟,然后关闭. import pygame pygame.init() ...

  7. python json传参数可以传对象吗_廖雪峰的python系列教程(52)——IO编程之序列化...

    序列化 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把name改成'Bil ...

  8. python是什么和c++是什么区别_编程c++和python的区别

    展开全部 论坛 活动 招聘 专题 打开2113CSDN APP Copyright © 1999-2020, CSDN.NET, All Rights Reserved 登录 一颗日成 关注 浅谈52 ...

  9. python底层是用什么语言实现的_我为何说Python是全栈式开发语言?

    Python 的排名从去年开始就借助人工智能持续上升,如今它已经成为了第一名.但排在前四名的语言 Python.C.Java 和 C++都拥有广大的用户群体,而且他们的用户总量也十分相近.实际上,Di ...

最新文章

  1. 关于目标检测你必须知道的……
  2. Snap和Flatpak 通吃所有发行版的打包方式。
  3. 安装python的twisted_如何在Python3.5上安装 Twisted(为了Scrapy)
  4. activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
  5. 进入Python世界——Python基础知识
  6. Lesson 001 —— 数据
  7. 三顺,因为你,我笑了。
  8. 1.高性能MySQL --- MySQL 架构
  9. 基于2.9.6vue-cli初始化webpack工程
  10. Linux下创建与解压zip, tar, tar.gz和tar.bz2文件--转 .
  11. win10 android4.4 驱动,ST-LINK/V2驱动win10版
  12. W25Q64简介(译)
  13. biopython教程与手册_使用biopython处理序列数据
  14. 公众号开发:实现一键复制功能
  15. 电子与电工技术实验——集成运算放大器的应用
  16. 微信小程序【网易云音乐实战】(第三篇 自定义组件、排行榜的制作、内网穿透、tabBar、个人中心)
  17. Winform中datagridview显示数据时,不显示特殊符号,如下划线不显示问题
  18. iphone转通用,xib里面的view怎么改成ipad大小?
  19. 下载eclipse linux32位软件安装包怎么那么难
  20. 4和2大于号小于号箭头那边_认识﹥﹤=(大于号、小于号和等号), 会用符号表示两个数的大小 导学案(青岛版一年级上册)...

热门文章

  1. Python数据采集和分析告诉你为何上海的二手房你都买不起!
  2. 线上线下联动 亚琦集团打好商贸物流体系创新“组合拳”
  3. 教你一起来做一下SpringBoot蓝天幼儿园管理系统
  4. 有关联想拯救者Y7000重装window10系统
  5. Neodynamic Barcode Professional for Windows Forms 14.0
  6. 用C语言实现电脑小游戏——扫雷
  7. php preg_match 漏洞,PHP preg_match()函数信息泄露漏洞
  8. R语言机器学习mlr3:模型解释
  9. 【数据科学】斯皮尔曼的等级相关系数(Spearman's coefficient)
  10. 吾爱破解python就业班_“吾”字是什么意思?