各位朋友想想看,现在有人空有编程技能,在股票数据获取上被束缚得难受,可币圈却大方地开放 API 接口,这差距多大太让人感兴趣!下面我就好好聊一下做股票数据分析软件那些事。
股票 API 之困
咱国内交易股票,只有沪深两家交易所,还是中心化的。这对那些有编程技能的人来说,那可是一场“噩梦”!人家不免费提供 API 接口,搞得这些人根本没办法施展,像是被券商紧紧地捆住手脚,难受得不行。就说咱,满心想着利用自己的技术在股市里搞出点名堂,可一遇到这 API 难题,瞬间感觉希望破灭了。不过,别急,币圈可是一片新天地。
币圈 API 福音
在币圈,情况那叫一个大不同所有数字货币交易所都特别大方,直接为所有人免费开放 API 接口。这可真是那些具备编程技能、还有一定数学基础又喜欢量化的人的福音!他们终于有机会去验证自己的交易策略了。就拿我们认识的一个朋友来说,他一直想着实践量化策略,在股票市场处处碰壁,到了币圈一下子就活起来了,开始大干一场。
比特币交易影响力
https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20180426&end=20180726
在数字货币市场里比特币(BTC)那可就跟沪深 300 指数在股票市场一样厉害。通常,像 ETH、EOS、BTM 这些主流数字货币,它们的走势都会跟 BTC 联动。所以分析 BTC 的交易趋势可太重要!平时判断 BTC 走势的方法,万变不离其宗,先爬取数据,接着分析数据,最后把结果可视化,再根据结果来设计交易策略。这几步走下来,就知道该怎么在数字货币市场行动
https://coinmarketcap.com/currencies/eos/historical-data/?start=20180426&end=20180726
代码扩展进行时
有了前面的想法,说干就得干!昨天下午我就行动起来,完善了以前的代码。让软件以前能分析股票数据,现在又可以分析数字货币的数据了。其实,需要扩展的就只有抓取数据那一块儿,其他部分逻辑都一样,修改一下配置参数就行。我们的数据可是从比较权威的测评网站抓取的,好多 APP 都用那上面的数据。当得到 HTML 的 DOM 节点后,利用特定的选择器语法,就能找到对应标签拿到我们想要的数据。
private IHtmlDocument GetHtmlDocument(string coinName, DateTime start, DateTime end)
{
string start1 = DateToYearMonthDay(start);
string end1 = DateToYearMonthDay(end);
string url = "https://coinmarketcap.com/currencies/"
+ coinName
+ "/historical-data/?start="
+ start1 +
"&end=" + end1;
IHtmlDocument document;
try
{
document = new JumonyParser().LoadDocument(url);
}
catch
{
document = null;
}
return document;
}
private string DateToYearMonthDay(DateTime dt)
{
//规范化时间的表示
string result = dt.Year.ToString();
result += dt.Month.ToString().PadLeft(2, '0');
result += dt.Day.ToString().PadLeft(2, '0');
return result;
}
数据处理再补充
股票数据是从新浪财经网站抓取的,它的数据起始和终止时间得按照年份(year)和季度(jidu)传递。为了扩展代码,就做了一个与 year 和 jidu 的映射。这样代码的逻辑就完全统一,以后无论是股票数据还是数字货币数据都能处理得妥妥的。还有数据的分析窗体它可以用来分析爬取下来的交易数据。至此,爬取、分析、可视化数据的整个逻辑,通过这俩案例就都介绍完
未来之展望
http://vip.stock.finance.sina.com.cn/corp/go.php/vMS_MarketHistory/stockid/000300/type/S.phtml?year=2018&jidu=3
至于数字货币交易所之间的套利和交易所内部的三角套利,等开学后让新来的 LSGO 软件技术团队的同学们练练手。我得抓紧时间去干正事!要多出去跟其他老师的团队交流,别老是在实验室对着代码。说不定在华电,除了电力,其他方面也能做出一番成绩
大家说,在币圈用这扩展后的软件做数据分析,还可能遇到啥问题不?
public static void GetDateTime(int year, int jidu, out DateTime start, out DateTime end)
{
// 给定 年份 和 季度 得到 起始时间 和 终止时间
start = new DateTime(year, 1, 1);
end = new DateTime(year, 3, 31);
switch (jidu)
{
case 2:
start = new DateTime(year, 4, 1);
end = new DateTime(year, 6, 30);
break;
case 3:
start = new DateTime(year, 7, 1);
end = new DateTime(year, 9, 30);
break;
case 4:
start = new DateTime(year, 10, 1);
end = new DateTime(year, 12, 31);
break;
}
}