前提
所有的量化策略都绕不开选股策略,对于一般的个人投资者,以日线,周线作为数据基础--主要是因为高频的数据贵,而且日常没有那么多时间盯盘操作。
不过日线,周线的好处的是处理数据的时间比较宽裕,做回测和选股都不用那么紧迫,我一般将选股和择时买入做分段处理。理由也是配置跟不上,运算速度太慢。把基本的大框架的先选出来,在根据当天的数据变动快速的计算择时信号。
主要解决
主要通过量价进行选股
选股脚本:通过对比日与当日股价涨跌幅和成交量进行选股。可以选择的参数是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)
根据自己的需要,把参数传一下,就可以啦。
最后收尾工作很重要,后面你会发现,随时存一下数据,以及估算运算时间十分重要。
想要了解更多,可以关注我订阅号:buerbiji,大家一起学习。