假定我們忽略掉個人主觀情緒而去選擇跟隨資金以及市場的選擇,那麼如果主力資金是看多的,形成的就是個股的K線會是一個紅柱(無論是否是假陽線或者陰線),因為在收盤價高於開盤價,基本上可以認為市場的買方力量是強於賣方的,對於綠柱亦然。
在此基礎上,如果在一段時間內的個股K線是紅綠多於綠柱,那麼可以認為市場資金是做多為主,這個時候選擇跟隨性介入,大機率是不會虧損,因為趨勢是向上的,慣性的力量一般不會形成尖頂,而多數會有震盪,那麼從機率角度來看,這種的價效比乃至賠率都較為划算。
如果在此基礎上做一些略微的篩選,成功率會增多:
選擇成交量較為溫和的,日均成交額大於5000W;
剔除掉部分上下影線較多的股;
紅柱/綠柱>1。3;
區間漲幅在(0,2);
程式碼如下:
#統計1-2個月內日K陰陽線的數量來判斷主力資金
importtushareasts
importpandasaspd
importpickle
fromdatetimeimportdatetime,date
fromdatetimeimporttimedelta
token =‘fc087ee503a6feac6cf5dde3e409dc44613d395bab12a4c4470707a4’
ts。set_token(token)
pro = ts。pro_api(token)
pd。set_option(‘display。width’,1000)#顯示所有列,從左至右,不隱藏
pd。set_option(‘display。max_columns’, None)#顯示所有列,可能會隱藏中間
pd。set_option(‘display。max_rows’, None)
#匯入股票池
stock_file =open(r‘C:\Py_stock\pool。pkl’,‘rb’)
pool = pickle。load(stock_file)
defstock_para(df,s):
code = df。iloc[s,1][:6]
trade_date = df。iloc[s,]
open = df。iloc[s,2]
high = df。iloc[s,3]
low = df。iloc[s,4]
close = df。iloc[s,5]
pre_close = df。iloc[s,6]
change =round(df。iloc[s,7],2)
ptc_chg =round(df。iloc[s,8],2)
vol = df。iloc[s,9]
amount =round(df。iloc[s,10],2)
turnover_rate =round(df。iloc[s,11],2)
volume_ratio =round(df。iloc[s,12],2)
open_chg =round(((open - pre_close)/pre_close*100),2)
high_chg =round(((high - pre_close)/pre_close*100),2)
low_chg =round(((low - pre_close)/pre_close*100),2)
# print(code,trade_date,open,high,low,close,pre_close,change,ptc_chg,vol,amount)
# print(open_chg,high_chg,low_chg)
returntrade_date,open,high,low,close,pre_close,ptc_chg,vol,amount,open_chg,high_chg,low_chg,turnover_rate,volume_ratio
defRS_day():
day1 = date。today()。strftime(“%Y%m%d”)
day2 = (date。today() - timedelta(days=60))。strftime(“%Y%m%d”)
# print(day1,day2)
returnday1,day2
defGR_gem(open,close,amount,vol,open_chg,high_chg,low_chg,ptc_chg,turnover_rate):
#無法選中部分交易日成交量或者成交額極低的時候會被自動排除
flag1 = -2
flag2 = -2
flag3 = -2
green_vol =0。0
red_vol =0。0
ifclose >4andvol >5000andamount >40000and(close - open) >=:
flag1 =1
ifvol > red_vol:
red_vol = vol
ifclose >4andvol >5000andamount >40000and(open - close) >:
flag2 =
ifvol > green_vol:
green_vol = vol
#針對上下影線較多做一個剔除
if((high_chg-ptc_chg)>3and(high_chg-open_chg)>3)or((ptc_chg-low_chg)>3and(open_chg-low_chg)>3):
flag3 = -1
returnflag1,flag2,flag3,green_vol,red_vol
defGR_count(pool,RS_day):
day1 = RS_day[]
day2 = RS_day[1]
print(day2,day1)
GR_df = pd。DataFrame(columns=[‘code’,‘Red_count’,‘Green_count’,‘Needle_count’,‘GR_ratio’,‘Needle_ratio’,‘is_GR’])
# pool = [‘002920。SZ’]
forts_codeinpool:
# try:
Red_count =
Green_count =
Needle_count =
GR_ratio =0。0
Needle_ratio =0。0
df = ts。pro_bar(ts_code=ts_code,adj=‘qfq’,start_date=day2,end_date=day1,factors=[‘tor’,‘vr’],ma=[5,10,20,30])
df1 = df。sort_values(by=‘trade_date’)
# print(df1)
pri_end = df1。iloc[-1,5]
pri_start = df1。iloc[,5]
pri_chg =round((pri_end-pri_start)/(pri_start+0。01),2)
# print(‘start:’,pri_start,pri_end)
code = ts_code[:6]
lenth =len(df1[‘ts_code’])
#求區間內的量能平均值並與最大陰線的量能做對比
vol_sum = df1[‘vol’]。sum()
vol_avr =round(vol_sum/(lenth+0。1),2)
# print(vol_sum,vol_avr)
print(‘股票程式碼:’,code,lenth)
forsinrange(lenth):
date,open,high,low,close,pre_close,ptc_chg,vol,amount,open_chg,high_chg,low_chg,turnover_rate,volume_ratio = stock_para(df1,s)
flag_1,flag_2,flag_3,green_vol,red_vol = GR_gem(open,close,amount,vol,open_chg,high_chg,low_chg,ptc_chg,turnover_rate)
# print(date,open,close,flag_1, flag_2, flag_3)
ifflag_1 ==1:
Red_count = Red_count +1
# print(‘選中Red目標……’,Red_count,‘……’)
ifflag_2 ==:
Green_count = Green_count +1
# print(‘選中Green目標……’,Green_count,‘……’)
ifflag_3 == -1:
Needle_count = Needle_count +1
GR_ratio =round(Red_count/(Green_count+0。01),2)
Needle_ratio =round(Needle_count/(Green_count + Red_count +0。01),2)
lenth_ratio =round((Green_count + Red_count)/lenth,2)
# print(Red_count,Green_count,Needle_count,GR_ratio,Needle_ratio)
ifGR_ratio >1。4andlenth_ratio >0。8andNeedle_ratio
ifgreen_vol > (2*vol_avr)orred_vol > (2*vol_avr):
GR_df = GR_df。append(pd。DataFrame({‘code’: code,‘Red_count’: Red_count,‘Green_count’: Green_count,‘Needle_count’:Needle_count,‘GR_ratio’: GR_ratio,‘Needle_ratio’:Needle_ratio,‘is_GR’:‘Yes’},index=[]),ignore_index=True)
else:
GR_df = GR_df。append(pd。DataFrame({‘code’: code,‘Red_count’: Red_count,‘Green_count’: Green_count,‘Needle_count’:Needle_count,‘GR_ratio’: GR_ratio,‘Needle_ratio’:Needle_ratio,‘is_GR’:‘No’},index=[]),ignore_index=True)
print(GR_df)
returnGR_df
# except:
# print(ts_code,‘在選中日期內沒上市……’)
if__name__ ==‘__main__’:
RS_day = RS_day()
GR_df = GR_count(pool,RS_day)
withpd。ExcelWriter(r‘C:\Users\FRL2\Desktop\yxc\GR_T202006120。xlsx’)aswriter:
GR_df。to_excel(writer,sheet_name=‘GR_df’)
篩選結果如下:
Bug:
選中的個股中,有少數莊股無法剔除掉;
部分很差的股也會因為概念被選中;
暫且來看,準確率還是比較樂觀的,如果在基於基本面和個人喜好研究一下,應該會有不錯的回報率,後續準備去實盤實踐。。。