计本 iPhone手机应用开发设计(爱炒股) - 图文

更新时间:2024-02-28 04:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

iPhone手机应用开发设计(爱炒股)

数学与计算机科学学院 计算机科学与技术专业

105032011126 张民鹏 指导教师:黄欣沂

【摘要】在如今一个经济正高速发展的社会里,越来越多的人开始将投资的目光移向金融市场。在懵懂与实战之间,爱炒股(iStock)软件应运而生。爱炒股手机软件的设计是集股票信息、资讯、模拟炒股于一体的基于IOS操作系统的一款手机应用软件。运用异步加载、单例、通知、MVC等当前热门技术实现。它给予更多人一次真实的体验,买入、卖出、撤单,让极佳的体验效果带你玩转股市。投资决策、投资组合,为了实战而奠定基础。微博登陆、微信朋友圈分享,让更多的人来关注这场智者的游戏、勇者的战争。在设置栏,你可以更加个性化。因远程推送,让你不是一个人在战斗,随时关注市场的变动。 【关键词】爱炒股;手机应用;软件;iOS

1

目录

1 引言 ...................................................................... 4

1.1课题开发背景 .................................................................... 4 1.2软件系统开发的现实意义 .......................................................... 4

2 系统开发环境 .............................................................. 5

2.1 开发工具 ........................................................................ 5 2.2 开发语言 ........................................................................ 5 2.3 数据库工具 ...................................................................... 5 2.4 第三方框架 ...................................................................... 5

3 爱炒股软件数据接口介绍 .................................................... 6

3.1 数据类型介绍 .................................................................... 6 3.2 数据接口介绍 .................................................................... 7

4 爱炒股软件需求分析 ........................................................ 7

4.1 爱炒股软件系统的可行性分析 ...................................................... 7 4.2 爱炒股软件系统功能需求分析 ...................................................... 7

5 爱炒股软件系统设计 ........................................................ 9

5.1 爱炒股软件系统总体架构设计 ...................................................... 9 5.2自选股模块 ...................................................................... 9 5.3大盘指数模块 ................................................................... 10 5.4我的账户模块 ................................................................... 12 5.5 模拟委托交易模块 ............................................................... 13 5.6决策模块 ....................................................................... 14 5.7股市资讯模块 ................................................................... 14 5.8设置模块 ....................................................................... 15

6 爱炒股软件系统实现 ....................................................... 16

6.1 数据的抓取与解析 ............................................................... 16

6.1.1 数据的抓取 ................................................................. 16 6.1.2 数据解析 ................................................................... 17

6.2数据的请求及刷新 ............................................................... 24 6.2.1 数据的请求 ................................................................. 24

2

6.2.2 NSTIMER定时刷新 ............................................................ 24 6.3数据库 ......................................................................... 26 6.3.1 数据库表 ................................................................... 26 6.3.2 数据库的单例实现 ........................................................... 28 6.4数据的存储 ..................................................................... 28 6.4.1图片的缓存处理 ............................................................. 28 6.4.2用户信息的缓存 ............................................................. 28 6.4.3交易数据的存储 ............................................................. 29 6.5 数据安全 ....................................................................... 29 6.5.1 MD5加密实现 ............................................................... 29 6.5.2 指纹识别 ................................................................... 30 6.6 通知 ........................................................................... 31 6.6.1 本地通知 ................................................................... 31 6.6.2 远程推送通知 ............................................................... 32 6.7模拟交易实现过程 ............................................................... 34 6.7.1 买入 ....................................................................... 35 6.7.2 卖出 ....................................................................... 37 6.7.3 撤单 ....................................................................... 37 6.8资产组合风险计算 ............................................................... 38 6.8.1 相关参数 ................................................................... 38 6.8.2 实现算法 ................................................................... 39 6.8.3 关于该算法的实际不确定性 ................................................... 41

7 系统测试 ................................................................. 43

7.1 兼容性测试 ..................................................................... 43 7.2 性能测试 ....................................................................... 43 7.3 稳定性测试 ..................................................................... 44

8 总结 ..................................................................... 45 参考文献 ................................................................... 45 附录一:数据接口 ........................................................... 48 附录二:图标 ............................................................... 51 附录三:版本控制 ........................................................... 52

3

1 引言

1.1课题开发背景

根据TIOBE最新发布2014年10月的编程语言排行榜中,可以看到C、Java、Objective-C依旧处

于榜单前三。另外,Apple公司在9月份正式发布的Swift新的编程语言已悄然进入排行前二十的榜单中。从这些数据中可以看到iOS系统逐渐在扩大市场规模。

图1-1 TIOBE编程语言排行榜

【数据来源:http://www.tiobe.com】

不论是iPhone的用户体验,还是硬件方面,都是目前极受广大消费者的喜爱。基于iOS开发的手

机应用产品,在市场中得覆盖率也是逐步在提高。

1.2 爱炒股软件系统框架设计开发的现实意义

对于那些刚开始准备步入股市的哪些人来说,爱炒股这款软件是极其合适不过的了。爱炒股手机

软件的设计是集股票信息、资讯、模拟炒股于一体的基于IOS操作系统的一款手机应用软件。当下,模拟炒股功能大部分是出现在PC端,而在移动端出现的是较少的。刚进入股市,必然有种胆战心惊,确实是这样,股市每天千变万化,所以,用爱炒股来先练练手也是不错的。除了模拟交易的功能外,爱炒股中得股票资讯也是非常丰富的,整合各大财经门户网站的信息,如同花顺、和讯、腾讯股票等,同时也包含有各大机构的调研报告供参考投资。

4

1.3 爱炒股软件系统设计预达到的目标

该系统沿着移动端开发趋势,运用Objective-C开发语言,实现基于iOS系统平台的集股票资讯、

投资参考、模拟炒股于一体的iPhone手机应用软件。

2 爱炒股软件开发环境

2.1 开发工具

该应用软件使用的开发工具为Xcode 5.1。

目前Xcode已更新到6.1版本,在该应用中主要使用Xcode5.1进行开发,在后续的更新和维护中

采用的是Xcode6.1。

2.2 开发语言

目前该软件使用的开发语言为Objective-C。当下市场上比较流行于iOS应用开发的语言是OC和

Swift,但是由于Swift还不是太稳定,有很多语言规范还在不断的完善中,所以iStock应用主要采用Objective-C语言进行编码开发。

2.3 数据抓包工具

该软件使用的抓包工具为paros。

2.4 第三方框架

该应用中主要使用了以下几种第三方框架:

表2-1 第三方框架

框架 AFNetworking CorePlot GDataXMLNode MJRefresh SDWebImage ShareSDK XCMultiSortTableView XGSDK 说明 一个轻量级的网络请求api类库 开源矢量图形库 解析xml数据的类库 数据刷新和加载 提供图片异步缓存的机制 新浪微博登录、分享 多级表格 腾讯信鸽远程推送 5

3 爱炒股软件数据接口介绍

3.1 数据类型介绍

在爱炒股软件中通过请求数据后返回的数据类型主要有字符串、xml和json三种。

1、字符串类型

例如,通过GET请求后,返回的数据为以下结果:

varhq_str_sh601688=\华泰证券,13.93,12.66,13.93,13.93,13.93,13.93,0.00,

2877472,40083185,62863728,13.93,184800,13.92,51600,13.91,43900,13.90,15000,13.89,0,0.00,0,0.00,0,0.00,0,0.00,0,0.00,2014-11-26,15:03:05,00\

对于字符串类型的数据来说,缺点之处在于:没有明显的数据结构,不方便解析。 2、xml类型

在获取大部分的股票资讯类的接口时,返回的都是xml类型的数据:

568654740 <![CDATA[ 传中央重磅会议下月召开将定调明年经济政策 ]]>

近日,有消息人士对媒体透露称,中央经济工作会议将于12月9日起开始举行。会议将围绕\新常态\下的宏观经济和深化改革,提出明年的经济社会发展目标和宏观政策基调。当前市场对经济增速下调的猜测日益增多,北京经济学者表示,7-7.2%为合理的增长区间。 ]]>

3、json类型

对于返回数据类型如下的格式:

6

{

\ \

\ {

\ \保险\ \ \ \ \ \新华保险\ \ \ \

}, ?? } }

3.2 数据接口介绍

数据接口主要从新浪股票、腾讯股票、同花顺、和讯股票接口获取,数据类型有:string、json、具体数据接口详见附录一。

