前提

所有的量化策略都绕不开选股策略,对于一般的个人投资者,以日线,周线作为数据基础--主要是因为高频的数据贵,而且日常没有那么多时间盯盘操作。
不过日线,周线的好处的是处理数据的时间比较宽裕,做回测和选股都不用那么紧迫,我一般将选股和择时买入做分段处理。理由也是配置跟不上,运算速度太慢。把基本的大框架的先选出来,在根据当天的数据变动快速的计算择时信号。

主要解决

主要通过量价进行选股
选股脚本:通过对比日与当日股价涨跌幅和成交量进行选股。可以选择的参数是T-N天的N天可以自己定义;对比日选择股价可以是涨超多少或者跌超多少;
对照日成交量和当日成交量的百分之多少相比较,可以选择百分比;当日股价下跌不超过多少可以设定。

导入模块

使用的是akshare的数据,
另外用一个chinese_calendar的模块,在看别的大佬的代码时很少看到。可以完美契合我们的节假日和周末,避免很多无效运算。缺点是每年要更新一次,因为新的节假日都不会提前很多确定。
numpy和pandas是我们需要熟练掌握的,但内容却是比较多,至今都没有熟练掌握,还是要什么查什么。
由于没有用到什么指标,只是简单的量价的对比测算,所以没有用其他指标的库,或者回测框架。
import akshare as ak
from numpy import empty
import pandas as pd
import datetime as dt
from chinese_calendar import is_workday,is_holiday
import time

从akshare上取个股

start = time.perf_counter()
#操作日
action_date = dt.date.today()
#A股当日所有股票
stock_zh_a_spot_em_df = ak.stock_zh_a_spot_em()
#A股所有股票代码
stock_code_spot_df = stock_zh_a_spot_em_df['代码']

日常数据备份

#导出当天的A股所有明细,以当天的日期命名EXCEL文件
def export_A_stocks(date):   	
	stock_zh_a_spot_em_df.to_excel(str(date)+'.xls',sheet_name='A-stocks')
export_A_stocks(action_date)

确定对比日

#对比日日期,tradeback_days即为当天往前第几个交易日。
def contrast_date(tradeback_days):
    n = 1
    for i in range(tradeback_days):
        contrast_date = action_date + dt.timedelta(days = -i-n)
        date_flag = True
        while date_flag:
            if is_workday(contrast_date) and contrast_date.weekday() != 5 and contrast_date.weekday() != 6:
                contrast_date = contrast_date
                date_flag = False
            else:
                contrast_date = contrast_date + dt.timedelta(days =-1)
                n += 1
    return contrast_date

对比日股票价格数据

#对比日股票中股价上涨或者下跌的股票代码dataframe文件。参数:1,回测的第几天;2、是大于某个比例或者小于某个比例;3、涨跌幅比例。
def contrast_price_stocks(tradeback_days,direction_up=True,price_rate=None):
    contrast_price_stocks = pd.DataFrame()
    contrast_price_stock_codelist = []
    for stock_code in stock_code_spot_df.iteritems():
        try:
            stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol=str(stock_code[1]), period="daily", start_date=str(contrast_date(tradeback_days)), end_date=str(contrast_date(tradeback_days)+dt.timedelta(days = 2)), adjust="qfq")
            if stock_zh_a_hist_df.empty == False:
                if direction_up:
                    if stock_zh_a_hist_df.iat[0,8]>price_rate:
                        contrast_price_stocks = contrast_price_stocks.append(stock_zh_a_hist_df,ignore_index=True)
                        contrast_price_stock_codelist.append(str(stock_code[1]))
                else:
                    if stock_zh_a_hist_df.iat[0,8]<price_rate:
                        contrast_price_stocks = contrast_price_stocks.append(stock_zh_a_hist_df,ignore_index=True)
                        contrast_price_stock_codelist.append(str(stock_code[1]))
        except ValueError:
            continue
    contrast_price_stocks.insert(0,'代码',contrast_price_stock_codelist)
    return contrast_price_stocks

选股

#对比日股票成交量与当日成交量对比。
#选对比日成交量与当日成交量进行比较,参数是当日成交量的百分比,如果满足条件就挑出来。
def choosen_stocks(tradeback_days,direction_up,price_rate,turnover_rate,drop_rate):
    choosen_stocks = pd.DataFrame()
    contrast_stocks = contrast_price_stocks(tradeback_days,direction_up,price_rate)
    action_date_stocks = stock_zh_a_spot_em_df[stock_zh_a_spot_em_df['涨跌幅']<drop_rate]
    contrast_stocks_codes = contrast_stocks['代码']
    turnover_rate = turnover_rate
    for stock_code in contrast_stocks_codes.iteritems():
        #选取这一个代码所在行成交量,在对比日与当日成交量进行比较。
        try:
            contrast_turnover_stock = contrast_stocks[contrast_stocks['代码'].str.contains(stock_code[1])]
            action_date_turnover_stock = action_date_stocks[action_date_stocks['代码'].str.contains(stock_code[1])]
            if contrast_turnover_stock.iat[1,6] > turnover_rate * action_date_turnover_stock.iat[0,6] and contrast_turnover_stock.iat[2,6] > turnover_rate * action_date_turnover_stock.iat[0,6]:
                choosen_stocks = choosen_stocks.append(action_date_turnover_stock,ignore_index=True)
        except IndexError:
            continue
    return choosen_stocks

运行一下,收一下尾

choosen_stocks = choosen_stocks(3,True,9,1,-3)
print(choosen_stocks)
choosen_stocks.to_excel(str(action_date)+'选股.xls',sheet_name='选股')
end = time.perf_counter()
t = end - start
print('Runtime is: ',t)

根据自己的需要,把参数传一下,就可以啦。
最后收尾工作很重要,后面你会发现,随时存一下数据,以及估算运算时间十分重要。