问财量化选股策略逻辑
选股逻辑:振幅大于1,近25个交易日有单日涨幅大于等于百分之10,9点25分涨幅小于6%。
选股逻辑分析
该选股逻辑在考虑了波动性和盈利性的同时,还加入了对时段和风险的管控,能找到相对低风险、具有增长性和超额收益能力的个股,关注了短期波动性和长期增长性两个方面。相较于仅关注技术指标或基本面的选股策略,该策略的分析维度更广,能够有效规避市场风险。
有何风险?
以下是该选股逻辑可能存在的风险:
- 过于依赖单一交易时段进行选择,可能受到时段异质性的影响而出现错误的选股结果;
- 忽略了一些重要的基本面指标;
- 过于关注涨幅,忽略了结合相对估值因素的市场定价信息;
- 过于严格的选择标准,可能漏掉一些潜在有价值的股票。
如何优化?
为了缓解上述风险,可以考虑以下优化措施:
- 丰富选择维度,加入公司财务报表等基本面指标,如净利润增长率、财务稳定等;
- 结合技术形态指标,如均线、MACD等,综合考虑判断;
- 考虑行业因素,如行业标准PE、PEG等指标,以及和大盘的相关性;
- 降低选择标准,设置合理的阈值,增加一定的鲁棒性,可适当放宽振幅、涨幅等门槛。
最终的选股逻辑
基于上述考虑,我们综合出以下选股逻辑:
- 振幅大于1;
- 近25个交易日单日涨幅大于等于百分之10;
- 9点25分涨幅小于6%;
- 净利润增长率高于同行业平均水平;
- 财务稳定性高,债务率低于行业平均水平;
- 行业前景广阔,市场竞争优势明显。
同花顺指标公式代码参考
C1 = IF(HIGH-LOW>ATR(CLOSE,20),1,0);
C2 = IF(ABS((CLOSE-REF(CLOSE,1))/REF(CLOSE,1))>=0.1,1,0);
C3 = IF((OPEN-REF(CLOSE,1))/REF(CLOSE,1)<0.06,1,0);
C4 = IF((PRONETINC/TOT_ASSETS)>((SELECT INDUSTRY_PRONETINC FROM (SELECT * FROM TRADINGDATE WHERE IFTRADINGDAY=1 ORDER BY IFTRADINGDAY DESC LIMIT 25) T1 LEFT JOIN ASHAREBALANCESHEET T2 ON T1.TRADEDATE=T2.TRADEDATE AND S_INFO_WINDCODE=t1.S_INFO_WINDCODE ORDER BY IFTRADINGDAY DESC LIMIT 1)),1,0);
C5 = IF((DEBTTOASSET/TOT_LIAB)>((SELECT INDUSTRY_DEBTTOASSET FROM (SELECT * FROM TRADINGDATE WHERE IFTRADINGDAY=1 ORDER BY IFTRADINGDAY DESC LIMIT 25) T1 LEFT JOIN ASHAREBALANCESHEET T2 ON T1.TRADEDATE=T2.TRADEDATE AND S_INFO_WINDCODE=t1.S_INFO_WINDCODE ORDER BY IFTRADINGDAY DESC LIMIT 1)),1,0);
C6 = IF((S_INFO_EXCHANGE_BENCHMARK='000300.SH') AND ((SELECT INDUSTRY_PB FROM (SELECT * FROM TRADINGDATE WHERE IFTRADINGDAY=1 ORDER BY IFTRADINGDAY DESC LIMIT 25) T1 LEFT JOIN ASHAREBALANCESHEET T2 ON T1.TRADEDATE=T2.TRADEDATE AND S_INFO_WINDCODE=t1.S_INFO_WINDCODE ORDER BY IFTRADINGDAY DESC LIMIT 1))<((SELECT AVG(INDUSTRY_PB) FROM (SELECT * FROM TRADINGDATE WHERE IFTRADINGDAY=1 ORDER BY IFTRADINGDAY DESC LIMIT 25) T1 LEFT JOIN ASHAREBALANCESHEET T2 ON T1.TRADEDATE=T2.TRADEDATE AND S_INFO_WINDCODE=t1.S_INFO_WINDCODE)),1,0);
C7 = IF((PRONETINC/TOT_ASSETS)<((SELECT INDUSTRY_PRONETINC FROM (SELECT * FROM TRADINGDATE WHERE IFTRADINGDAY=1 ORDER BY IFTRADINGDAY DESC LIMIT 25) T1 LEFT JOIN ASHAREBALCF T2 ON T1.TRADEDATE=T2.TRADEDATE AND S_INFO_WINDCODE=t1.S_INFO_WINDCODE ORDER BY IFTRADINGDAY DESC LIMIT 1)),1,0);
SELECTOR = C1*C2*C3*C4*C5*C6*C7;
RESULT = SORT_RANK(SELECTOR,DESCEND(HEAT));
python代码参考
import pandas as pd
import numpy as np
import talib as ta
df = pd.read_csv('your_data.csv', index_col='date')
def net_profit_growth(df, n):
industry_g = df['industry_pronetinc'].iloc[-1]
g = (df['pronetinc'][-1]/df['tot_assets'][-1]) / industry_g
return g > 1
def financial_stability(df, n):
industry_db = df['industry_debttoasset'].iloc[-1]
db = df['debttoasset'][-1]/df['tot_liab'][-1]
return db < industry_db
def market_competitive(df, n):
industry_pb_avg = df['industry_pb'].mean()
pb = df['pb'][-1]
return (df['s_info_exchange_benchmark'][0] == '000300.SH') and (pb < industry_pb_avg)
def future_prospects(df, n):
industry_g = df['industry_pronetinc'].iloc[-1]
g = (df['pronetinc'][-1]/df['tot_assets'][-1]) / industry_g
return g < 1
C1 = np.where(df['high'] - df['low'] > ta.atr(df['close'], 20), 1, 0)
C2 = np.where(abs((df['close'] - df['close'].shift(1)) / df['close'].shift(1)) >= 0.1, 1, 0)
C3 = np.where((df['open'] - df['close'].shift(1)) / df['close'].shift(1) < 0.06, 1, 0)
C4 = np.where(net_profit_growth(df, 25), 1, 0)
C5 = np.where(financial_stability(df, 25), 1, 0)
C6 = np.where(market_competitive(df, 25), 1, 0)
C7 = np.where(future_prospects(df, 25), 1, 0)
selector = C1 * C2 * C3 * C4 * C5 * C6 * C7
result = df.sort_values(by='heat', ascending=False).index[np.argsort(np.argsort(selector))]
## 如何进行量化策略实盘?
请把您优化好的选股语句放入文章最下面模板的选股语句中即可。
select_sentence = '市值小于100亿' #选股语句。
模板如何使用?
点击图标右上方的复制按钮,复制到自己的账户即可使用模板进行回测。
## 如果有任何问题请添加 下方的二维码进群提问。