xml三种。

4 爱炒股软件需求分析

4.1 爱炒股软件系统的可行性分析

iStock主要面向的群体是想体验炒股并且毫无经验的人群,该软件正是为他们提供了他们的所

需。

模拟炒股,较为真实的模拟显示股票交易动作,模拟炒股中提供了买、卖、撤单三个模块,进行

仿真模拟交易,让用户较为真实的感受股票交易的过程,以及学习和分析如何进行择股、投资组合等。

4.2 爱炒股软件系统功能需求分析

根据系统功能划分,iStock应用详细需求描述如下: 1、自选股功能需求

该功能为一个基本功能,上海证券交易所和深圳证券交易所的两市股票超过三千只,用户可以根

据自己的选择偏好来添加关注的股票,查看自选股相关信息,同时根据关注度的不同调整对自选股的排序等。

2、大盘指数功能需求

7

大盘指数是对股票交易的一个参考,在选择选择股票交易时,可以关注该股所在行业或者板块的

涨跌幅。同时,对于偏好交易涨停股或者跌停股的用户,可以随时关注其中涨停榜和跌停榜股票,以及能够在涨停分析中查看涨停原因及相关概念,以便用户能够在相关概念中发掘低价股,逢低买进。 3、我的账户功能需求

在模拟交易中,我的账户占有很重要的作用。用户所有的交易信息均能在我的账户中查看到,并

且用户能够很清晰明了的看到当前持仓的盈亏。同时,用户能够查看当前资产的构成情况等。 4、模拟交易功能需求

模拟交易模块为该应用的主要模块,用户通过该模块进行模拟买卖交易,以及撤单。同时,可以

查看当日交割单等信息。 5、决策模块需求

该功能通过筛选各大机构的分析报告,给予用户更多投资信息,一边用户能够清晰的了解当前投

资机构的动向,以及把握市场的热门股。 6、股市资讯功能需求

该模块有新闻和直播两大类,用户通过该模块能够获得第一手股市讯息,实时关注股市动态,把

握出手时机。 7、设置功能需求

用户根据自身行为偏好、相关网络环境的变化等进行个性化设置,包行情刷新频率、涨跌颜色、

主题等等。

8

5 爱炒股软件系统设计

爱炒股手机软件的设计是集股票信息、资讯、模拟炒股于一体的基于IOS操作系统的一款手机应用软件。

5.1 爱炒股软件系统总体架构设计

图5-1 iStock系统功能架构

5.2自选股模块

自选股模块,用户可以自定义添加关注的股票,并查看该所的相关信息。 (1)添加、删除自选股; (2)按当前价格、涨跌幅排序;

(3)查看该股详细信息,包括基本信息和详细信息,基本信息有:股票当前价格、涨跌幅度、涨

跌幅百分比、今开、最高、最低、成交量、交易五档;详细信息有:今开、昨收、涨停、跌停、最高、最低、外盘、内盘、换手率、市盈率、振幅、市净率、成交量、成交额、流通值、总市值;

(4)快速下单交易:快买、快卖、快撤; (5)论股:实时更新该股最新帖子数据; (6)公告:企业相关公告及业绩报告;

(7)F10:包含该股公司的基本资料,财务数据,股东情况、财务评估; (8)分享功能:支持新浪微博、微信好友、微信朋友圈、短信等平台分享;

9

(9)查看该股日K、周K、月K线图;

(10)查看该股的个股新闻和该股所属的行业新闻。

图5-2 自选股界面 图5-3 自选股详情界面

图5-4 K线图 图5-5个股新闻

5.3大盘指数模块

大盘指数模块,提供市场主要指数信息,以及热门板块等。

(1)查看各个市场的主要指数,包括:上证指数、深证指数、道琼斯指数、纳斯达克、恒生指数、

10

日经指数、台湾加权、新加坡等主要指数;

(2)排行榜;应用中每个榜单中对前十条数据进行显示,点击更多按钮可获得更多排名; (3)涨停分析;位于涨停榜中,分析涨停榜中股票涨停原因,以及分析该股所属板块或者相关概

念;

(4)热门板块;提供当前走势最好的几大板块,点击更多板块即可查看更多板块相关指数; (5)股指:欧美指数、亚太指数、大宗商品、外汇市场、人民币牌价等。

图5-6 沪深指数及排行榜 图5-7 iStock系统功能架构

图5-8其他指数 图5-9 涨停分析

11

5.4我的账户模块

(1)我的账户:查看当前资产状况; (2)我的持仓:查看当前购买股票市值;

(3)投资收益:查看账户盈亏情况,以及当前购买股票盈亏; (4)交易记录:用户可通过时间段来进行查询交易记录。

图5-10 个人中心 图5-11 我的持仓

图5-12 投资盈亏 图5-13 资金明细

12

5.5 模拟委托交易模块

模拟市场进行交易,可以进行买入、卖出、撤单,以及查看我的持仓、当日委托、当日成交、查询资金、资金明细、股东资料等;

(1)买入:当输入购买股票代码时,自动填充该股所有信息,并结合模拟账户计算出可委托数量; (2)卖出:结合模拟账户,自动填充可卖数量;

(3)撤单:当买进股票时,竞卖价大于委托价格时,可撤单,即取消买进;当卖出股票时,竞买价小于委托价格时,可撤单;

(4)我的持仓:用户可查看当前账户买进的所有股票的余额、可用余额、冻结数量、市价、成本、盈亏值、盈亏比例、市值、股票代码、市场类别等信息; (5)当日委托:查看当日委托单; (6)当日成交:查看当日所有成交单;

(7)查询资金:快捷查询账户的币种类别、余额、可用、冻结、股票、资产等信息; (8)资金明细:查询所有交易中资金的动向;

(9)登录和退出:最初进入该模拟交易时,需进行登录,无账号可注册后登录。

图5-14 模拟交易界面 图5-15 买入操作界面

13

5.6决策模块

(1)个股报告:提供机构对某些个股的评级分析和投资指导意见等; (2)行业报告:提供机构对行业的评测分析报告; (3)机构晨报:投资机构每日推荐个股; (4)策略报告:投资机构投资策略建议。

图5-16 个股报告 图5-17 策略报告

5.7股市资讯模块

该模块通过以下6个小部分来呈现股市重要信息:

(1)股市要闻 (2)滚动新闻 (3)投资机会 (4)自选股新闻 (5)更多 (6)股市直播

14

图5-18 股票资讯界面一 图5-19 股票资讯界面二

5.8设置模块

(1)行情刷新频率设置:用户可分别设置在2G/3G/4G和WiFi下数据刷新的频率。设置可选项:非WiFi网络环境(不刷新、5秒、15秒、30秒和60秒)、WiFi网络环境(不刷新、5秒),默认均为不刷新;

(2)显示设置:用户可根据自身喜好及习惯,进行显示设置,设置选项有:红涨绿跌、绿涨红跌。默认为红涨绿跌;

(3)清楚缓存:缓存中的数据来源主要是走势图、K线图及微博登陆;

(4)切换主题:主题主要是对navigationBar的颜色设置,设置选项有:红色、蓝色,默认为红色; (5)夜间模式:提供用户在夜间使用习惯,降低亮度;

(6)开启指纹支付交易:该功能仅支持iPhone6、6Plus机型,当开启该功能后,在进行交易时,对交易信息的确定通过指纹来确定; (7)版本:版本号。

15

图5-20 设置界面 图5-21 行情刷新平率设置界面

6爱炒股软件系统实现

iStock应用1.0.4版本已成功上线至苹果AppStore应用商店,通过搜索关键词“iStock”、“模

拟炒股”即可搜索到。关于该应用的具体详细上线信息及下载地址详见附录二。

6.1 数据的抓取与解析

6.1.1 数据的抓取

应用中的数据主要来源于同花顺、新浪股票、和讯股票、自选股(腾讯)、雅虎等。这些数据来

源所返回的数据类型、格式也截然不同。应用中数据的抓包在mac环境下所使用的工具是paros。 (1)使移动端和电脑在同一个网段; (2)在移动端上设置HTTP代理,如图6-1;

(3)启动paros,设置Local Proxy中的Adress和Port,如图6-2; (4)然后运行移动端上程序即可看到数据包。

16

图6-1 数据抓取设置操作一 图6-2 数据抓取设置操作二 6.1.2 数据解析

(1)返回类型为字符串格式

