注:本文為個人原創,僅供技術探討與交流,對實際投資并不造成建議,
本人并非金融專業,所了解的金融知識有限,歡迎金融人士指正及提供意見進行改進優化,歡迎IT大佬們提供建議及交流,
文章目錄
- 前言
- 一、資料獲取:Python爬蟲(Scrapy框架)=> FUND.txt => MF_INFO.txt
- 1).從天天基金資料介面獲取資料
- 2).爬蟲前期準備
- 3).Scrapy框架
- 二、資料清洗及計算指標:Spark =>FUND_RESULT
- 1.過濾資料
- 2.資料欄位格式統一
- 3.計算得出欄位now_down、all_win
- 4.完整代碼
- 三、資料分析:SQL
- 1.昨日漲跌幅、近一月漲跌幅、近一年漲幅、僅三年漲幅 top20 => 當前主題行情分析
- 2.金額總值top50=> 截至2020-12-31最熱門抱團方向(金額總值的資料統一是2020-12-31更新)
- 3. 3月份后漲跌幅為“- -” => 新發基金封閉期3個月=> 當前基金機構看好的行業板塊方向 ≈> 未來抱團方向(?)
- 4.now_down最小前20 => 數值越小,跌幅越大
- 5.all_win =>中長期正收益,值得長期持有
- 四、未來構思方向
- 總結
前言
在當下熱銷的基金市場中,有著茫茫多的基金,本文希望能以科學的角度,以資料作為依托,更好地挑選基金 (成為韭菜)
本文共用到以下技術:Python爬蟲、Spark資料清洗、SQL分析
未來構想:Spark資料挖掘(建模分析、基金經理實力大資料分析)、量化資訊面(實時量化資訊作為利好or利空指標)
本文切入角度:
1.希望做到在相對低的凈值買入值得長期持有的基金并定投
2.通過已有的資料了解到當下及未來3個月市場熱門的板塊(抱團)
3.通過基金的表現及近期情況判斷市場方向
基金是T+1交易制度,存在明顯的市場時間滯后,不適合像股票一樣頻繁操作,
整體構思(完善后打包每交易日定期更新):
1.獲取資料:
各基金的基本資訊(名稱、代號、型別、資金、基金經理)、昨日凈值、昨日漲跌幅、近一月漲跌幅、近三月漲跌幅、近六月漲跌幅、近一年漲跌幅、近三年漲跌幅、成立以來漲跌幅
2.資料清洗及計算指標:
已終止或資料例外的基金資料去除、統一欄位格式、計算得出
now_down:當前、僅一月下跌,僅半年、一年漲跌幅為正(資料層面上判斷:該基金當前屬于回撤調整期且值得長期持有)
all_win:三月、六月、一年、三年、所有均為正(長期正收益)
3.SQL分析:
篩選基金型別、各時間維度漲跌幅分析、金額總值top50、近3月新發基金 => 判斷當前基金機構最看好的行業板塊 ≈> 未來抱團方向(?)、now_down、 all_win
4.資料挖掘與建模:盈利模型、經理實力判斷指標聚類分析、…
5.量化資訊面(初步構思)
注:當前資料日期為:2020/03/02
一、資料獲取:Python爬蟲(Scrapy框架)=> FUND.txt => MF_INFO.txt
1).從天天基金資料介面獲取資料
接入天天基金資料介面(所有基金名稱串列代碼):http://fund.eastmoney.com/js/fundcode_search.js
部分資料截圖:

從圖中資料可以看出,js檔案中的資料以串列格式存放,且按照 => (編號、拼音縮寫、基金名稱、基金型別、拼音 )的順序排列,因為資訊并不完善,所以還需要再爬取每個基金的詳細資訊
2).爬蟲前期準備
通過觀察,天天基金的robots規則為:

每個基金詳情頁面為
http://fund.eastmoney.com/+基金代號,如下圖:

簡單處理js檔案資料 => FUND.txt
FUND.txt部分資料如下圖:

3).Scrapy框架
FUND.txt => Python爬蟲 => MF_INFO.txt
Python爬蟲代碼以及MF_INFO.txt檔案部分資料如圖:

因為該爬蟲比較簡單就不詳細決議了(框架內其他配置可自行設定或評論區留言),代碼如下:
import scrapy
class mfSpider(scrapy.Spider):
name = 'mfspider'
fd = open(r'C:\Users\Arrogant\Desktop\Bigdata_Fund\FUND.txt',encoding='utf-8')
data_list=(fd.read()).replace("],","];").split(";")
start_urls = []
for a in data_list:
mf_list=a.split(",")
mf_code=mf_list[0].replace("[","").replace("\"","")
start_urls.append('http://fund.eastmoney.com/'+str(mf_code)+'.html')
def parse(self, response):
infodict = {}
infodict['MF_name'] =response.xpath('//div[@class="fundDetail-tit"]/div[1]/text()').extract_first()
infodict['MF_num']=response.xpath('//div[@class="fundDetail-tit"]/div[1]/span[2]/text()').extract_first()
infodict['MF_type'] = response.xpath('//td[contains(text(),"基金型別")]/a/text()').extract_first()
infodict['MF_money'] = response.xpath('//td[contains(text(),"億元")]/text()').extract_first()
infodict['MF_manager'] = response.xpath('//td[contains(text(),"基金經理")]/a/text()').extract_first()
infodict['MF_worth'] = response.xpath('//dl[@class="dataItem02"]/dd[1]/span[1]/text()').extract_first()
infodict['MF_rate'] = response.xpath('//dl[@class="dataItem02"]/dd[1]/span[2]/text()').extract_first()
infodict['MF_1mon'] = response.xpath('//div[@class="dataOfFund"]/dl[1]/dd[2]/span[2]/text()').extract_first()
infodict['MF_3mon'] = response.xpath('//div[@class="dataOfFund"]/dl[2]/dd[2]/span[2]/text()').extract_first()
infodict['MF_6mon'] = response.xpath('//div[@class="dataOfFund"]/dl[3]/dd[2]/span[2]/text()').extract_first()
infodict['MF_12mon'] = response.xpath('//div[@class="dataOfFund"]/dl[1]/dd[3]/span[2]/text()').extract_first()
infodict['MF_36mon'] = response.xpath('//div[@class="dataOfFund"]/dl[2]/dd[3]/span[2]/text()').extract_first()
infodict['MF_all'] = response.xpath('//div[@class="dataOfFund"]/dl[3]/dd[3]/span[2]/text()').extract_first()
yield infodict
二、資料清洗及計算指標:Spark =>FUND_RESULT
1.過濾資料
據觀察,MF_INFO資料中存在已終止基金或已不更新資料的基金 僅保留:昨日漲跌幅、近一月漲跌幅、近三月漲跌幅、近六月漲跌幅、近一年漲跌幅、近三年漲跌幅%、成立以來漲跌幅 共7個欄位中為 “--”(基金運作時間未久會以“--”表示,為正常)和存在“%”的資料
2.資料欄位格式統一
(便于后續SQL查詢)金額欄位統一為:僅保留數值(以億元為單位)
(便于后續SQL查詢)統一漲幅欄位:百分比 => double小數,"–" => 0.0

注意:這里為部分代碼,去除了%號后,下面還統一乘以了0.01
3.計算得出欄位now_down、all_win

