Python金融数据分析(一)
Python提供了数据挖掘和许多机器学习算法的实现。
准备数据
Tickhistory的数据能够精确到每个tick。我决定导出一个月的XAU日线OHLC数据。样本如下:
| Date | Open | High | Low | Close | Volume |
|---|---|---|---|---|---|
| 20170927 | 1293.231 | 1296.208 | 1281.451 | 1283.511 | 108.903715221408 |
| 20170928 | 1283.512 | 1288.741 | 1277.682 | 1286.932 | 105.861770183576 |
| 20170929 | 1286.931 | 1290.332 | 1275.751 | 1278.502 | 105.976955427706 |
| 20171001 | 1279.541 | 1280.072 | 1276.771 | 1277.868 | 3.52173000181574 |
| 20171002 | 1277.861 | 1277.878 | 1269.328 | 1271.092 | 95.848550074621 |
| 20171003 | 1271.071 | 1274.701 | 1268.298 | 1272.439 | 85.1280900694219 |
| 20171004 | 1272.439 | 1282.172 | 1270.592 | 1273.959 | 92.5239001664886 |
| 20171005 | 1273.952 | 1278.962 | 1266.328 | 1269.052 | 92.4760702919739 |
| 20171006 | 1269.051 | 1276.492 | 1260.581 | 1276.262 | 92.658720124633 |
| 20171008 | 1276.051 | 1277.722 | 1275.332 | 1276.591 | 2.77864000279806 |
| 20171009 | 1276.592 | 1285.431 | 1275.251 | 1283.169 | 86.3232300794261 |
| 20171010 | 1283.191 | 1294.169 | 1282.081 | 1289.581 | 101.68240010105 |
| 20171011 | 1289.582 | 1293.491 | 1284.538 | 1292.372 | 104.91177014196 |
| 20171012 | 1292.401 | 1297.431 | 1289.631 | 1293.916 | 96.6392201421004 |
| 20171013 | 1293.923 | 1303.772 | 1290.858 | 1303.511 | 97.4759100139127 |
| 20171015 | 1303.131 | 1304.268 | 1301.718 | 1304.229 | 4.44811000813934 |
| 20171016 | 1304.178 | 1306.012 | 1290.482 | 1294.971 | 100.152445203097 |
| 20171017 | 1294.989 | 1295.209 | 1281.518 | 1285.932 | 103.87640020813 |
| 20171018 | 1285.931 | 1288.851 | 1276.972 | 1280.301 | 98.6450122981942 |
| 20171019 | 1280.301 | 1291.038 | 1276.639 | 1290.072 | 115.682070135092 |
| 20171020 | 1290.071 | 1290.568 | 1277.921 | 1280.061 | 105.518403077434 |
| 20171022 | 1279.421 | 1279.422 | 1274.261 | 1274.942 | 5.02500604657143 |
| 20171023 | 1274.938 | 1283.231 | 1272.518 | 1282.631 | 98.7542351619195 |
| 20171030 | 1272.331 | 1272.831 | 1270.671 | 1271.361 | 8.96640002776985 |
创建数据
import pandas as pd
def read_data():
location = '****.csv'
df = pd.read_csv(location)
索引数据
Pandas会使用从0开始的整数作为每条数据的默认索引,并且同样支持基于日期的时间序列数据进行索引。此外,在需要时还可以依据时间范围筛选所需的数据。
import pandas as pd
def read_data_and_index_by_date():
location = 'XAUUSD.csv'
df = pd.read_csv(location, index_col = "Date", parse_dates=True)
return df
def fillter_data_by_date(start_date, end_date):
df = read_data_and_index_by_date();
return df.ix[start_date:end_date]
十年数据
离开大数据分析技术的支持后,在这一背景下机器学习在这一领域的应用前景就显得力不从心了
def how_long(func, *args):
t0 = time()
result = func(*args)
t1 = time()
return result, (t1 - t0)
运行结果:
$ python ReadCSV.py
Date Close
2017-10-11 1292.372
2017-10-12 1293.916
2017-10-13 1303.511
2017-10-15 1304.229
2017-10-16 1294.971
2017-10-17 1285.932
To index period data of 10 years, python takes: 0.0149998664856
描述数据
也可以视为对数据进行操作的一种方式,在pandas中,数据操作通常以声明式的方式进行。这种设计使得开发者能够将更多的时间和精力投入到算法的研究和优化中去。由于算法通常需要处理多种形式的数据以及不同形态的数据表达方式,在实际应用中可能会遇到诸多挑战。为了高效地描述数据特征以及反映当前市场状况的基本形态特征,则是我们对其功能需求之一之一。此外,在Python环境中Pandas可以被视为一个非常有用的工具包,并且它能够帮助我们轻松地完成许多复杂的数据分析任务。其中最基础的功能模块包括:针对二维数组设计的各种函数集合以及基于Numpy框架开发的一系列扩展库功能组件等。具体来说,在这一部分我尝试通过编写代码来展示如何计算并绘制出过去一年中XAU货币20日移动平均线的变化趋势图
def get_rolling_mean(values, window):
"""Return rolling mean of given values, using specified window size."""
return values.rolling(window=20,center=False).mean()
$ python ReadCSV.py
Date 移动平均值
2017-01-24 1191.73710
2017-01-25 1194.26645
2017-01-26 1195.82240
2017-01-27 1197.03590
2017-01-29 1197.70235
2017-01-30 1198.92290
2017-01-31 1200.81040
2017-02-01 1202.16790
2017-02-02 1203.59285
2017-02-03 1204.89665
2017-02-05 1206.12345
……
在截至2017年1月24日之前不会有数据,在前期缺乏必要的移动平均指标的数据情况下
在截至2017年1月24日之前不会有数据,在前期缺乏必要的移动平均指标的数据情况下
def plot_data(df, title="prices"):
ax = df.plot(title=title, fontsize=12)
ax.set_xlabel("Date")
ax.set_ylabel("Price")
plt.show()