以请求自选股模块中的数据为例,该接口来自于新浪股票,请求格式为: http://hq.sinajs.cn/list=市场+股票代码,市场+股票代码,?? 例如:http://hq.sinajs.cn/list=sz000001,sh601688,返回数据如下:

var hq_str_sz000001=\平安银

行,13.88,13.83,13.91,13.97,13.75,13.91,13.92,26392797,365850445,12000,13.91,87282,13.90,18800,13.89,77245,13.88,44377,13.87,94400,13.92,134301,13.93,248200,13.94,1051131,13.95,106360,13.96,2015-01-21,10:05:40,00\var hq_str_sh601688=\华泰证

券,21.99,21.21,22.04,22.11,21.58,22.04,22.06,84642718,1853499325,1100,22.04,30598,22.03,38600,22.02,81800,22.01,340147,22.00,500,22.06,78954,22.07,209000,22.08,152106,22.09,145240,22.10,2015-01-21,10:05:37,00\

有效数据为双引号中得内容,不同含义的数据用逗号隔开了。以平安银行(000001)为例:

17

表6-1 请求返回数据示例

序号 0 1 2 3 4 5 6 7 8 9 10 11 ?? 18 19 20 21 ?? 28 29 30 31 解析思路:

(1)将返回的数据进行编码转换,否则会出现乱码的情况; (2)通过分号“;”判断请求股票的个数,并通过分号将其隔开; (3)去掉多余的返回数据“var hq_str_”;

(4)将等号“=”转换成逗号“,”,并通过逗号再次将个股中得数据分割; (5)最后将分割号的数据逐个存到模型中。

关键代码如下:

内容 平安银行 13.88 13.83 13.91 13.97 13.75 13.91 13.92 26392797 365850445 12000 13.91 ?? 44377 13.87 94400 13.92 ?? 106360 13.96 2015-01-21 10:05:40 含义 股票名称 今日开盘价 昨日收盘价 当前最新价 今日最高价 今日最低价 竞买价 竞卖价 成交数量 成交金额 买一申股 买一报价 ?? 买五申股 买五报价 卖一申股 卖一报价 ?? 卖五申股 卖五报价 日期 时间 备注 “买一”报价 “卖一”报价 单位:股(使用时以单位:元(使用时以单位:股(下同) 18

- (void)dataParaing:(NSMutableData *)data{ //编码的转换

NSStringEncoding enc =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); //创建文字对象,定义为网站的回复内容

NSString *retStr = [[NSStringalloc] initWithData:data encoding:enc]; //判断自选股的个数

NSString *regExStr = @\;

NSString *StringForSearch = retStr; NSError *error = NULL;

NSRegularExpression *regex = [NSRegularExpressionregularExpressionWithPattern:regExStr options:NSRegularExpressionCaseInsensitiveerror:&error];

NSUInteger numberOfMatches = [regex numberOfMatchesInString:StringForSearch options:0range:NSMakeRange(0, [StringForSearch length])];

NSArray *retStrArray = [retStr componentsSeparatedByString:@\]; for (int i = 0; i < numberOfMatches; i ++) {

//定义回复的文字,把文字中的@\

retStr = [retStrArray[i] stringByReplacingOccurrencesOfString:@\withString:@\]; if (i == 0) {

retStr = [retStr substringFromIndex:11]; }else{

retStr = [retStr substringFromIndex:12]; }

NSArray* stockData = [NSArrayarrayWithArray:[retStr componentsSeparatedByString:@\]]; //创建临时的文字对象,定义为股票的数据内容

NSString* stockNumberTemp = [NSStringstringWithFormat:@\,[stockData objectAtIndex:0]]; NSString* stockNameTemp = [NSStringstringWithFormat:@\,[stockData objectAtIndex:1]]; NSString* stockCurrentTemp = [NSStringstringWithFormat:@\,[stockData objectAtIndex:4]]; //计算股票的升幅数据

double current = [[stockData objectAtIndex:4] doubleValue]; double lastDay = [[stockData objectAtIndex:3] doubleValue]; double different = current - lastDay;

double percent = different / lastDay * 100; ZMPStock *stock = [[ZMPStockalloc] init];

stock.stockName = [stockNameTemp substringFromIndex:1]; stock.stockCode = [stockNumberTemp substringFromIndex:2]; stock.stockPlate = [stockNumberTemp substringToIndex:2]; stock.stockCurrentPrice = stockCurrentTemp; stock.stockIndex = stockPercentTemp;

[_dataArrayaddObject:stock]; }

[_tableViewreloadData]; }

(2)返回类型为json格式

以请求大盘模块中排行榜中得数据为例,例如:

http://ifzq.gtimg.cn/appstock/app/mktHs/index?r=91509 返回数据如下:

19

{

\ \

\ {

\ \信托\ \ \ \

\ \陕国投A\ \ \ \ },?? ],

\ {

\ \ \中文\ \ \ \ \ \

},?? ],

\ {

\ \

\朗玛信息\ \ \ \ \ \

},?? ], ?? \}

以上数据是通过Jsaon软件调整布局后的结果。返回格式为json格式的数据类型都是非常规范的,所以解析起来并没有字符串的解析那样麻烦。

关键代码如下:

20

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ NSDictionary *dict =

[NSJSONSerializationJSONObjectWithData:_dataoptions:NSJSONReadingMutableContainerserror:nil]; //涨幅榜

NSMutableArray *zfbArray = [NSMutableArrayarray];

for (int i = 0; i < [dict[@\][@\] count]; i ++) { ZMPStock *stock = [[ZMPStockalloc] init];

stock.stockName = dict[@\][@\][i][@\]; stock.stockCode = dict[@\][@\][i][@\]; stock.stockIndex = dict[@\][@\][i][@\];

stock.stockCurrentPrice = dict[@\][@\][i][@\]; [zfbArray addObject:stock];

}

//跌幅榜

NSMutableArray *dfbArray = [NSMutableArrayarray];

for (int i = 0; i < [dict[@\][@\] count]; i ++) { ZMPStock *stock = [[ZMPStockalloc] init];

stock.stockName = dict[@\][@\][i][@\]; stock.stockCode = dict[@\][@\][i][@\]; stock.stockIndex = dict[@\][@\][i][@\];

stock.stockCurrentPrice = dict[@\][@\][i][@\]; [dfbArray addObject:stock]; }

//换手率榜

NSMutableArray *hslbArray = [NSMutableArrayarray];

for (int i = 0; i < [dict[@\][@\] count]; i ++) { ZMPStock *stock = [[ZMPStockalloc] init];

stock.stockName = dict[@\][@\][i][@\]; stock.stockCode = dict[@\][@\][i][@\]; //stock.stockIndex = dict[@\

stock.stockCurrentPrice = dict[@\][@\][i][@\]; stock.turnOverRate = dict[@\][@\][i][@\]; [hslbArray addObject:stock]; }

//振幅榜

NSMutableArray *zfBArray = [NSMutableArrayarray];

for (int i = 0; i < [dict[@\][@\] count]; i ++) { ZMPStock *stock = [[ZMPStockalloc] init];

stock.stockName = dict[@\][@\][i][@\]; stock.stockCode = dict[@\][@\][i][@\]; //stock.stockIndex = dict[@\

stock.stockCurrentPrice = dict[@\][@\][i][@\]; stock.amplitude = dict[@\][@\][i][@\]; [zfBArray addObject:stock]; }

[_dataArrayaddObject:zfbArray]; [_dataArrayaddObject:dfbArray]; [_dataArrayaddObject:hslbArray]; [_dataArrayaddObject:zfBArray]; [_tableViewreloadData]; }}

(3)返回类型为xml格式

在爱炒股软件中,大多数的股讯信息都是xml格式,以股讯板块中得要闻为例,请求连接为:http://news.10jqka.com.cn/headline_mlist/1_0_1_1/,返回数据如下:

21

101 6 1 569968214 <![CDATA[ 李克强:中国经济正向着形态更高级阶段演进 ]]> …… ……

关键代码如下:

22

