写点代码-分级基金的套利交易

分级基金一般分为母基金和A/B份额的子基金。母基金可以通过拆分转换成A/B份额的子基金,A/B份额的子基金也可以通过合并方式转换成母基金。A/B份额的子基金可以进行场内交易,A/B份额的交易价格和它的净值价格不同,也就是会有折/溢价。根据A/B份额子基金的交易价格可以计算出母基金的净值,如果与母基金公布的净值相差较大,则可以通过合并、拆分进行套利交易。

于是想写个小程序监视每天分级基金的净值和交易价格,并且计算出净值差,判断是否存在套利机会。思路也比较简单,通过sinajs提供的股票数据接口获取每天的交易行情数据,然后解析出自己关注的数据,计算结果。

#-*- coding:utf-8 -*-

import urllib2

def download_html(url):
	f = urllib2.urlopen(url)
	return f.read()

def parse_line(line):
	context = line.split('"')
	return context[1].split(',')

def parse_html(html):
	lines = html.split('\n')
	items = []
	for line in lines:
		if len(line.strip()) == 0:
			continue
		item = parse_line(line)
		items.append(item)
	return items

def parse_items(items):
	sa = float(items[0][2])
	fa = float(items[1][1])
	sb = float(items[2][2])
	fb = float(items[3][1])
	fc = float(items[4][1])
	sda = items[0][-3]
	fda = items[1][-2]
	sdb = items[2][-3]
	fdb = items[3][-2]
	fdc = items[4][-2]
	assert(sda == sdb)
	assert(fda == fdb)
	assert(fda == fdc)
	sc = (sa + sb) / 2
	pp = 100.0 * (sc - fc) / fc
	return (fda, sa, fa, sb, fb, fc, sc, pp)

def parse_fund(a, b, c):
	url = 'http://hq.sinajs.cn/list=sz%s,f_%s,sz%s,f_%s,f_%s' % (a, a, b, b, c)
	html = download_html(url)
	items = parse_html(html)
	return parse_items(items)

def play_game():
	a = '150018'
	b = '150019'
	c = '161812'
	fund = parse_fund(a, b, c)
	print '%s : %5.3f, %5.3f, %5.3f, %5.3f, %5.3f, %5.3f, %5.3f%%' % (fund[0], fund[1], fund[2], fund[3], fund[4], fund[5], fund[6], fund[7])

def test_download_html():
	#url = 'http://www.baidu.com'
	a = '150018'
	b = '150019'
	c = '161812'
	url = 'http://hq.sinajs.cn/list=sz%s,f_%s,sz%s,f_%s,f_%s' % (a, a, b, b, c)
	data = download_html(url)
	assert(not data is None)
	print data.decode('gb2312').encode('utf-8')

def test_parse_line():
	line = 'var hq_str_sz150018="银华稳进,0.920,0.920,0.926,0.927,0.917,0.926,0.927,252350769,232719342.807,1568101,0.926,3017105,0.925,171000,0.924,110372,0.923,377600,0.922,952500,0.927,2176743,0.928,4024900,0.929,748300,0.930,136000,0.931,2013-01-18,15:45:52,00";'	
	item = parse_line(line)	
	assert(not item is None)
	print item


def test_parse_html():
	test_html = '''
	var hq_str_sz150018="银华稳进,0.920,0.920,0.926,0.927,0.917,0.926,0.927,252350769,232719342.807,1568101,0.926,3017105,0.925,171000,0.924,110372,0.923,377600,0.922,952500,0.927,2176743,0.928,4024900,0.929,748300,0.930,136000,0.931,2013-01-18,15:45:52,00";
	var hq_str_f_150018="银华稳进,1.003,1.16,1.003,2013-01-17,78.5548";
	var hq_str_sz150019="银华锐进,0.692,0.685,0.703,0.715,0.683,0.702,0.703,994795375,697633497.324,3654630,0.702,4710800,0.701,7029806,0.700,388100,0.699,2360200,0.698,2244363,0.703,16549500,0.704,4911900,0.705,7603137,0.706,5983500,0.707,2013-01-18,15:45:52,00";
	var hq_str_f_150019="银华锐进,0.605,0.605,0.615,2013-01-17,78.5548";
	var hq_str_f_161812="银华深证100指数分级,0.804,0.883,0.809,2013-01-17,21.8818";
	'''
	items = parse_html(test_html)
	assert(not items is None)
	for item in items:
		print item

if __name__ == '__main__':
	play_game()
	#test_download_html()
	#test_parse_line()
	#test_parse_html()





你可能感兴趣的:(python,分级基金,套利交易)