短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

股票操作講究低買高賣,如果你能買在低點,賣在高點,那麼你就是高手;如果你能買在高點,賣在低點,那麼你就是“韭菜”。所謂“一盈兩平七虧”,對應的是中國的 A 股市場中有 10% 的高手和 70% 的韭菜。進入股市買賣的都覺得自己是高手,最後虧得底褲都沒了。 今天我們從一個簡單的模型來看看短線交易的成功率有多大?


注意:在這裡還是提醒下,很多人學Python過程中會遇到各種煩惱問題,沒有人解答容易放棄。為此我建了個python學習資源群裡面有最新學習資料,如果你想學python,可以關注我,後臺私信我 ‘py’ 自動獲取最新python教程資料!還有老司機解答哦!

短線交易模型的由來

所謂短線交易,就是在一個股價的低點買進,然後在幾天之內賣出。

A 股大多數交易者都喜歡短線交易,他們都希望今天買入,明天就賣出,以此來賺快錢,殊不知短線交易是大多數人虧損最快的方式。

A 股市場上有一批最頂尖的高手,他們可以做到八年一萬倍的神話,這類高手驚人收益率的來源就是短線交易,他們的鐮刀專門伸向追漲殺跌的韭菜。

正是因為有這群人的存在,A 股還有一個著名的榜單,叫做“龍虎榜”。

滬深交易龍虎榜指每日兩市中漲跌幅、換手率等由大到小的排名榜單,並從中可以看到龍虎榜單中的股票在哪個證券營業部的成交量較大。該數據有助於瞭解當日異動個股的資金進出情況,判斷是遊資所為還是機構所為。

我們的短線交易模型就是要從這個龍虎榜說起。 我在瀏覽東方財富網的龍虎榜時,無意中發現他們有個奇怪的數據,如下圖所示:

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

這一欄數據表示的是近三個月內該營業部買入個股後3天個股上漲的概率。

我們都知道股票就是個概率遊戲,如果我能夠計算出一隻股票的上漲概率,那麼我就能根據概率來進行博弈了。如果我每次買入之後上漲的概率大於50%,那麼每次下注的話,長期來看,穩贏啊!

我越想越興奮,感覺發現了一座金礦!

我的腦海中頓時閃現了一個思路:根據每個營業部買入後3天個股上漲的概率以及營業部買入的金額佔總買入金額的比例,我計算出每隻上榜股票後面3天上漲的概率。

具體的步驟如下:

  1. 先將買入的營業部買入淨額排序,換算成比例,例如:買入1:買入2:買入3:買入4:買入5=a c:d:e;
  2. 查看營業部上榜後的上漲概率,例如為:A,B,C,D,E;
  3. 查看營業部上榜後的平均漲幅,例如為:A1,B1,C1,D1,E1;
  4. 計算綜合上漲概率,公式為:(a A+b B+c C+d D+e*E)/(a+b+c+d+e)
  5. 計算綜合漲幅,公式為:(a A1+b B1+c C1+d D1+e*E1)/(a+b+c+d+e)
  6. 計算得到的概率值越大越好,越大越值得搏擊

數據準備

以上只是初步設想的一個簡單模型,要進行實踐,我們首先必須用歷史數據來驗證,看看這個模型是否可靠。

要驗證這個模型的可靠性,我們需要龍虎榜數據和個股行情數據。

下面簡單介紹一下這兩個數據的獲取方法。

龍虎榜數據

我們從東方財富的網頁上來獲取龍虎榜數據:http://data.eastmoney.com/stock/tradedetail/2020-03-20.html ,打開頁面如下:

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

這個頁面可以自定義查詢日期區間,這就很方便的查詢一段時間的數據了。

我們接著打開開發者工具,點擊查詢,就可以很容易地找到查詢數據的請求:

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

我們獲取到的請求為:

<code>http://data.eastmoney.com/DataCenter_V3/stock2016/TradeDetail/pagesize=50,page=1,sortRule=-1,sortType=,startDate=2020-03-20,endDate=2020-03-23,gpfw=0,js=var%20data_tab_2.html?rt=26416119
/<code>