- (void)loadData:(NSString *)url{

//所有的请求都需要AFHTTPRequestOperationManager发送请求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager]; //返回数据类型为二进制

manager.responseSerializer = [AFHTTPResponseSerializerserializer];

//get请求

[manager GET:url parameters:nilsuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

[self.headerendRefreshing]; [self.footerendRefreshing]; if (flag) {

[_dataArrayremoveAllObjects]; } GDataXMLDocument *xml = [[GDataXMLDocumentalloc] initWithData:responseObject options:0error:nil];

NSArray *news = [xml nodesForXPath:@\error:nil]; //NSLog(@\

int i = 0;

for (GDataXMLElement *element in news) {

NSArray *title = [element nodesForXPath:@\error:nil]; NSArray *time = [element nodesForXPath:@\error:nil]; NSArray *imgurl = [element nodesForXPath:@\error:nil];

NSArray *url = [element nodesForXPath:@\error:nil];

ZMPImportantNewsTableViewCellNews *news = [[ZMPImportantNewsTableViewCellNewsalloc] init]; news.newsImageUrl = [imgurl[0] stringValue]; news.newsTitle = [title[0] stringValue]; news.newsTime = [time[0] stringValue]; news.newsUrl = [url[0] stringValue];

if (i >0) {

[_dataArrayaddObject:news]; } i ++; }

[_importantNewsTableViewreloadData];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@\请求失败%@\,error); }]; }

23

6.2数据的请求及刷新

6.2.1 数据的请求

在iStock应用中,数据的请求操作是通过GET请求完成,即通过URL的方式请求获取相关数据。

为了用户有着良好的体验效果,主要通过异步请求的方式。关键代码:

NSString *urlStr = [NSStringstringWithFormat:@\,tempStr]; //请求对象

NSURLRequest *request = [NSURLRequestrequestWithURL:[NSURLURLWithString:urlStr]]; [NSURLConnectionconnectionWithRequest:request delegate:self];

通过NSURLConnection类来实现数据的异步加载操作,获取的数据需要在代理的方法中进行实现。

另外,为了增强用户的体验性,需要对加载做一个时间设定,通过request的一个属性timeoutInterval来实现,例如:

request.timeoutInterval = 15.0;//请求时间限制

在设置后,如果请求数据超过该设定时间,程序就会进入到connection:(NSURLConnection *)connection didFailWithError:(NSError *)error这个方法中。关键代码:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ _data.length = 0; }

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ [_dataappendData:data]; }

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ [selfdataParaing:_data]; }

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ [KVNProgressshowErrorWithStatus:@\请求数据失败\]; }

6.2.2 NSTimer定时刷新

NSTimer主要用在自选股数据的刷新,通过设置刷新频率来控制其请求数据的次数。考虑到在2G

网的状态下,网络请求数据相对较慢,会对用户的体验造成一定的影响,所以默认刷新频率设置为不刷新。

当设置其刷新频率为5s、15s、30s、60s时,通过全局变量refershFrequencyWithOutWifi和

refershFrequencyWithWifi进行控制。

24

/**

2G/3G/4G网下得刷新频率 */

@property (nonatomic,assign) int refershFrequencyWithOutWifi; /**

在WiFi下得刷新频率 */

@property (nonatomic,assign) int refershFrequencyWithWifi;

当改变其刷新频率时,不能只是简单地进行赋值操作,而是首先判断是否有计时器timer在线程

中,如果在那么需要将其置为nil后,才能进行赋值操作。 关键代码:

//先用isValid先判断是否还在线程中 if ([timerisValid] == YES) { [timerinvalidate]; timer = nil; }

//刷新频率等于0,表示不刷新

if (app.refershFrequencyWithOutWifi != 0) { //定时刷新 timer =

[NSTimerscheduledTimerWithTimeInterval:app.refershFrequencyWithOutWifitarget:selfselector:@selector(loadData) userInfo:nilrepeats:YES]; }else{

[timerinvalidate]; timer = nil;

NSLog(@\停止刷新\); }

当然,如果当前页面消失后,NSTimer依然存留在线程中,这固然是不好的,所以当页面消失时

将NSTimer进行暂停或者关闭,当页面即将出现时,再将其开启,这也对线程的一种优化,提升应用的运行效率。 关键代码:

- (void)viewDidDisappear:(BOOL)animated{ [superviewDidDisappear:animated];

[timersetFireDate:[NSDatedistantFuture]]; }

- (void)viewWillAppear:(BOOL)animated{ [superviewWillAppear:animated];

[timersetFireDate:[NSDatedistantPast]]; [_tableViewreloadData]; }

25

6.3数据库

6.3.1 数据库表 1、AStocklist

表6-2 股票表

属性 id code name pinyin market 2、TradingAccount

表6-3 账户表

属性 accountNumber password initialMoney yueMoney keyongMoney dongjieMoney gupiaoMoney zichanMoney bundlePhoneNumber 3、ChiCangTable

表6-4 持仓表

属性 stockName stockCode yueAmount keyongAmount dongjieAmount marketPrice cost 类型 Text Text Integer Integer Integer Float Float 说明 股票名称 股票代码 余额 可用数量 冻结数量 市场价格 成本价格 类型 Text Text Float Float Float Float Float Float Text 说明 用户名 登陆密码 初始金额 剩余金额 可用资金 冻结资金 股票资产 总资产 绑定号码 类型 Integer Text Text Text Text 说明 股票ID 股票代码 股票名称 股票拼音 市场 26

profitAndLoss profitAndLossPrecent marketValue gudongNumber marketSegment dealTime 4、HistroySearch

Float Float Float Text Text Text 盈亏 盈亏比 市场价值 股东账号 市场 交易时间 表6-5 持仓表

属性 code name pinyin market 5、OptionalStock

表6-6 自选股表

属性 stockCode stockName stockPlate 6、TradingRecordTable

表6-7 交易记录表

属性 tradingTime tradingSummary tradingMoney totalMoney tradingAccount 7、WeiTuoTable

表6-8 委托表

属性 isCancel way price 类型 Bool Text Float 说明 是否可撤 委托方式(买/卖) 委托价格 类型 Text Text Float Float Text 说明 成交时间 成交内容 成交金额 总资产 交易账户 类型 Text Text Text 说明 股票代码 股票名称 市场 类型 Text Text Text Text 说明 股票代码 股票名称 股票拼音 市场 27

amount money stockName stockCode gudongNumber marketSegment status time 6.3.2 数据库的单例实现

Integer Float Text Text Text Text Text Text 委托数量 委托金额 股票名称 股票代码 股东账户 市场 成交状态 委托时间 在对数据库中的数据中进行操作时必须保证每次操作完成后才能进行下一次的操作,所以该类只

能有一个实例,所以需要使用单例,通过它封装一个共享的资源,提供一个固定的实例创建方法及一些实例访问的接口。关键代码如下:

+ (ZMPDatabase *)shareInstance{ @synchronized(_zmpDatabase){ if (!_zmpDatabase) {

_zmpDatabase = [[ZMPDatabasealloc] init]; } }

return_zmpDatabase; }

6.4数据的存储

6.4.1图片的缓存处理

iStock应用中有大量的图片数据,这些都是比较耗流量的,因此为了用户着想必须对图片进行缓

存处理。通过SDWebImage第三方库来处理图片缓存。SDWebImage首先会更根据URL在本地缓存中查找图片,如果该图片存在就通过回调机制来显示图片;如果该图片不存在,那么它将会根据URL地址进行下载,由 NSURLConnection 来做异步下载,实现相关的delegate 代理方法来判断图片下载中、下载完成和下载失败所处状态。在connection:didReceiveData: 该方法中利用 ImageIO 可以实现图片加载效果之类的特效。在connectionDidFinishLoading: 该代理方法中判断图片数据全部下载完成之后交给SDWebImageDecoder进行图片的解码处理。图片解码处理在一个 NSOperationQueue完成,并不会影响主线程 UI,而造成的卡顿现象。 6.4.2用户信息的缓存

用户登录有两种方式,一是通过本地注册后登录;二是直接通过微博账号登录。用户通过本地注

[1]

28

册的方式进行登录时,通过userDefault来对用户的信息进行存储。用户通过第二种方式登录时,使用Parse第三方库自动对用户的信息进行一段时间的缓存。

//将登录用户信息存储到本地

NSUserDefaults *ud = [NSUserDefaultsstandardUserDefaults];

[ud setObject:app.user.userNameforKey:@\] [ud synchronize];

//读取用户信息

NSUserDefaults *ud = [NSUserDefaultsstandardUserDefaults]; ZMPUser *user = [[ZMPUseralloc] init];

user.userName = [ud objectForKey:@\];

6.4.3交易数据的存储

当用户进行模拟交易时会产生大量数据,例如交易股票价格、数量、成交时间等等,该类数据主