all_win:將3個月、半年、一年、三年、歷史總漲幅為正的基金標記為yes ≈> 從資料層面上看,該基金中長期正收益,值得長期持有并定投
now_down:將同時滿足昨日漲跌幅<0,僅一月漲跌幅<0,近半年漲跌幅>0,僅一年漲跌幅>0的基金標記,并計算出昨日跌幅+ 僅一月跌幅作為引數 ≈> 資料層面上判斷:該基金長期持有為正收益且當前屬于回撤調整期,屬于相對低值可入手
4.完整代碼
import org.apache.spark.{SparkConf, SparkContext}
object fund_clear {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setAppName("fund").setMaster("local[*]")
val sc=new SparkContext(conf)
val input="hdfs://localhost:9000/fund"
val lines=sc.textFile(input)
var out=lines.map(_.split("\\|")).filter(x=>{
(x(6).contains("%")||x(6).contains("--"))&&(x(7).contains("%")||x(7).contains("--"))&&(x(8).contains("%")||x(8).contains("--"))&&(x(9).contains("%")||x(9).contains("--"))&&(x(10).contains("%")||x(10).contains("--"))&&(x(11).contains("%")||x(11).contains("--"))&&(x(12).contains("%")||x(12).contains("--"))
})
var result1=out.map(x=> {
x(3)=x(3).replace(":","").replaceAll("億.+","")
var now_down=0.0
var mon_all_win="no"
var today=0.0
var mon1=0.0
var mon3=0.0
var mon6=0.0
var mon12=0.0
var mon36=0.0
var monall=0.0
if(x(6).contains("%")){
today=x(6).replace("%","").toDouble
}
if(x(7).contains("%")){
mon1=x(7).replace("%","").toDouble
}
if(x(8).contains("%")){
mon3=x(8).replace("%","").toDouble
}
if(x(9).contains("%")){
mon6=x(9).replace("%","").toDouble
}
if(x(10).contains("%")){
mon12=x(10).replace("%","").toDouble
}
if(x(11).contains("%")){
mon36=x(11).replace("%","").toDouble
}
if(x(12).contains("%")){
monall=x(12).replace("%","").toDouble
}
if((today<0.0)&&(mon1<0.0)&&(mon6>0.0)&&(mon12>0.0)&&(mon36>0.0)){
now_down=(today+mon1)*0.01
}
if((mon3>0.0)&&(mon6>0.0)&&(mon12>0.0)&&(mon36>0.0)&&(monall>0.0)){
mon_all_win="yes"
}
x(6)=(today*0.01).formatted("%.4f")
x(7)=(mon1*0.01).formatted("%.4f")
x(8)=(mon3*0.01).formatted("%.4f")
x(9)=(mon6*0.01).formatted("%.4f")
x(10)=(mon12*0.01).formatted("%.4f")
x(11)=(mon36*0.01).formatted("%.4f")
x(12)=(monall*0.01).formatted("%.4f")
var result=""
for (i <- x) {
if (i.equals(x(x.size - 1))) {
result = result + i.trim() + "|" + now_down + "|" + mon_all_win
} else {
result = result + i.trim() + "|"
}
}
result
}
)
result1.saveAsTextFile("hdfs://localhost:9000/FUND_RESULT")
}
}
三、資料分析:SQL
#去除worth凈值為“--”(已終止、資訊不全)
DELETE from fund where worth = '--'
去除已終止、資訊不全的資料后,共有8933個基金
以下的SQL都只篩選了股票型、混合型、QDII型基金
1.昨日漲跌幅、近一月漲跌幅、近一年漲幅、僅三年漲幅 top20 => 當前主題行情分析
#昨日跌幅前20(只選擇QDII型、混合型、股票型,下同)
select * FROM fund WHERE type like '%QDII%' OR type like '%混合%' OR type like '%股票%' ORDER BY rate ASC LIMIT 20
#昨日漲幅前20
select * FROM fund WHERE type like '%QDII%' OR type like '%混合%' OR type like '%股票%' ORDER BY rate DESC LIMIT 20
#近一月漲幅前20
select * FROM fund WHERE type like '%QDII%' OR type like '%混合%' OR type like '%股票%' ORDER BY mon1 DESC LIMIT 20
#近一月跌幅前20
select * FROM fund WHERE type like '%QDII%' OR type like '%混合%' OR type like '%股票%' ORDER BY mon1 ASC LIMIT 20
#近一年漲幅前20
select * FROM fund WHERE type like '%QDII%' OR type like '%混合%' OR type like '%股票%' ORDER BY mon12 DESC LIMIT 20
#近三年漲幅前20
select * FROM fund WHERE type like '%QDII%' OR type like '%混合%' OR type like '%股票%' ORDER BY mon36 DESC LIMIT 20
2.金額總值top50=> 截至2020-12-31最熱門抱團方向(金額總值的資料統一是2020-12-31更新)
SELECT * from fund WHERE type like '%QDII%' OR type like '%混合%' OR type like '%股票%' ORDER BY money DESc LIMIT 50

