1.前言
利润 = (股票A卖出价格-股票A买入价格)*股票数量。股票交易过程中买什么股票(选择出股票A)、什么时候买、什么时候卖,是决定你是否盈利的主要因子。股票交易过程中各种财务指标市净率、市盈率等等都能作为考虑因素,但是如果数据是假的呢?思考半天只有交易数据不会造假,每一笔交易数据,每一笔成交价格都是真实发生的。话说回来,选择买什么股票这个有点难,选择市净率低的(理论上市净率小于1那不是发了,这公司砸锅卖铁我也能回本啊),市盈率低的,但是一来很多数据是人工处理的,二来由于股票市场的非理性股票价格会在真实价值上下波动,而且非常大。都给通过这些指标选择股票带来了难度。
2.买什么股票?站在巨人肩膀上
股票交易市场参与者主要包括散户、大机构。大机构肯定是专业人士,俗话说聪明人,我们就跟着他们买呗。现在公开数据能够追踪到数据的主要包括基金(股票型积极性、混合型基金等)、还有就是所谓的北向资金(沪股通、港股通)。
2.1基金
我们买的基金(笼统成为基金了,其实分类很多,也不是全部投资股票,甚至还会加杠杆),基金经理再去拿我们的钱买卖股票,收取管理费用。他们持仓什么股票,一般会每个季度公开一次,一般在每个季度初的20-25号左右(今天7月20日,绝大多数还没有更新2季度末持仓)。很多人都会买基金,每天会看当天基金净值估值。你知道这个怎么算出来的么?其实很简单,比如基金A持仓1只股票,那么这只股票当天的涨跌幅度就是这只基金当天的净值估值变化(涨跌幅)。如果持有2只股票,持仓占比分别为50%,那么当天净值估值变化=股票A涨跌幅度*50%+*股票B涨跌幅度*50%.一般基金会公开持仓最高的TOP10股票,有的甚至只持仓不足10只,那每天基金的净值变化我们就可以自己计算了。我个人持续关注过我买的几个基金,发现有的基金很懒,很少调仓,造成我算出的数据就是当天最终的实际净值变化。现在我有了两个想法:
2.1.1 我想知道聪明人都买了什么股票
这个可以自己爬,也可以自己去CHOICE金融客户端看。(有时间再补图了,回头我)。发现了茅台(1000多只基金都买了)、平安、恒瑞都是超过600只基金持仓。呦呵二季度涨的多的股票都在这里,原来你们在抱团。
缺点是每个季度才更新一次。
这个数据从多个网站爬的,稍后整理下再贴吧。
2.1.2 我自己买聪明人买的股票,不是省去了管理费和买卖手续费么?
这个具体操作方法我也在慢慢磨练。
2.2北向资金
上面我们知道了国内基金都买了什么,甚至可以通过试算来看基金是否进行了调仓。但是公开数据要一个季度才能更新一次有点慢啊。这一点不得不配合另一个聪明人的规范,北向资金,北向资金每天是会公开交易数据和持仓数据的(但是我还没找到实时的数据)。北向资金实时的整体买入卖出是可以看到的,另外北向资金的个股持仓是可以看到前一个交易日的,这个数据太有用了。聪明人昨天干了什么,这个数据太重要了。我们可以看到昨天突然加仓哪个数据,突然减仓哪个数据。
直接贴代码了,我不是程序员,代码很菜,但是解决了我想解决的问题,虽然后来发现能直接在软件里找到。针对代码欢迎大家帮我提高水平。这段代码我学会了通过F12找HEADERS,但是有个问题BS4处理起来太慢了,re快我又想不到很好的办法,XPATH我碰到了解析text时候出现很多ACS码空格的问题,大家帮忙指教。
import requests
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
url_sh = r"https://sc.hkexnews.hk/TuniS/www.hkexnews.hk/sdw/search/mutualmarket_c.aspx?t=sh"
url_sz = r"https://sc.hkexnews.hk/TuniS/www.hkexnews.hk/sdw/search/mutualmarket_c.aspx?t=sz"
datelist = pd.date_range("2020/07/15","2020/07/15",freq="D")
stock_hk = pd.DataFrame()
for date in datelist:
for url in [url_sh,url_sz]:
data = {
"__VIEWSTATE": r"/wEPDwUJNjIxMTYzMDAwZGQ79IjpLOM+JXdffc28A8BMMA9+yg==",
"__VIEWSTATEGENERATOR": r"EC4ACD6F",
"__EVENTVALIDATION": r"/wEdAAdtFULLXu4cXg1Ju23kPkBZVobCVrNyCM2j+bEk3ygqmn1KZjrCXCJtWs9HrcHg6Q64ro36uTSn/Z2SUlkm9HsG7WOv0RDD9teZWjlyl84iRMtpPncyBi1FXkZsaSW6dwqO1N1XNFmfsMXJasjxX85jz8PxJxwgNJLTNVe2Bh/bcg5jDf8=",
"today": "20200715",
"sortBy": "stockcode",
"sortDirection": "asc",
"alertMsg": "",
"txtShareholdingDate":date.strftime("%Y/%m/%d"),
"btnSearch":"搜尋"
}
page = requests.post(url,data=data)
soup = BeautifulSoup(page.text,features="lxml")
stock_code_list = []
stock_name_list = []
shareholding_list = []
shareholding_percent_list = []
holding_date = soup.find(name = "span",style="text-decoration:underline;").string[6::]
stock_code = soup.find_all(name ="td",class_="col-stock-code")
stock_name = soup.find_all(name ="td",class_="col-stock-name")
shareholding = soup.find_all(name ="td",class_="col-shareholding")
shareholding_percent = soup.find_all(name ="td",class_="col-shareholding-percent")
for i in stock_code:
stock_code_list.append(i.find(name="div",class_="mobile-list-body").string)
for j in stock_name:
stock_name_list.append(j.find(name="div",class_="mobile-list-body").string)
for k in shareholding:
shareholding_list.append(k.find(name="div",class_="mobile-list-body").string)
for h in shareholding_percent:
shareholding_percent_list.append(h.find(name="div",class_="mobile-list-body").string)
frame = pd.DataFrame([stock_code_list,stock_name_list,shareholding_list,shareholding_percent_list]).T
frame.columns=["stock_code","stock_name","shareholding","shareholding_percent"]
frame["holding_date"] = holding_date
print(frame[:3],frame.shape)
stock_hk = stock_hk.append(frame)
stock_hk.drop_duplicates()
print(stock_hk[:3],stock_hk.shape)
stock_hk.to_csv("D:\data_hk_20200715.csv")
2.3小结
现在我们能知道截止上个季度末主要的基金公司都买了什么股票,通过分类汇总知道沪股通、深股通股票被多少只基金持仓,持仓比例是多少,比上一期加仓还是减仓了(这几个维度都是有意义的)。同时,我们也知道了北向资金截止昨天都拿了哪些股票,加了还是减仓了。我的想法就是由于大资金调仓不可能很快,如果大量卖出会突然跌停,我们钱少反而容易掉头。比如茅台1000多只基金持仓,北向资金也持仓,都卖起来一个月也卖不完估计。具体选择的标准也有很多,以后我们可以继续探讨。
3.什么时候买入和卖出
肯定是低买高卖啊。买的人多了就涨,卖的人多了就降,这是一切商品的自然市场规律。什么是买的多了,卖的多了?就是交易量呗,整个大盘的交易量、某个板块的交易量、具体个股交易量,这个东西做不了假。我看的是沪股通、深股通的净买入数据。这里有一个误区,之前我以为这个数据是北向资金的净买入,其实不是,这个是整体的内盘和外盘的差值(内盘和外盘大家单独百度吧,其实就是买的和卖的的差值,供求关系决定价格么,又回到供求了)。这个数据,我找到的网站是基本每个交易日交易时间内每10分钟左右更新一次,直接上代码了,大家多提建议。
import pandas as pd
import numpy as np
import re
import requests
from bs4 import BeautifulSoup
#扯淡呢,这个是内盘外盘的监控,不是香港机构的买入卖出
url_h = r"http://data.10jqka.com.cn/hgt/hgtb/field/zdf/order/desc/page/"
url_s = r"http://data.10jqka.com.cn/hgt/sgtb/field/zdf/order/desc/page/"
headers = {
"Accept": r"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Cookie": "spversion=20130314; Hm_lvt_60bad21af9c824a4a0530d5dbf4357ca=1594375102,1594603884,1594689312,1594777348; Hm_lvt_78c58f01938e4d85eaf619eae71b4ed1=1594375102,1594603884,1594689313,1594777348; Hm_lvt_f79b64788a4e377c608617fba4c736e2=1594375102,1594603884,1594689313,1594777348; historystock=603993%7C*%7C600438%7C*%7C603283%7C*%7C603579%7C*%7C300369; Hm_lpvt_78c58f01938e4d85eaf619eae71b4ed1=1594779395; Hm_lpvt_60bad21af9c824a4a0530d5dbf4357ca=1594779395; Hm_lpvt_f79b64788a4e377c608617fba4c736e2=1594779395; v=AvUuvrflxrqAQyIGgNdi014hBHqscqlRcySN83casty7lBvsP8K5VAN2nasE",
"Host": "data.10jqka.com.cn",
"If-Modified-Since": "Wed, 15 Jul 2020 02:10:10 GMT",
"If-None-Match": "W/5f0e6582-ff5a",
"Referer": "http://data.10jqka.com.cn/hgt/hgtb/",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
stock_info = []
for num in range(1,13):
page_h = requests.get(url_h+str(num),headers=headers)
soup = BeautifulSoup(page_h.text,features="lxml")
table_tr = soup.find_all(name="table",class_="m-table J-ajax-table")[1].find_all(name="tr")
for tr in table_tr:
stock_info_tem_sh = []
for td in tr.find_all(name="td"):
stock_info_tem_sh.append(td.get_text())
stock_info.append(stock_info_tem_sh)
for num in range(1,17):
page_s = requests.get(url_s+str(num),headers=headers)
soup = BeautifulSoup(page_s.text,features="lxml")
table_tr = soup.find_all(name="table",class_="m-table J-ajax-table")[1].find_all(name="tr")
for tr in table_tr:
stock_info_tem_sz = []
for td in tr.find_all(name="td"):
stock_info_tem_sz.append(td.get_text())
stock_info.append(stock_info_tem_sz)
frame = pd.DataFrame(stock_info)
page_s = requests.get(url_s+str(num),headers=headers)
soup = BeautifulSoup(page_s.text,features="lxml")
frame["curtime"] = soup.find_all(name="div",class_="curtime")[2].get_text()
frame.columns=["排名","股票代码","股票简称","最新价","涨跌额","涨跌幅","昨收","今开","最高","最低","资金净流入","成交量(手)","成交额(元)","换手率","更新时间"]
frame = frame[frame["最低"].notnull()]
frame.loc[frame["资金净流入"].str.contains("亿"),"资金净流入"] =frame.loc[frame["资金净流入"].str.contains("亿"),"资金净流入"].str.replace("亿","").astype("float")*10000
frame["资金净流入"] = frame["资金净流入"].astype("str")
frame.loc[frame["资金净流入"].str.contains("万"),"资金净流入"] =frame.loc[frame["资金净流入"].str.contains("万"),"资金净流入"].str.replace("万","").astype("float")
frame["资金净流入"] = frame["资金净流入"].astype("float")
frame.to_excel("D:\学习\FF\沪股通资金流入流出监控\stock_hk_curtime2020072005.xlsx")
这里我得补充一点,这个是整体的内盘和外盘数据,如果你多比对这个数据和北向资金每日变化会发现,北向资金比这个聪明多了。这个买入卖出由于是整体的买卖出量,基本能够决定当天的涨跌幅度,但是北向资金很多时候净买入和净卖出是反向的。换个说法,一般情况整体买盘大于买盘,个股股价上涨,股价上涨,有时北向资金反而净卖出,真正的低买高卖。
其他
在群里很那么久,由于不是职业码农,一直没给大家分享什么东西,一直在学习,希望这点东西能给大家一点启发,欢迎大家多交流。
我不认可能用一个公式、一个模型能解决所有问题的方法,只有持续监控、掌握充分的数据才能最优化的决策,这也是大数据的魅力,也是我学习的兴趣。