要以数据库的存储方式进行存储。通过第三方框架FMDB对数据库进行读写操作,并封装成方法(插入、删除、修改、读取等),主要有以下几类操作方法:

+ (SimpleDatabase *)sharedInstance;

- (BOOL)insertIntoDatabase:(NewsModel *)model; - (BOOL)deleteFromDatabase:(int)newsId;

- (BOOL)updateDatabase:(NewsModel *)model; - (NSMutableArray *)selectFromDatabase; - (void)closeDatabase;

6.5 数据安全

6.5.1 MD5加密实现

在iOS开发过程中,为了保证数据的安全,通常会进行一些加密操作,比如DES加密、MD5加密

等。DES加密是可逆的,MD5加密目前来说一般是不可逆的。

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致,是计

[3]

算机广泛使用的杂凑算法之一。在iStock应用中,对用户的信息进行加密后存储。MD5加密算法最终产生128bit固定长度,而在实际的应用开发中,通常是以16进制输出的,即产生32位16进制的字符。在随机产生的字符中大小写混杂在一起,之后可对其进行二次处理来产生32位大写或者小写字符串。

关键代码如下;

29

+ (NSString *)md5HexDigest:(NSString*)password {

constchar *original_str = [password UTF8String]; unsignedchar result[CC_MD5_DIGEST_LENGTH]; CC_MD5(original_str, strlen(original_str), result); NSMutableString *hash = [NSMutableStringstring];

for (int i = 0; i

X是格式控制符:‘x’表示以16进制输出,‘02’表示不足两位,前面补0; */

[hash appendFormat:@\, result[i]]; }

NSString *mdfiveString = [hash lowercaseString]; NSLog(@\加密结果:%@\,mdfiveString); return mdfiveString; }

6.5.2 指纹识别

iStock项目中,在进行委托交易时,通过指纹来确定是否交易。模拟现实中的安全交易模式。如

图6-3和图6-4。

图6-3 指纹确定交易开启按钮 图6-4 指纹确定交易

关键代码如下:

30

LAContext *myContext = [[LAContext alloc] init]; NSError *authError = nil;

NSString *myLocalizedReasonString = @\请输入指纹\;

