基於一個紅綠柱邏輯選股

假定我們忽略掉個人主觀情緒而去選擇跟隨資金以及市場的選擇,那麼如果主力資金是看多的,形成的就是個股的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:

選中的個股中,有少數莊股無法剔除掉;

部分很差的股也會因為概念被選中;

暫且來看,準確率還是比較樂觀的,如果在基於基本面和個人喜好研究一下,應該會有不錯的回報率,後續準備去實盤實踐。。。