我认为这是Python又一次炫技,但是我没有证据

共 2615字,需浏览 6分钟

 ·

2019-07-25 06:36

tWKLdgHmEx.jpg






以前说30岁前不碰股票,但随着对于一些投资理财类书籍的学习和了解,不再满足于定投基金这样的操作,于是拿出了一部分钱,做起了在股市里搏杀的实验,每每想起开户那一刻,都有一种电视剧《大时代》里方展博在交易所拥抱阿梅的遐想,当日恒生指数反弹上涨 4000多点。(当然,这只是剧情需要)






CUaDuy8HOe.jpg






那该买什么样的股票呢?必有其策略,如果人可以通过策略实现选股,那便可以用 Python 遍历实现又快又好地选出目标标的,有策略的落地更有效率。






一、策略拆解






但凡策略,背后就有其理论。无论是价值投资,还是市盈率法,亦或者基本面分析,都需要拆解成可操作的指标。今天要分享的策略实现,我们姑且称之为“庄股理论”,意指找出庄家“挟持”的股票标的,跟着庄家吃点汤,获点小利。(友情提示:投资有危险,入市需谨慎。本例,仅作为 python 选股示例,目标标的不构成投资建议






庄股理论(你可以不认可此理论,此处仅作为策略拆解示例)认为,一个被庄家挟持的股票,必然存在以下阶段:






阶段一:吸筹阶段



定义其在 8个交易日内,有且仅有 2-4个涨停板






阶段二:洗盘阶段



定义其40个交易日内,整体跌幅在-20%~-35%之间






阶段三:拉升阶段



定义其在 2 个交易日内,日均成交额是吸盘阶段日均成交额的 3 倍,且呈上升趋势






拆解完策略(当然我这里写的过于简单,实际拆解策略的环节其实是比较复杂的,需要反复研究理论并打磨,甚至还需要找相关专业人士沟通,有点开发沟通需求的意思)






二、用Python如何具体实现?






一些网站或接口已经整理好了此类我们需要的信息,我们不需要重复造轮子,只需要去调用相应的接口即可,此处使用tushare包,在社区(https://tushare.pro/)简单注册即可(部分接口数据可能需要一点积分,不算要求太高,比较容易获得)






QcOD96u5Uw.jpg






1.参照数据接口的提示,调用 tushare中我们需要的数据






gY4hscsrT7.png






2.实现策略拆解中的详细定义,简单讲就是利用 pandas 按目标条件筛选






OYmXcxgwpJ.jpg






3.剔除掉一些新上市(一年内)、退市或者暂停






9zQ8UDL2Ss.png






4.打印选出来的股票代码






hZkur5hY74.png






说明:由于该策略过于保守,可能很多时候并不会有合适标的入选









5.对选出的股票进行跟踪,验证策略的有效性及后续进行跌代






比如说,一开始,我没有对次新股做剔除,也没有对入选前的一段时间做涨跌停限制,选出了一只次新股,新诺威(SZ:300765)。






Je0FcKMM3x.png






虽然再代码选出当日涨了 4%,但随后一段时间的表现并没有如我所料想的那样,庄家带资拉起来。(次新股大概率不太可能)






rvFwcEO8Em.jpg






当然,我也并没有对选出的股票做出买入操作,也就没有什么损失。这里提一下的目的,仅仅是想说,策略是需要持续拿结果数据验证和不断迭代的。比如说去修改我们做出的操作性指标定义,去把交易日范围缩小,把涨跌幅限制扩大一点等等。不过这些改动,最终要合乎理论。甚至说,我们去放开一点,用 python 限定结果,在结合人工干预的方式来选择合适的股票,这些都是可以操作的。






三、后记






Python 选股本身并没有不玄乎或者对技术本身有多高的要求,反而是很简单的 python 水平对现实的一点改造,提高选取股票的效率。或许你对我所举例的策略并不认可(哈哈,其实我也不是很认可,主要是帮朋友实现这一个策略而已),不妨思考以下,将自己认可的投资理财理论,结合数据,去做一些技术上的实现。






在股票界,曾经看到过一句话:“技术分析事后看永远是对的。”那股票技术分析到底可靠么?其实这个问题很多人争得你死我活,各有说辞,也不能简单地去判断对错。在我认为技术分析的本质是搏概率,提效率。通俗的讲,技术分析的方法就是根据策略,提高选股效率,拉升胜率。






其实,策略和技术,不是简单的结合,而是有机的、深度的结合。从效率角度,我对于“科技是第一生产力”是毫不怀疑的。但就算是99%的胜率,只要不是100%,就有可能失败。






在运用技术分析的时候,用什么策略不是关键,关键是你认定了一个指标之后,愿不愿去深度研究,降低风险。最终,能否赚钱取决于自己是否低风险介入。






再次提醒:投资有风险,入市需谨慎!






叶老师个人Vx:monkeyye9201,对商业分析感兴趣盆友,可加老师Vx交流。



cDZknE8pRH.png



完整代码参考如下:






# 导入相关包
import tushare as ts
import pandas as pd
import numpy as np
import time
import datetime
# tushare_pro token设置
ts.set_token(your token)
pro = ts.pro_api()
# 股票列表,方便获取所有股票代码
df = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,fullname,\
enname,market,exchange,curr_type,list_status,list_date,delist_date,is_hs')

last_date=(datetime.datetime.now()+datetime.timedelta(days=-365)).strftime('%Y%m%d')

# 仅筛选上市公司,退市或暂停上市的不管
df_filter=df[df['list_status']=='L']

# 对近一年内上市的股票进行剔除,即剔除次新股
df_filter=df_filter[df_filter['list_date']
df_code=df_filter['ts_code']
stock_code=np.array(df_code).tolist()
# print(len(stock_code))
# 遍历股票代码,实现对吸筹概念定义的筛选
stock_xc=[]
stock_xp=[]
stock_ls=[]
start_date=(datetime.datetime.now()+datetime.timedelta(days=-200)).strftime('%Y%m%d')
end_date=(datetime.datetime.now()+datetime.timedelta(days=0)).strftime('%Y%m%d')

# 获取股票日线行情
for i in stock_code:
# print(i)
try:
df=pro.query('daily',ts_code=i,start_date=start_date,end_date=end_date)
df=df.rename(columns={'ts_code':'股票代码','trade_date':'交易日期','open':'开盘价','amount':'成交额 (千元)','high':'最高价','low':'最低价','close':'收盘价','pre_close':'昨收价','change':'涨跌额','pct_chg':'涨跌幅 (未复权)','vol':'成交量 (手)'})
# 吸筹前 30 个交易日,没有涨停

df_pre=df[50:80]

# 完整策略周期是50个交易日,分为4个阶段
# 阶段①:吸筹阶段 ,8个交易日内
df_xc=df[42:50]

# 阶段②:洗盘阶段,40个交易日内
df_xp=df[2:42]

# 阶段③:拉升阶段,2个交易日内
        df_ls=df[0:2]

# 计算前 30 个交易日,是否有涨停
df_pre=df_pre[df_pre['涨跌幅 (未复权)']>=10]
pre_cnt=df_pre['交易日期'].count

# 计算涨停板的个数
df_xc=df_xc[df_xc['涨跌幅 (未复权)']>=10]
        zt_cnt=df_xc['交易日期'].count()

if pre_cnt<1:

if zt_cnt>=2 | zt_cnt<=4:
# 符合条件,加入候选名单
stock_xc.append(i)
# 再行判断是否满足条件2
end_close=df_xp[0:1]['收盘价'].values[0] # 结束日收盘价
start_open=df_xp[-1:]['开盘价'].values[0] #初始日开盘价
rate=(end_close-start_open)/start_open
if rate>=-0.35 and rate<=-0.20:
stock_xp.append(i)
amount_pull_mean=df_ls['成交额 (千元)'].mean()
amount_xc_mean=df_xc['成交额 (千元)'].mean()

df_xc['方向']=df_xc['涨跌额'].apply(lambda x: -1 if x<0 else 1 )
up_avg=df_xc['方向'].count

if amount_pull_mean>=3*amount_xc_mean and up_avg==1:
stock_ls.append(i)
# print("真棒!百里挑一选出了一支股票:"+ i)
else:
pass
else:
pass
else:
pass
time.sleep(0.1) #积分有限,调用次数有限,其实可以每次请求当日数据执行到数据,减少请求
else:
pass
except:
pass
if len(stock_ls)==0:
print("很遗憾,今天没有合适的标的,不如明天再来试试看!")
else:
for code in stock_ls:
print("恭喜你,百里挑一撸了一只:"+code)

print("everything is ok")



浏览 71
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报