毫無懸念,消費醫療新能源三條主賽道占據了80%,據統計前50大資金的基金,指數型僅占一個,股票型僅占7個,剩下的全是混合型,可以看出分散風險的概念還是深得人心,當然,有個別會掛著混合型干著梭哈某板塊的事…比如:諾安成長,
因為我們在挑選的時候一定要仔細看該基金的重倉股,
3. 3月份后漲跌幅為“- -” => 新發基金封閉期3個月=> 當前基金機構看好的行業板塊方向 ≈> 未來抱團方向(?)
已事先把漲跌幅“--”轉換為“0.0”SELECT * FROM fund where mon3='0.0' AND (type like '%QDII%' OR type like '%混合%' OR type like '%股票%')

當前股票型、混合型、QDII型新發基金共計125個,據分析,大多數新發基金都可投資港股
主題板塊方面熱度: 醫藥≈新能源>科技≈消費>環保≈軍工
4.now_down最小前20 => 數值越小,跌幅越大
SELECT * FROM fund WHERE type like '%QDII%' OR type like '%混合%' OR type like '%股票%' ORDER BY now_down ASC LIMIT 20

如圖:近期回撤幅度最大的20只基金中,中長期正收益的為19個,主題板塊方面:醫藥、白酒領跌,其中醫藥>白酒
5.all_win =>中長期正收益,值得長期持有
SELECT * from fund where all_win ="yes" AND (type like '%QDII%' OR type like '%混合%' OR type like '%股票%')
四、未來構思方向
一、完善后打包統一每個交易日定期運行
二、spark ml資料挖掘:
盈利模型、經理實力判斷指標聚類分析、…
三、量化資訊面:
熱門評論、熱門資訊、…
總結
本人個人認為:金融市場是一個混沌市場,市場受影響因素非常大,而當前單純憑借資料的客觀性判斷意義不大,因此還得結合有關金融知識對市場進行主觀判斷,結合當前訊息面、利好政策、市場情緒等多角度進行分析
資料客觀角度:
根據當前新發基金:港股熱度上漲,板塊還是以醫藥及新能源為主,消費板塊熱度有所下降,科技不變,新增熱度方向:軍工及環保板塊
根據當前下跌幅度(now_down):當前醫藥、消費(白酒)回撤幅度極大,跌幅最大的前20只基金近一月跌幅最大為14.32%,最小為11.36%,其中醫藥回撤幅度大于消費
根據中長期正收益指標(all_win):共有2099個基金符合中長期正收益,約占總基金資料中的23.4%,長期持有的賺錢效益從資料上看其實并沒有想象中的這么好,基金市場熱度明顯高于市場賺錢效應
金融訊息主觀角度(個人見解):
當前海外市場貨幣政策寬松,這是利好,央行之前表示:國內貨幣政策走向:穩字當頭,不急轉彎,在我的理解下:不急轉彎也就是相當于會轉彎,國內態度還是以穩為主,且近期政策打壓炒房,
因此資金方面我認為還是利好于A股及港股,尤其是港股,近期港股提升印花稅我個人認為更多的是為了維持市場穩定且持續向上作為一個抗力因素給資金降降火,否則只是為了提高財政收入而將市場資金流動性降低不會更得不償失嗎?
板塊方面:近期醫藥消費回撤幅度極大預料當中,畢竟年前所產生的泡沫過高不利于維穩,個人認為醫藥+消費+新能源還是主賽道(消費的地位可能有所下降),且會增加環保+軍工+順周期工業板塊的機會作為副賽道
綜上所述:所選了10只基金,用定投模擬器以一個月時間(每周四定投500)進行模擬測驗,看下這樣選出來的基金的收益是否可觀,如果有繼續完善優化意義,會繼續完成未來構思方向并實作每交易日/每周更新

注:以上所選基金僅進行測驗,本文并不提供任何投資建議
注:以上資料日期為:2020/03/02
基金是一個持有時間越長所取得的回報越高的一個理財方式,以時間換空間,本文只是本人在業余時間出于興趣愛好做的一個簡單分析,不奢求于能抄底,畢竟抄底不成被抄家的例子比比皆是,只希望于能更好地選擇基金進行定投并長期持有,
ps:一個月后見!
注:本文為個人原創,如需轉載,請注明出處,同時僅供技術探討與交流,對實際投資并不造成建議,
本人并非金融專業,所了解的金融知識有限,歡迎大佬們指正及提供意見進行改進優化,歡迎大佬們提供建議及交流!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265885.html
標籤:其他
上一篇:Jenkins最簡單的安裝方法