在請求中,你可以帶上開始和結束日期,將pagesize設置大一些,就可以一次性將一段時間的數據查詢出來。

這裡就是一個簡單的 requests 請求,請求獲取的數據也可以很方便的解析,我就不放代碼了。

請求到龍虎榜的列表後,我們就可以查詢每一個股票的龍虎榜詳情數據了,我們點擊列表中的“明細”,就可以跳到龍虎榜詳情頁面了,對應的 URL 為:http://data.eastmoney.com/stock/lhb,2020-03-23,002727.html

我們使用 requests 請求這個 URL,就可以獲取到這個頁面的 HTML 內容,然後解析 HTML 內容即可得到龍虎榜詳情數據。

解析的核心代碼如下:

<code>def parse_data(self, html, lhb_date, scode):
pattern_all = re.compile(' [\\s\\S]*?
[\\s\\S]*?<table>[\\s\\S]*?[\\s\\S]*?<tbody>([\\s\\S]*?)/<tbody>[\\s\\S]*?/<table>[\\s\\S]*?<table>[\\s\\S]*?[\\s\\S]*?<tbody>([\\s\\S]*?)/<tbody>[\\s\\S]*?/<table>[\\s\\S]*?
[\\s\\S]*?數據來源[\\s\\S]*?')
all_content = re.findall(pattern_all, html)
#print(all_content[0][1])

obj_list=[]
if len(all_content):
buy_content = str(all_content[0][0])
sell_content = str(all_content[0][1])

buy_objs = self.parse_detail(buy_content, 0, lhb_date, scode)
sell_objs = self.parse_detail(sell_content, 1, lhb_date, scode)
obj_list.extend(buy_objs)
obj_list.extend(sell_objs)

return obj_list

def parse_detail(self, content, type, lhb_date, scode):

pattern = re.compile('[\\s\\S]*?[\\s\\S]*?
[\\s\\S]*? [\\s\\S]*?
[\\s\\S]*?([\\s\\S]*?)([\\s\\S]*?)[\\s\\S]*?
[\\s\\S]*?([\\s\\S]*?)[\\s\\S]*?([\\s\\S]*?)[\\s\\S]*?([\\s\\S]*?)[\\s\\S]*?([\\s\\S]*?)[\\s\\S]*?([\\s\\S]*?)[\\s\\S]*?
[\\s\\S]*?')
items = re.findall(pattern, content)
obj_list=[]
for item in items:
obj = {}
obj['sales_code'] = self.clear_quote(item[0]) #營業部code
obj['sales_name'] = self.clear_quote(item[1]) #營業部名稱
obj['his_rank_times'] = NumUtils.trans_int(self.clear_quote(item[2])) #歷史上榜次數
obj['his_rank_rate'] = NumUtils.trans_float(self.clear_quote(item[3])) #歷史買入3天上漲概率
obj['buy_money'] = NumUtils.trans_float(self.clear_quote(item[4])) #買入額
obj['buy_of_total_rate'] = NumUtils.trans_float(self.clear_quote(item[5])) #買入額佔成交額比例
obj['sell_money'] = NumUtils.trans_float(self.clear_quote(item[6])) #賣出額
obj['sell_of_total_rate'] = NumUtils.trans_float(self.clear_quote(item[7])) #賣出額佔成交額比例
obj['net_money'] = NumUtils.trans_float(self.clear_quote(item[8])) #淨買入額
obj['type'] = type #買賣類型,0-買入,1-賣出
obj['tdate'] = lhb_date
obj['scode'] = scode
obj_list.append(obj)

return obj_list/<code>

通過這兩步,我們的龍虎榜數據就得到了,我們把它存儲到數據庫。

個股詳情數據

由於沒有地方可以一次性獲取到一段時間的個股數據,但是我們可以在東方財富網站上以找到當天所有個股的行情數據,URL 為:http://quote.eastmoney.com/center/gridlist.html#hs_a_board ,所以這個只能每天獲取一次,然後累積一段時間了。

這個個股詳情數據頁面如下:

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

跟龍虎榜列表頁面一樣,我們可以很容易地找到獲取數據的請求:

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

請求裡面的主要參數有三個:

pn:頁碼

pz:每頁記錄數

fields:個股詳情字段

同樣地,我們可以將每頁記錄數設置足夠大,以確保一次性獲取所有個股數據。

獲取方式很簡單,我們就不貼代碼了。但是有一點需要注意,這個個股數據是實時的,所以我們得每天收盤(下午三點)過後再獲取,才能得到收盤數據。

回溯驗證

每日選股

根據我們前面所講的模型的步驟,我們的選股核心代碼如下:

<code>def ana(self, detail_list):
scode_dict = {}
rank_list = []
for detail in detail_list:
if detail['scode'] not in scode_dict.keys():
sub_list = [detail]
scode_dict[detail['scode']] = sub_list
else:
sub_list = scode_dict[detail['scode']]
sub_list.append(detail)
scode_dict[detail['scode']] = sub_list

for key in scode_dict.keys():
scode = key
sub_list = scode_dict[key]
# 總買入額
total_money = float(0)
# 營業部上漲概率
yyb_avg_rate_list = []
for detail in sub_list:
total_money = total_money + float(detail['buy_money'])
yyb_avg_rate_list.append(float(detail['his_rank_rate']))

# 買入額佔比
money_rate_list = [float(item['buy_money'])/total_money for item in sub_list]
total_rate = float(0)
for i in range(0, len(sub_list)):
total_rate = float(total_rate) + float(yyb_avg_rate_list[i] * money_rate_list[i])
rank_list.append({'scode': scode, 'total_rate': total_rate})

rank_list.sort(key=lambda it: it.get('total_rate'), reverse=True)
return rank_list/<code>

這裡是嚴格按照前面的步驟來做的,最後將結果按照上漲概率倒序排列。

計算選股的上漲幅度

從龍虎榜中按照上漲概率將個股排序後,我準備選取最大上漲概率的股票來進行回溯。如果最大上漲概率的股票第二天開盤直接漲停,那麼捨棄,再選擇第二大概率的,以此類推。

由於股票的買賣價位決定了收益率的高低,我們無法知道真實操作中的買賣價格,所以這裡我用三種策略來進行對比:

樂觀值:第一天最低價買進,第二天最高價賣出。

悲觀值:第一天最高價買進,第二天最低價賣出。

平均值:第一天平均價買進,第二天平均價賣出。

由於我們的上漲概率是上榜後3天的上漲概率,所以我們的買賣方式可能是:

第一天買入,第二天賣出;

第一天買入,第三天賣出;

第二天買入,第三天賣出。

這裡我把上述情況歸結為兩種:第一天買入第二天賣出和前兩天某一天買入第三天賣出。

根據上面的思路,我們的核心代碼為:

<code>def compute(self, date, stat_type):
### stat_type 表示統計類型,1-計算兩天,2-計算三天 ###
# 1. 獲取每日的龍虎榜選股(根據概率倒序)
lhbpick = lhb_history_pick.lhbHisPick()
pick_list = lhbpick.deal(date)

if not len(pick_list):
return None

# 2. 根據選股計算上漲點數
for stock in pick_list:
# 將退市警示股和新股排除
if 'ST' in stock['name'] or '*ST' in stock['name'] or 'N' in stock['name']:
continue

# 獲取股票三日行情數據
stock_day_detail = self.query_stock_detail(stock['scode'], date)
# 選股當天收盤價
day_close_price = stock_day_detail[0]['close_price']
# 選股後一天漲停價
first_day_limit = stock_utils.StockUtils.calc_limit_price(day_close_price)
# 選股後一天最低價
first_day_low_price = stock_day_detail[1]['low_price']
# 選股後一天最高價
first_day_top_price = stock_day_detail[1]['top_price']
# 選股後一天開盤價
first_day_open = stock_day_detail[1]['open_price']
# 選股後一天平均價
first_day_avg_price = (first_day_top_price + first_day_low_price) / 2
# 開盤即漲停並且一天未開板,買不進,放棄
if first_day_low_price == first_day_top_price or first_day_limit == first_day_open:
continue

# 選股後二天最低價
second_day_low_price = stock_day_detail[2]['low_price']
# 選股後二天最高價
second_day_top_price = stock_day_detail[2]['top_price']
# 選股後二天平均價
second_day_avg_price = (second_day_top_price + second_day_low_price) / 2

# 計算上榜後兩天的情況
optim_up2 = (second_day_top_price - first_day_low_price) / first_day_low_price
pessim_up2 = (second_day_low_price - first_day_top_price) / first_day_top_price
avg_up2 = (second_day_avg_price - first_day_avg_price) / first_day_avg_price

if stat_type == 1:
# print(optim_up2, pessim_up2, avg_up2)
return optim_up2, pessim_up2, avg_up2

# 選股後三天最低價
third_day_low_price = stock_day_detail[3]['low_price']
# 選股後三天最高價
third_day_top_price = stock_day_detail[3]['top_price']
# 選股後三天平均價
third_day_avg_price = (second_day_top_price + second_day_low_price) / 2

# 計算上榜後三天的情況
max2 = max(first_day_top_price, second_day_top_price)
min2 = min(first_day_low_price, second_day_low_price)
avg2 = (first_day_avg_price + second_day_avg_price) / 2

optim_up3 = (third_day_top_price - min2) / min2
pessim_up3 = (third_day_low_price - max2) / max2
avg_up3 = (third_day_avg_price - avg2) / avg2

return optim_up3, pessim_up3, avg_up3

return None/<code>

通過上述方法,我們就獲得了某一天所選出的股票的後三天上漲的幅度。

結果展示

我準備從三段不同趨勢的行情來驗證模型,分別是趨勢上漲,趨勢震盪,趨勢下跌三種。

選取的時間週期都是一週,對應的大盤指數日K圖如下:

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

為了更直觀地展示效果,我將每個週期的上漲幅度用折線圖來展示。

我們來看看上漲趨勢的收益圖:

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

下跌趨勢的收益圖:

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

震盪趨勢的收益圖:

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

短線買股賺Q的概率有多大?用Python分分鐘教你分析出結果

我們先來進行縱向對比,很明顯,不論在哪種趨勢下,收益率的關係都是:樂觀 > 平均 > 悲觀。這也跟我們的常理相吻合,畢竟樂觀和悲觀是兩種極端操作方法,而平均是介於這兩者極端之間的。

我們再從上榜後2天和上榜後3天的方面來對比,我們可以看到,不論在哪種趨勢下,上榜後3天的總體收益率比上榜後兩天高,這也應該可以事先預想到。

接著,我們可以看到三種趨勢下總體收益率的情況:三種趨勢下,收益率並沒有跟隨不同的趨勢而出現顯著的特點,所以在三種趨勢下,最大上漲概率的股票收益率沒有顯著的區別。換句話說,就是不管在何種趨勢下,最好的短線操作都可以賺到差不多的收益。

我們來總結一下:如果你是市場上頂尖的選手,可以買在最低價賣在最高價,那麼不論行情怎麼樣,你都可以獲取不菲的收益;如果你是追漲殺跌型的韭菜,那麼你做短線註定會虧損;如果你只是平均水平,那麼你的收益很微薄,所以要想參與短線操作,你的水平至少必須在平均水平以上。

當然,股票市場上的變量很多,這只是一個簡單的模型,考慮的變量也很少,而且驗證的數據也相對較少,只能大致說明短線操作的收益情況,並不是嚴謹的論證。


最後提醒大家:很多人學Python過程中會遇到各種煩惱問題,沒有人解答容易放棄。為此我建了個python學習資源群裡面有最新學習資料,如果你想學python,可以關注我,後臺私信我 ‘py’ 自動獲取最新python教程資料!還有老司機解答哦!


分享到:


相關文章: