March 23, 2011

在上一篇中已经说到,数据如何摆放是交易系统好用的一个基本要素,而且数据本身和系统的耦合度很低。如果有一家公司能做这种独立的数据提供商本来就是可以做的一个事情,但是我们的市场还处在一个比较早期的阶段只有一切靠自己了。

数据库我们选用MySQL,为什么选这个呢:1. 稳定 2. 高效 3. 免费 4. 流行。SQLite也是一个很好的选择,不过我对这个不太熟悉,在没有做HFT(High Frequency Trading)之前,其实对数据库也没有那么的挑剔。

数据库结构:

1. Bar data: Open, Close High, Low, Volume, Time, Ticker
2. Quote: Ticker, Date, Time Stamp, [Bid, Bid Size; Ask, Ask Size][i](i=1-5);
3. TA data: K, D, J, RSI,… …(这个可以N长N长)
4. Fundamental data
5. MacroEconomics data

数据库交互:

正如我们提及到的,整个Proj将以Python为主要的载体,利用模块化的设计来逐步完善。

程序是为了解决问题存在的,而不是制造问题。

Python本来是有MySQLDB这个很方便的DB API模块的,有人会说那你还要罗嗦什么嘛,直接SQL之呀!大错特错了,如果用SQL来进行系统的开发,我们将会陷入万劫不复的困境。Python是个优美的语言,SQL也是一个优美的语言,但是两个优美的语言遇到一起,产生的不总是优美:-) 我们遇到的第一个问题是,如果更优美的存放数据,如何把这个一行一行的数据和Python程式里的Objects联系在一起,这是一个朴素的想法。

所以我们有sqlalchemy! 这就是解决上面的问题的!
Base = declarative_base(bind=engine) 继承这个Base,即可以实现对象到数据的mapper,实在是很强大和方便。

class Bar(Base):
 __tablename__ = 'bar'

 bar_id = Column(Integer, primary_key=True)
 gregorian_day = Column(Integer)
 date_string = Column(String(12))
 year = Column(Integer)
 month = Column(Integer)
 day = Column(Integer)
 px_open = Column(DECIMAL)
 px_close = Column(DECIMAL)
 px_high = Column(DECIMAL)
 px_low = Column(DECIMAL)
 volume = Column(Integer)

 def __init__(self, gregorian_day, date_string, year, month, day,
  px_open, px_close, px_high, px_low, volume):
  self.gregorian_day = gregorian_day
  self.date_string = date_string
  self.year = year
  self.month = month
  self.day = day
  self.px_open = px_open
  self.px_close = px_close
  self.px_high = px_high
  self.px_low = px_low
  self.volume = volume

 def __repr__(self):
  return "" % \
  (self.gregorian_day, self.date_string, self.year, self.month,
  self.day, self.px_open, self.px_close, self.px_high,
  self.px_low, self.volume)

然后调用一下Base.metadata.create_all(engine)即可以自动创建好相关的数据库。再调用session()既可以实现数据的提交。这里不妨看下manual,或者偷懒的看一下中文版的。

定义好Class,定义好relation,定义好mapper,定义好DB。下面就是去找数据了。

最重要的数据来自两块,首先解决Bar,对于Python而言,强大而牛X的matplotlib里有一个finance组件里就直接包含了这个函数。quotes_historical_yahoo这个函数可以直接返回ticker的Bar data在tuples,真是方便无比。

from matplotlib.finance import quotes_historical_yahoo

quotes_historical_yahoo(ticker, start, end) #list of tuples

然后每日让电脑自动的去synchronize数据,那么Bar的数据就搞定勒;下面就是实时data,实时的data来自sina(下文为部分复制粘贴),只需访问新浪的股票数据 接口:

例如: http://hq.sinajs.cn/list=sh601006

这个股票数据接口会返回一串文本,如下:

var hq_str_sh601006="大秦铁路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91,
26.92, 22114263, 589824680, 4695, 26.91, 57590, 26.90, 14700, 26.89, 14300,
26.88, 15100, 26.87, 3100, 26.92, 8900, 26.93, 14230, 26.94, 25150, 26.95,
15220, 26.96, 2008-01-11, 15:05:32";

其实上面的每一个数据都代表了一个股票数据,具体股票数据的含义如下:

0: "大秦铁路",股票名字;
1: "27.55",今日开盘价;
2: "27.25",昨日收盘价;
3: "26.91",当前价格;
4: "27.55",今日最高价;
5: "26.20",今日最低价;
6: "26.91",竞买价,即“买一”报价;
7: "26.92",竞卖价,即“卖一”报价;
8: "22114263",成交的股票数(单位是股)9: "589824680",成交金额,单位为“元10: "4695",“买一”申请4695股,即47手;
11: "26.91",“买一”报价;
12: "57590",“买二”
13: "26.90",“买二”
14: "14700",“买三”
15: "26.89",“买三”
16: "14300",“买四”
17: "26.88",“买四”
18: "15100",“买五”
19: "26.87",“买五”
20: "3100",“卖一”申报3100股,即31手;
21: "26.92",“卖一”报价
(22, 23), (24, 25), (26,27), (28, 29)分别为“卖二”至“卖四的情况”
30: "2008-01-11",日期;
31: "15:05:32",时间;

这个接口迄今为止还用的挺好,根据我自己和level II数据的比对,这个数据基本是实时的,更新非常快,用Python解析上面这段报文是很简单的,不加多说,放入数据库就可以实现高频数据,不放呢,就让你的trading system帮你看盘吧!为了能更快的读取数据,可行的方法是用多线程,不过还是比较慢,一个更为山寨的方法是,通过读大智慧的数据来获得实时数据,复制大智慧的数据进剪贴板,然后解析剪贴板的内容,这个我用一个叫快手的软件实现了:-) 那叫一个山寨!有一位朋友做了一个local的数据解析软件叫STS,我还没有弄清楚原理,有机会问问他怎么做的再和大家分享~

到这里,行情的数据都做完了,下面就是fundamental数据了,这一块我也有一些山寨的好用的方法:-)

先回家了,最近的市场在震荡中寻找突破,不过短期总结是,害怕踏空不敢往下砸,恐惧紧缩不愿往上顶。市场的意见非常的不一致,所以短期很难有大行情,也非常的难做。

Tags: ,,.