if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) { [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:myLocalizedReasonString

reply:^(BOOL success, NSError *error) { if (success) { // 验证成功

} else { //验证失败

} }]; } else { // 设备不支持 }

6.6 通知

目前,在市场上的大多数移动应用软件中当前都只有一个应用程序是处于相对活跃状态的,那么

想要其他的应用能够在当前发生某些事情以激发用户的兴趣,需要使用的便是通知机制。在iOS系统平台中又将通知机制称作消息机制,iStock应用中运用到两种通知机制,一种是本地通知,另一种是远程推送通知。这两类通知都可以通过横幅或者弹出提醒的形式推送到用户的手机屏幕上,当用户点击该通知信息时,即可触发相应的事件,比如最普通的打开应用,或者打开应用后处理某些事情等等。 6.6.1 本地通知

本地通知是由本地应用触发而产生的,它是某一特定触发事件引起的一种通知形式。当应用长期

不使用时,在应用中设定时间然后进行消息的推送,同样属于本地听通知。实现本地通知的推送主要有以下几步:

1、创建UILocalNotification; 2、配置相关参数;

3、设置通知的主体、声音、角标等; 4、自定义参数的相关设置; 5、调用通知。

在iStock项目中,使用的是腾讯信鸽,它将本地通知和推送通知进行了集成。本地推送的关键代

码如下:

31

//推送通知

NSDate *fireDate = [[NSDatenew] dateByAddingTimeInterval:5];

NSMutableDictionary *dicUserInfo = [[NSMutableDictionaryalloc] init]; [dicUserInfo setValue:@\forKey:@\]; NSDictionary *userInfo = dicUserInfo;

NSString *message = [NSStringstringWithFormat:@\成交!买入%@(%@),成交金额%.2f元\,stockDeal.stockName,stockDeal.stockCode,stockDeal.delegateDealMoney];

[XGPushlocalNotification:fireDate alertBody:message badge:1alertAction:@\确定%userInfo:userInfo];

如图6-5,为交易成功后,进行的本地通知。

图6-5 本地通知

图6-6 推送通知

6.6.2 远程推送通知

远程推送通知是由应用服务提供商发起的,通过苹果的APNs(Apple Push Notification Server)

发送到应用客户端。在服务器与用户手机之间会形成一条连接链路。远程推送的消息即通过该链路而实时送达用户的手机上。

图6-7 供应商向客户端远程推送示意图

如图6-7中的远程推送示意图可看到,首先由应用服务提供商从服务端把要发送的消息和token发送给APNs,然后APNs根据设备token在已注册的设备查找对应的设备,将消息发送给相应的设备,

[2]

32

最后客户端设备接将接收到的消息传递给相应的应用程序,应用会根据用户设置的方式来弹出通知消息,从而引导用户操作。

图6-8 远程推送细化流程图

以下是实现远程推送的详细步骤:

1、应用程序要注册APNs推送消息(首先需要配置好provisioning profile文件信息); 2、移动端从APNs接收token; 3、应用将token发送到服务器;

4、当应用服务提供商需要进行消息推送时,服务器将信息发送给APNs; 5、APNs根据token查找已注册的设备进行推送消息。

在iStock应用中通过使用腾讯信鸽成功进行远程推送消息,客户端收到推送消息如图6-6显示。 关键代码如下:

[2]

33

- (void)registerPushForIOS8{ ?? }

- (void)registerPush{

[[UIApplicationsharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; }

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{ //notification是发送推送时传入的字典信息

[XGPushlocalNotificationAtFrontEnd:notification userInfoKey:@%userInfoValue:@\]; //删除推送列表中的这一条

[XGPushdelLocalNotification:notification]; }

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

NSString * deviceTokenStr = [XGPushregisterDevice:deviceToken]; void (^successBlock)(void) = ^(void){ //成功之后的处理

NSLog(@\,deviceTokenStr); };

void (^errorBlock)(void) = ^(void){ //失败之后的处理

NSLog(@\); }; //注册设备

[[XGSettinggetInstance] setChannel:@\]; [[XGSettinggetInstance] setGameServer:@\巨神峰\];

[XGPushregisterDevice:deviceToken successCallback:successBlock errorCallback:errorBlock]; }

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo {

//推送反馈(app运行时)

[XGPushhandleReceiveNotification:userInfo]; }

6.7模拟交易实现过程

为了更加真实的模拟股票交易的过程,添加了撤单功能。在买入或卖出时,首先进入挂单状态,

在未成交的状态时,用户可以随时撤单,即取消该交易。而当该单自动成交后,用户便不能撤单。同时,为了模拟显示交易时数据的安全,增加指纹交易功能,该功能可在设置中进行开启或者关闭。

34

/

图6-9 模拟交易过程图

6.7.1 买入

用户进入买入界面输入股票的代码后,会自动加载该股票的名称、当前价格、五档挂单数据、涨

跌停价格、上证深成指数以及用户当前账户以当前股票价格所能购买的最大数量。

在用户输入买入数量后,系统会对该数据进行判断,判断条件为: 1、必须为100的整数倍; 2、必须小于可买数量。

同时,在修改委托价格时,为了避免用户的不小心而导致委托价格远偏离当前价格,在用户修改

委托价格后,在一定的时间内,系统会自动刷新该数据。以及委托数量为空或者股票代码为空时,都不能进行买入。用户在正常交易流程下点击买入按钮后,系统将该条买入信息添加至数据库中,并在后台新开辟线程进行实时刷新该股数据。在达到成交条件后,系统将自动进行交易,并且在交易成功后进行本地推送通知。

关键代码如下:

35

if ([stockDeal.dealWayisEqualToString:@\买入\]) {

if ([stockCurrentTemp floatValue] <= stockDeal.delegateDealPrice) { //成交

stockDeal.isCancel = NO;

BOOL success =[_databaseupdataStatusFromWeiTuoTableByStockDeal:stockDeal]; if (success) {

NSDateFormatter *formatter = [[NSDateFormatteralloc] init];

[formatter setDateFormat:@\];

stockDeal.dealTime = [formatter stringFromDate:[NSDatedate]]; stockDeal.yueAmount = stockDeal.delegateDealAmount; stockDeal.keyongAmount = stockDeal.yueAmount; stockDeal.dongjieAmount = 0;

stockDeal.cost = stockDeal.delegateDealPrice; nUseMoney -= stockDeal.cost * stockDeal.keyongAmount;

[_databaseupdataCanUseMoneyFromTradingAccountByUser:_user]; //添加到持仓表中

[_databaseinsertStockIntoChiCangTable:stockDeal]; //1.获取用户的股票余额

NSMutableArray *arr = [_databaseselectStockFromChiCangTableByAccountName:_user.userName]; float temp = 0;

for (int i = 0; i < arr.count; i ++) { ZMPStockDeal *s = arr[i];

temp += s.yueAmount * s.cost; } _user.stockMoney = temp; //2.得到交易发生时的资金总额

_user.totalMoney = _user.stockMoney + _user.canUseMoney; //3.将数据插入到交易记录表中

ZMPTradingRecord *tradingRecord = [[ZMPTradingRecordalloc] init]; tradingRecord.tradingTime = stockDeal.dealTime;

tradingRecord.tradingSummary = [NSStringstringWithFormat:@\买入%@\,stockDeal.stockName];

tradingRecord.tradingMoney = stockDeal.delegateDealMoney; tradingRecord.totalMoney = _user.totalMoney; tradingRecord.tradingAccount = _user.userName;

[_databaseinsertIntoTradingRecordTable:tradingRecord]; //推送通知

NSDate *fireDate = [[NSDatenew] dateByAddingTimeInterval:5];

NSMutableDictionary *dicUserInfo = [[NSMutableDictionaryalloc] init]; [dicUserInfo setValue:@\forKey:@\]; NSDictionary *userInfo = dicUserInfo;

NSString *message = [NSStringstringWithFormat:@\成交!买入%@(%@),成交金额%.2f元\,stockDeal.stockName,stockDeal.stockCode,stockDeal.delegateDealMoney];

[XGPushlocalNotification:fireDate alertBody:message badge:1alertAction:@\确定%userInfo:userInfo]; } } }

36

6.7.2 卖出

卖出交易过程大致与买入过程相同。在进入卖出界面,用户输入持仓股票中的股票代码后,系统

从数据库中获取该股交易的详细数据后显示,包括可买数量。同时,对该股当前的详细信息发送Get请求。在用户正常情况下进行卖出后,系统同样将该单挂入委托单中,只不过此时该单的状态为卖出。在后台新开辟线程进行实时刷新该股数据。在该应用中采用Thread方式进行多线程编程,与NSOperation和GCD相比,线程的管理、线程锁的设置与释放等都需要手动实现。多线程的实现关键代码如下:

#pragma mark - 开辟新线程 //创建新的线程

NSThread *thread = [[NSThreadalloc] initWithTarget:selfselector:@selector(newThread) object:nil]; [thread start]; - (void)newThread{ @autoreleasepool{

//在当前Run Loop中添加timer,模式是默认的NSDefaultRunLoopMode

[NSTimerscheduledTimerWithTimeInterval:3.0target:selfselector:@selector(usernameIsExist:) userInfo:nilrepeats:YES];

//开始执行新线程的Run Loop,如果不启动run loop,timer的事件是不会响应的 [[NSRunLoopcurrentRunLoop] run]; } }

6.7.3 撤单

撤单也是在真实股票交易过程中一个比不可少的操作,在该模拟软件中同样包含撤单操作。进入

撤单界面后,页面中出现的数据代表处于委托单中的数据。在“是否可撤”栏中,显示“是”表明可撤,显示“否”表明不可撤。出现“否”的原因是,该股已经达到交易条件,系统在后台便以成交,同时修改其状态为不可撤状态。关键代码如下:

#pragma mark - 撤单操作

- (void)cancelTrading:(NSNotification *)notification{

ZMPStockDeal *stockDeal = [_canCancelTradingArrayobjectAtIndex:[notification.objectintegerValue]]; stockDeal.isCancel = NO;

BOOL success = [_databaseupdataStatusFromWeiTuoTableByStockDeal:stockDeal]; NSString *message = nil;

if (success) {message = @\撤单成功\; }else{message = @\撤单失败\;} [selfdisplayAlertView:message]; }

37

6.8资产组合风险计算

iStock应用内嵌组合投资算法,用户通过输入组合投资的股票,计算相关参数指标来对该组合进

行评估,利用那个马科维茨模型寻找该组合中风险最小的组合。 6.8.1 相关参数

1、单只股票的预期收益和风险特征

根据不同的经济状况,对股票的未来收益都将出现不同的估计,由于市场经济的不确定性,将取

出股票在最近两年至三年的时间内的平均月收益率作为预期收益率:

1nE(x)=?xi (6-1)

ni=1其中xi为月收益率。将预期收益的方差作为衡量该股风险的标准,其计算公式为:

1n???(xi?x)2 (6-2)

ni?12方差的平方根为标准差,方差越大,意味着随机变量与数学期望的偏离越大,那么风险也就越大。 2、单只股票对系统风险的敏感系数

衡量了某种证券收益率的变化受市场收益率的变化的影响程度,市场的值用1个单位来表示。

[4]

当b>1时,表明该股票的波动幅度大于整个市场的波动浮动,即当市场的收益率变动一个单位时,该股票的收益率会向相同的方向变动大于一个单位,把具有这种性质的股票称为进攻型股票。相反

b<1,表明为防守型股票。

b=cov(ra,rm)s2m (6-3)

2其中,cov(ra,rm)表示该股收益率与市场收益率的协方差,sm表示市场方差。

3、资产组合的方差及预期收益率

资产组合中所有资产预期收益率的简单加权平均值构成资产组合的预期收益率,

E(rp)=?xiE(ri) (6-4)

i=1n其中xi为各股票在资产组合中所占的权重比。资产组合的简单方差计算公式为:

222?p??p?m???2 (6-5)

p其中,

????xi2??2 (6-6)

2pni?1i2 (6-7) se2=si2-bi2smi 38

式(6-7)中,计算得出的se为股票的残差。

i24、资产组合的实际马柯维茨方差

P=?xs+?2p2i2ii=1nni=1j=1,j1i?xxinjcov(xi,xj) (6-8)

其中cov(xi,xj)表示股票i和股票j之间收益率的协方差,也就是在计算马科维茨方差之前,需要计算出资产组合中股票收益的协方差矩阵。

马柯维茨的组合投资模型中,数学期望代表预期收益,方差或标准差代表风险,协方差代表资产

之间相互关系,进而资产组合的预期收益率是资产组合中所有资产预期收益的简单加权平均值,而资产组合的方差则为资产各自方差与他们之间协方差的加权平均。 6.8.2 实现算法

确定资产组合中马科维茨方差的最小值首先需要计算出构成该组合资产的每一单个资产的收益

[5]

率、风险及各股票资产之间的相互关系(协方差),然后计算该组合资产的预期收益率和风险。在该基础上,依据用户的投资偏好而所选择的股票构成的资产组合,计算出最小马柯维茨方差,以及此时的各资产的权重比。在iStock应用中,如图6-10和图6-11,分别是资产组合的用户输入界面和资产组合后结果处理界面。

图6-10 资产组合输入界面 图6-11 资产组合处理结果界面

寻找最小马柯维茨方差的权重数的具体算法如下:

1、通过各股票的收盘数据,选取2013-2014年中的24组数据来计算月平均收益率; 2、将月平均收益率假设为期望收益率,进一步计算各股票的方差和标准差;

39

3、按照同样的方法计算市场预期收益率和市场方差;

4、通过计算市场收益率和各股票收益率的协方差后,与市场方差的比值,得出个股票的贝塔系数值;

5、个股票的方差与贝塔系数的平方乘以市场方差的差值而得出每只股票的残差;

6、计算个股票之间的预期收益率的协方差矩阵,结合个股票的权重数,从而计算得出资产组合的实际马科维茨方差值;

7、最后通过不断改变权重比,利用选择排序的思想遍历找到出最小的马科维茨方差值以及相应的权重比。

在应用测试中,选择三只股票进行资产组合,江淮汽车(600418)、中国石化(600028)、华泰

证券(601688)。在选取股票进行资产组合时,选择收益呈负相关的股票进行组合,收益呈负相关的股票组合能够有效分散风险。选择以上样本股票在2013、2014两年的数据进行分析计算。

表6-9 各股和大盘的数据统计表

月平均收股票名称 江淮汽车 中国石化 华泰证券 上证指数

股票代码 600418 600028 601688 000001 益率 0.033088 0.001209 0.045757 0.013541 方差 0.021089 0.014443 0.025651 0.003965 标准差 0.145221 0.120180 0.160158 0.062967 贝塔 0.992217 1.288840 2.137524 1 最终通过(6-8)式计算得出资产组合的马科维茨方差,然后进行遍历,计算出马柯维茨方差最小

时所得到的权重数。计算结果如下表:

表6-10 资产组合计算结果

计算项目 最小马科维茨方差时的权重 组合资产的贝塔值 组合资产的预期收益率 组合资产的最小马科维茨方差

计算值 0.33、0.52、0.15 1.318257 1.8411% 0.010252 为了验证该算法的实际正确性,选取2015年1-3月之间个股票的数据来进行对比计算,如下表:

表6-11 2015年1-3月个股票实际收益率

股票名称 股票代码 江淮汽车 中国石化 华泰证券 600418 600028 601688 一月 0.040563 -0.070878 -0.138128 二月 三月 平均收益率 0.085393 0.000103 0.055767 0.164526 0.051090 0.056856 0.014331 0.128684 0.176746 经计算,按照最小马柯维茨方差得到的权重比来计算出的资产组合2015年1-3月之间的实际收益

率为0.012201,较组合资产的预期收益率低七个百分点。按照最小马柯维茨方差而得到的权重比进行

40

投资组合所得到的组合资产的风险是最小的,而收益并不是最大的。因为风险越高,收益越大。 6.8.3 关于该算法的实际不确定性

1、该算法是建立在假设月平均收益率作为预期收益率的基础之上的,而实际的预期收益率是结合该股票对市场收益率波动的敏感度即贝塔值,以及该股票独立于市场波动的值,综合计算得出; 2、关于贝塔值的预测能力问题

表6-12 个资产组合贝塔值的相关系数

资产组合中资产的数量 1 3 4 7 10 20 35 50

相关系数 0.60 0.73 0.84 0.88 0.92 0.97 0.97 0.98 判定系数是相关系数的平方,由表6-12可看出,对单只股票来说,贝塔值得预测能力比较差,在

相关系数为0.6时,历史贝塔值只能反映未来贝塔值的36%。而在资产组合组件增大的情况下,贝塔值得预测能力才有所改善。

3、在实际中,计算马科维茨方差是比较困难的。当组合资产中的股票数量n逐渐增大时,各股票之间的协方差矩阵也在以n的平方在增加,所以这导致该应用中组合投资的股票数量有一定的限度。

关键代码如下:

41

#pragma mark – 获取数据并封装

NSString *content = [[NSStringalloc] initWithData:_data_marketencoding:NSUTF8StringEncoding]; NSLog(@\大盘content.lenght=%ld\,content.length);

NSArray *lines = [content componentsSeparatedByCharactersInSet:[NSCharacterSetnewlineCharacterSet]]; NSLog(@\大盘lines.lenght=%ld\,lines.count); if (lines.count

NSLog(@\数据加载失败\);

[KVNProgressshowErrorWithStatus:@\数据加载失败\]; flag = NO; return; }

[_dataArray_marketremoveAllObjects]; _dataArray_market = [selfchangeData:lines]; #pragma mark - 计算月平均收益值 double sum = 0.0;

for (int i = 0; i <_dataArray_market.count; i ++) { NSArray *item = _dataArray_market[i];

double income = ([item[4] doubleValue] - [item[1] doubleValue]) / [item[1] doubleValue]; [_incomeArray_marketaddObject:[NSStringstringWithFormat:@\,income]]; sum += income; // NSLog(@\ } //期望回报率

avgValue_market = sum / (double)_dataArray_market.count; #pragma mark - 计算方差及标准差

for (int i = 0; i <_dataArray_market.count; i ++) {

sum += ([_incomeArray_market[i] doubleValue] - avgValue_market) * ([_incomeArray_market[i] doubleValue] - avgValue_market); }

variance_market = sum / _incomeArray_market.count; standardDeviation_market = sqrt(variance_market);} #pragma mark - 计算贝塔值

for (int i = 0; i <_incomeArray_market.count; i ++) {

sum += ([_incomeArray_stock1[i] doubleValue] - avgValue_stock1) * ([_incomeArray_market[i] doubleValue] - avgValue_market); }

NSLog(@\股票1收益与市场收益的协方差=%f\,sum / (_incomeArray_market.count - 1)); beta = sum / (_incomeArray_market.count - 1) / variance_market;} #pragma mark - 遍历权重,寻找最小马科维茨方差 double Min = 1;

for (int i = 0; i <= 100; i ++) { for (int j = 0; j <= 100- i; j ++) { int k = 100 - i - j;

double vm = (i * i * V1 + j * j * V2 + k * k * V3 + 2 * i * j * C12 + 2 * i * k * C13 + 2 * j * k * C23) / 10000.0; if (Min > vm) {

Min = vm;

index = [NSStringstringWithFormat:@\,i,j,k]; } }

42

7系统测试

7.1 兼容性测试

该应用需要iOS7.1或更高版本。与iPhone、iPad。iPod touch兼容,已针对iPhone5、iPhone6

和iPhone6 Plus优化。

表7-1 兼容性测试

iPhone4s iPhone5 iPhone5s iPhone6 iPhone6 Plus iOS6.0 × × × × × iOS7.0 √ √ √ × × iOS8.0 √ √ √ √ √ 7.2 性能测试

对爱炒股软件的性能测试,主要对其做了快速启动测试和Activity Monitor测试。

1、快速启动测试(网络稳定的情况)

快速启动测试主要是以使用Instruments中的TimeProfile来分析软件启动时的CPU消耗,并且

以消耗CPU的数据为依据进行优化。从下图中,可以看到按炒股软件在整个启动过程中总共耗时537.0毫秒,其中最主要的耗时部分为: - (BOOL)application:(UIApplication *)

applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions该函数。在该方法中,生成当前UI以及对系统进行相关的全局设置等操作。

图7-1 快速启动测试结果

43

2、Activity Monitor测试

Activity Monitor会监控测试对象的运行环境,记录CPU、内存和I/O的一些指标,用于对比分

析。在监控运行中可以得到当前时刻的CPU占用率、实际内训和虚拟内存等信息。同时使用Activity Monitor可以进行多次运行结果对比,以此来对比当前运行结果和之前运行结果的差异。将爱炒股软件移植到手机,连接手机至Mac上,通过Activity Monitor测试爱炒股.app,测试结果如下图: 在1分20的测试时间内,其CPU暂用率为15%,占用时长为1分06秒。

图7-2 CPU和内存使用率概要图

7.3 稳定性测试

稳定性测试涉及硬件平台、软件系统和具体的应用程序。在iOS测试领域中,猴子测试被作为稳

定性测试的主要手段。该测试所使用的测试脚本来源于:https://github.com/douban/ynm3k/blob/master/robot4ios/util/iOSMonkey2.js。猴子测试即像猴子一样随意的没有规律的操作应用程序,其在每个操作后都做了截图保存,并且输出了被操作空间所有的父空间,因此,可以根据截图和空间之间的关系,很快的定位到问题。

正因为猴子测试是随意没有规律的操作应用程序,那么该测试花费的时间也较长,以下为爱炒股

软件经过稳定性测试后的结果,尚未出现崩溃的情况。

44

图7-3 猴子测试结果

8 总结

该应用包含自选股、大盘指数、我的帐户、模拟委托交易、决策、股票资讯和设置七大模块,基本实现模拟交易功能,具有新浪微博、微信好友、微信朋友圈等社交平台的分享功能,能够实现远程推送通知,同时实现资产组合最小马科维茨方差算法。应用中使用XIB和代码混合的方式设计UI界面,运用MVC模型视图控制器设计模式,使用通知、代理、单例等传值方式,通过数据库、NSUserDefault进行数据的存储,以异步数据加载和多线程的编程方式提升应用的运行效率和用户的使用体验。开发过程中对应用版本控制做了良好的记录,详情可见附录三。iStock1.0.4版已成功上线至苹果AppStore应用商店,该应用需要iOS7.1或更高版本。与iPhone、iPad、iPod touch兼容,已针对iPhone5、iPhone6和iPhone6 Plus优化。

iStock应用针对的用户群体为刚接触股市或者准备接触股市的特定群体,iStock 的模拟炒股和资产组合分析计算能够有效的帮助该群体迅速了解真实股票交易流程以及增加选股交易的经验。在后续的迭代开发中,将进一步完善模拟交易的功能,使之与真实交易更加吻合,以及不断验证马科维茨资产组合模型在实际运用中的正确性,并不断地优化算法。 参考文献

[1] zhun36. SDWebImage缓存图片的机制[EB/OL].http://blog.csdn.net/zhun36 /article/details/8900327, 2013/5/8.

45

[2] iOS Developer Library. Apple Push Notification Service[J/OL].https://develo per.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW9,2015/3/9. [3] xn4545945. MD5加密与网络数据安全[EB/OL].http://blog.csdn.net/xn4545. 945/article/details/36755117, 2014/7/4.

[4] 万楚军. 论股票投资组合的风险收益及组合策略[J]. 长江大学学报,2005:95-97. [5] 吴晓求. 证券投资学[M]. 北京:中国人民大学出版社,2008:350-370. [6] 甄伟丽,何琪. 股票投资组合案例分析[J]. 当代经理人,2006:1543-1544. [7] Activity Monitor for iOS Using Instruments in Xcode[J/OL].http://www.podf eet.com/blog/tutorials-5/activity-monitor-for-ios-using-instruments-in-xcode/. [8] 芈军. iOS测试指南[M]. 北京:电子工业出版社.2014. [9] 王浩. iOS应用开发最佳实践[M]. 北京:电子工业出版社.2013.

46

The Development of Application Based on iOS Platform(iStock)

ZHANG Min-peng 105032011126 Advisor:HUANG Xin-yi

Major in Computer Science and Technology College of Mathematics and Computer

Science

【Abstract】Now in an economy is the rapid development of society, more and more people began to invest to the financial market. Between the ignorant and real, iStock Application Software has been come. This app is IOS operating system of a mobile phone application software based on the set of stock information, stock market simulation in one. Using of asynchronous loading, single case, notice, such as the current popular technology of MVC and so on. It gives people a more authentic experience, let you get along well with the stock market. It included Investment decision, portfolio, in order to lay the foundation for combating. And it also included WeiBo Login, and it can use WeChat circle of friends to share, let more people to pay attention to this field of the wise, the brave war game. In setting the bar, you could be more personalized. Because the remote push, so you are not a person in battle, we pay attention to changes in the market together. 【Keywords】iStock; Application; Software; iOS

47

附录一:数据接口

1、单个股票:http://hq.sinajs.cn/list=sh601688(来自新浪)

2、多个股票:http://hq.sinajs.cn/list=sh601003,sh601001(来自新浪) 3、大盘指数查询接口:

(1)上证指数:http://hq.sinajs.cn/list=s_sh000001 (2)深证指数:http://hq.sinajs.cn/list=s_sz399001 (3)道琼斯:http://hq.sinajs.cn/list=int_dji (4)纳斯达克:http://hq.sinajs.cn/list=int_nasdaq (5)恒生:http://hq.sinajs.cn/list=int_hangseng (6)日经指数:http://hq.sinajs.cn/list=int_nikkei (7)台湾加权:http://hq.sinajs.cn/list=b_TWSE (8)新加坡:http://hq.sinajs.cn/list=b_FSSTI

4、股票详细数据接口:http://qt.gtimg.cn/q=sz000001 (来自腾讯) 5、股票走势图数据接口:

(1)分时走势图:http://image.sinajs.cn/newchart/min/n/sh000001.gif (2)日K线走势图: (3)周K线走势图: (4)月K线走势图:

http://image.sinajs.cn/newchart/daily/n/sh000001.gif http://image.sinajs.cn/newchart/weekly/n/sh000001.gif http://image.sinajs.cn/newchart/monthly/n/sh000001.gif 6、个股新闻数据接口:

http://news.10jqka.com.cn/stock_mlist/sz000001_1_-1_1_1/ 7、行业新闻数据接口:

http://news.10jqka.com.cn/stock_mlist/sz000001_1_1_1_1/ 8、论股数据接口:

(1)最新:

http://t.10jqka.com.cn/api.php?method=group.getLatestPost&code=601688&limit=20&return=json&pid=&allowHtml=0 (来自同花顺)

(2)最热:

http://t.10jqka.com.cn/api.php?method=group.getSortPost&code=601688&limit=20&page=0&return=json&allowHtml=0 9、诊股数据接口:

(1)个股公告:

(2)个股研报:

http://wiapi.hexun.com/search/stocknotice.php?code=000001&p=1&c=20 (来自和讯) http://info.wiapi.hexun.com/mobile/000001/bulletin_list.xhtml?v=1 http://wiapi.hexun.com/search/stocknews.php?code=000001&p=1&c=20 10、板块接口:

(1)热门板块:

http://wiapi.hexun.com/search/stockreport.php?code=000001&p=1&c=20 (3)个股新闻:

48

http://quote.wiapi.hexun.com/v3/riseFall?block=251&sort=15&type=1&start=0&end=30 http://ifzq.gtimg.cn/appstock/app/mktHs/rank?l=100&p=1&t=01/averatio(来自腾讯) http://ifzq.gtimg.cn/appstock/app/mktHs/industry?t=pt010100

(2)地域板块: (3)证监会行业板块: (4)ICB板块: (5)成分股:

http://quote.wiapi.hexun.com/v3/riseFall?block=250&sort=15&type=1&start=0&end=30 http://quote.wiapi.hexun.com/v3/riseFall?block=417&sort=15&type=1&start=0&end=30 http://quote.wiapi.hexun.com/v3/riseFall?block=249&sort=15&type=1&start=0&end=30 http://quote.wiapi.hexun.com/v3/riseFall?block=3438&sort=15&type=1&start=0&end=30 11、股市资讯数据接口:

(1)要闻:http://news.10jqka.com.cn/headline_mlist/1_0_1_1/ (2)滚动:http://news.10jqka.com.cn/gundong_mlist/1_0_1_1/ (3)机会:http://news.10jqka.com.cn/tzjh_mlist/1_0_1_1/ (4)自选股新闻:

http://news.10jqka.com.cn/stock_mlist/601519,002557,000100,600600,002024,600000,600015,600980,601998,600036_1_-1_1_1/

12、股市直播数据接口:

http://t.10jqka.com.cn/circle/mobile/broadIndex.js 13、决策数据接口:

(1)行业报告: (2)个股报告: (3)机构晨报: (4)策略报告:

http://wiapi.hexun.com/news/reportlist.php?rt=2&p=1&c=20 http://wiapi.hexun.com/news/reportlist.php?rt=1&p=1&c=20 http://wiapi.hexun.com/news/reportlist.php?rt=3&p=1&c=20 http://wiapi.hexun.com/news/reportlist.php?rt=4&p=1&c=20 详细数据:http://wiapi.hexun.com/news/getreport.php?id=547504 14、F10数据接口

(1)基本资料: (2)财务数据: (3)股东情况:

(4)财务评估:

http://info.wiapi.hexun.com/mobile/601688/base.xhtml?v=1 http://info.wiapi.hexun.com/new/000001/stock_finance_l.xhtml http://info.wiapi.hexun.com/mobile/000001/stock_holder.xhtml?v=1 http://info.wiapi.hexun.com/mobile/000001/stock_star.xhtml?v=1 15、排行榜数据接口

(1)涨幅榜:

http://quote.wiapi.hexun.com/v3/riseFall?block=252&start=0&end=30&type=1&sort=15

49

(5)更多:http://news.10jqka.com.cn/eq_mlist/1/

(2)跌幅榜: (3)换手率榜: (4)成交量榜: (5)量比: (6)涨速: (7)振幅:

http://quote.wiapi.hexun.com/v3/riseFall?block=252&start=0&end=30&type=0&sort=15 http://quote.wiapi.hexun.com/v3/riseFall?block=252&start=0&end=30&type=1&sort=25 http://quote.wiapi.hexun.com/v3/riseFall?block=252&start=0&end=30&type=1&sort=5 http://quote.wiapi.hexun.com/v3/riseFall?block=252&start=0&end=30&type=1&sort=21 http://quote.wiapi.hexun.com/v3/riseFall?block=252&start=0&end=30&type=1&sort=16

http://quote.wiapi.hexun.com/v3/riseFall?block=252&start=0&end=30&type=1&sort=17

50

本文来源:https://www.bwwdw.com/article/0aea.html

Top