量化交易学习笔记五 - 一个选股小测试

上一篇已经做了批量股票日k数据获取并保存的窗口,今天就来结合实际情况利用下这些数据做个小测试。

前几天有朋友问我类似000623吉林敖东4/19这根跳空长上影出现后,类似的k线后续会如何演绎,那就正好以这个条件来做个选股测试,返回一定时间范围内出现这样形态k线的股票代码及出现的日期。

 形态一定要量化成数据才可操作,翻译一下:

'''
1.次日跳空高开(次日开盘价>前日收盘价[幅度3%以上]);
2.次日收长上影,阳线(次日最高价/次日收盘价[幅度3.5%以上],次日收盘价>次日开盘价)
3.次日成交量放大(次日成交量>前日成交量[幅度3倍以上])
'''

有了明确目标,就开干:

1.数据,之前已经按代码为文件名将tushare获取的数据逐个保存在目录下。所以思路就是遍历该目录所有文件,pd读取文件,逐行遍历pd数据,符合条件的记录股票代码及日期

import os
import pandas as pd
import numpy as np

def analysisfiles(_path=""):
    if _path == "":
        print("目录未设定")
        return

    _result = np.empty((0, 3))  #为结果建立空数组
    _files = os.listdir(_path)
    print("共",len(_files),"文件待处理...")
    
    #遍历目录
    for file in _files:
        #数据预处理
        _pd = pd.read_csv(_path + "/" + file)
        #_pd['trade_date'] = pd.to_datetime(_pd['trade_date']) #转换为日期类型,此处会转换失败所以不操作了
        _pd = _pd.sort_values('trade_date',ascending=True) #按日期升序排列
        #数据分析
        '''
        1.次日跳空高开(次日开盘价>前日收盘价[幅度3%以上]);
        2.次日收长上影,阳线(次日最高价>次日收盘价[幅度3.5%以上],次日收盘价>次日开盘价)
        3.次日成交量放大(次日成交量>前日成交量[幅度3倍以上])
        '''
        for i in range(len(_pd)):
            #最后一条数据不处理
            if i == len(_pd)-1:
                break
            #这里用的效率最低下的下标循环
            if _pd.iloc[i+1]['open']>_pd.iloc[i]['close'] and _pd.iloc[i+1]['open']/_pd.iloc[i]['close']>=1.03 :
                #print("满足条件1")
                if _pd.iloc[i+1]['close']>=_pd.iloc[i+1]['open'] and _pd.iloc[i+1]['high']/_pd.iloc[i+1]['close']>=1.035 :
                    #print("满足条件2")
                    if _pd.iloc[i+1]['vol']/_pd.iloc[i]['vol']>=3:
                        #print("满足条件3")
                        #同时满足所有条件,记录进数组。同时记录了一下出现跳空k线后7日的收盘价涨幅
                        if i+8 < len(_pd):
                            new_row = np.array([_pd.iloc[i]['ts_code'],_pd.iloc[i]['trade_date'],round(_pd.iloc[i+8]['close']/_pd.iloc[i+1]['close']-1,2)*100])
                        else:
                            new_row = np.array([_pd.iloc[i]['ts_code'],_pd.iloc[i]['trade_date'],"nan"])
                        _result = np.vstack([_result, new_row])
                        break

        print("分析中..."+str(round(_pi/len(_files)*100,0))+"%")

    #返回结果
    print("end")
    print(_result)

得到结果:

[['000785.SZ' '20230113' '4.0']
 ['000863.SZ' '20230413' 'nan']
 ['002140.SZ' '20230406' 'nan']
 ['002479.SZ' '20230330' '1.0']
 ['002661.SZ' '20230112' '1.0']
 ['002755.SZ' '20230210' '-1.0']
 ['002807.SZ' '20230117' '-3.0']
 ['002817.SZ' '20230413' 'nan']
 ['002819.SZ' '20230201' '-1.0']
 ['600109.SH' '20230217' '-4.0']
 ['600193.SH' '20230331' '-5.0']
 ['600405.SH' '20230203' '4.0']
 ['600446.SH' '20230109' '0.0']
 ['600753.SH' '20230118' '11.0']
 ['603079.SH' '20230206' '-4.0']
 ['603158.SH' '20230301' '-12.0']
 ['603982.SH' '20230120' '5.0']]

经过验证,还是结果还是正确的。从结果走势也可以看到,基本涨跌对半开,所以光这一个异动并不能说明什么问题,还是需要结合更多指标来看

这里的知识点主要有以下几点:

1.文件遍历。这个比较简单

2.pandas的framedata对象遍历。我选了最直观,但是效率最低下的下标遍历方法。如果遍历1年的股票日k,需要10来分钟。后续还大有优化空间。

3.把传统的描述语言转化成清晰的数据

另外也提下碰到的一些问题,望大神解答:

主文件a中用tkinter定义了窗体win,及进度条控件。文件a中调用b文件定义的函数b(),如何在b()中反过来刷新win窗体中的进度条?

好了,下次我们尽量多尝试些指标,也测试下多指标融合的选股方法,要结合backtrader一起来看了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值