「手把手教你」Python实现量价形态选股

liftword4周前 (02-11)技术文章9

01 引言

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

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

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

02 Python选股代码

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.03r:
????????????flag=False
????????????break?'''
????????#价格突破且放量上涨
????????if?flag==True?and?\
???????????p12.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
运行函数: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量化交易:策略创建运行流程

学习目标目标知道策略的创建和运行知道策略的相关设置知道RQ的策略运行流程应用无1、体验创建策略、运行策略流程1.1 创建策略1.2 策略界面2、 策略界面功能、运行介绍2.1 一个完整的策略需要做的事...

5分钟教会你:如何用python写一个量化交易程序

在量化交易领域,Python凭借其丰富的库和简洁的语法成为众多开发者的首选语言。下面这篇文章将为你详细介绍如何用Python编写一个简单的交易量化程序,适合有一定编程基础且对量化交易感兴趣的读者。用P...

手把手教你用Python搭建自己的量化回测框架「均值回归策略」

引言大部分量化策略都可以归类为均值回归与动量策略。事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利。否则,价格是随机游走的,交易将无利可图。均值回归是金融学的一个重要概念,指股票价格无论高于...

Python量化投资神器:TA-Lib从入门到精通,轻松玩转技术分析!

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。引言:TA-Lib——量化投资的“瑞士军刀”在金融市场的波涛汹涌中,技术分析是投资者不可或缺的工具。而TA-Lib,作为技术分析领...

一个基于Python的简单量化交易策略核心代码示例

以下是一个基于Python的简单量化交易策略核心代码示例,包含数据获取、策略逻辑、回测框架和可视化模块。代码以双均线策略(金叉/死叉)为例,使用`pandas`和`backtrader`框架实现:``...

Python量化投资初探:自动化选股策略

最近股市可谓是冰火两重天,赛道股一路高歌,激流勇进,传统大白马却跌跌不休,淹没了不少韭菜。热门赛道不断切换,小匠也是看得眼花缭乱,大A四千多家上市公司,很多之前听都没听过的股票,乘着赛道这股东风连续几...