数据格式转换
虽然赫兹量化已经从客户那里获得了数据,但数据格式不是我们需要的。数据是“numpy.ndarray”,如下所示:
"[(1692368100, 1893.51, 1893.97,1893.08,1893.88,548, 35, 0) (1692369000, 1893.88, 1894.51, 1893.41, 1894.51, 665, 35, 0) (1692369900, 1894.5, 1894.91, 1893.25, 1893.62, 755, 35, 0) (1692370800, 1893.68, 1894.7 , 1893.16, 1893.49, 1108, 35, 0) (1692371700, 1893.5 , 1893.63, 1889.43, 1889.81, 1979, 35, 0) (1692372600, 1889.81, 1891.23, 1888.51, 1891.04, 2100, 35, 0) (1692373500, 1891.04, 1891.3 , 1889.75, 1890.07, 1597, 35, 0) (1692374400, 1890.11, 1894.03, 1889.2, 1893.57, 2083, 35, 0) (1692375300, 1893.62, 1894.94, 1892.97, 1894.25, 1692, 35, 0) (1692376200, 1894.25, 1894.88, 1890.72, 1894.66, 2880, 35, 0) (1692377100, 1894.67, 1896.69, 1892.47, 1893.68, 2930, 35, 0) ...(1693822500, 1943.97, 1944.28, 1943.24, 1943.31, 883, 35, 0) (1693823400, 1943.25, 1944.13, 1942.95, 1943.4 , 873, 35, 0) (1693824300, 1943.4, 1944.07, 1943.31, 1943.64, 691, 35, 0) (1693825200, 1943.73, 1943.97, 1943.73, 1943.85, 22, 35, 0)]"
因此,让我们使用pandas进行转换,添加的代码用绿色标记:
# Copyright 2021, MetaQuotes Ltd. # https://www.mql5.com import MetaTrader5 as mt import pandas as pd if not mt.initialize("D:\\Project\\mt\\MT5\\terminal64.exe"): print('initialize() failed!') else: print(mt.version()) sb=mt.symbols_total() rts=None if sb > 0: rts=mt.copy_rates_from_pos("GOLD_micro",mt.TIMEFRAME_M15,0,1000) mt.shutdown() rts_fm=pd.DataFrame(rts)
现在再次查看数据格式,如下所示:
print(rts_fm.head(10))
添加图片注释,不超过 140 字(可选)
输入数据必须是pandas的。DataFrame格式包含一列作为观测数据(float或int格式),因此我们必须将数据处理为pytrendseries要求的格式,如下所示:
td_data=rts_fm[['time','close']].set_index('time')
让赫兹量化看看前10行数据是什么样子的:
print(td_data.head(10))
添加图片注释,不超过 140 字(可选)
注意:“td_data”不是我们最后的数据样式,它只是我们获取数据趋势的过渡产品。
现在,赫兹量化的数据是完全可用的,但为了后续操作,最好将我们的日期格式转换为数据帧,因此我们应该在“td_data=rts_fom[['time','close']].set_index('time')”之前添加以下代码:
rts_fm['time']=pd.to_datetime(rts_fm['time'], unit='s')
我们的输出将如下所示:
time | close |
---|---|
2023-08-18 20:45:00 | 1888.82000 |
2023-08-18 21:00:00 | 1887.53000 |
2023-08-18 21:15:00 | 1888.10000 |
2023-08-18 21:30:00 | 1888.98000 |
2023-08-18 21:45:00 | 1888.37000 |
2023-08-18 22:00:00 | 1887.51000 |
2023-08-18 22:15:00 | 1888.21000 |
2023-08-18 22:30:00 | 1888.73000 |
2023-08-18 22:45:00 | 1889.12000 |
2023-08-18 23:00:00 | 1889.20000 |
本节的完整代码:
# Copyright 2021, MetaQuotes Ltd. # https://www.mql5.com import MetaTrader5 as mt import pandas as pd if not mt.initialize("D:\\Project\\mt\\MT5\\terminal64.exe"): print('initialize() failed!') else: print(mt.version()) sb=mt.symbols_total() rts=None if sb > 0: rts=mt.copy_rates_from_pos("GOLD_micro",mt.TIMEFRAME_M15,0,1000) mt.shutdown() rts_fm=pd.DataFrame(rts) rts_fm['time']=pd.to_datetime(rts_fm['time'], unit='s') td_data=rts_fm[['time','close']].set_index('time') print(td_data.head(10))
添加图片注释,不超过 140 字(可选)
标注数据
1. 获取趋势数据
首先导入“pytrendseries”包:
import pytrendseries as pts
赫兹量化使用“pts.detecttrend()”函数来查找趋势,然后为该函数定义“td”变量,该参数有两个选项-“downtrend”或“uptrend”:
td='downtrend' # or "uptrend"
我们需要另一个参数“wd”作为趋势的最大周期:
wd=120
还有一个参数可以定义,也可以不定义,但我个人认为最好定义它,这个参数指定了趋势的最小周期:
limit=6
现在我们可以将参数填充到函数中以获得趋势:
trends=pts.detecttrend(td_data,trend=td,limit=limit,window=wd)
然后检查结果:
print(trends.head(15))
from | to | price0 | price1 | index_from | index_to | time_span | drawdown | |
---|---|---|---|---|---|---|---|---|
1 | 2023-08-21 01:00:00 | 2023-08-21 02:15:00 | 1890.36000 | 1889.24000 | 13 | 18 | 5 | 0.00059 |
2 | 2023-08-21 03:15:00 | 2023-08-21 04:45:00 | 1890.61000 | 1885.28000 | 22 | 28 | 6 | 0.00282 |
3 | 2023-08-21 08:00:00 | 2023-08-21 13:15:00 | 1893.30000 | 1886.86000 | 41 | 62 | 21 | 0.00340 |
4 | 2023-08-21 15:45:00 | 2023-08-21 17:30:00 | 1896.99000 | 1886.16000 | 72 | 79 | 7 | 0.00571 |
5 | 2023-08-21 20:30:00 | 2023-08-21 22:30:00 | 1894.77000 | 1894.12000 | 91 | 99 | 8 | 0.00034 |
6 | 2023-08-22 04:15:00 | 2023-08-22 05:45:00 | 1896.19000 | 1894.31000 | 118 | 124 | 6 | 0.00099 |
7 | 2023-08-22 06:15:00 | 2023-08-22 07:45:00 | 1896.59000 | 1893.80000 | 126 | 132 | 6 | 0.00147 |
8 | 2023-08-22 13:00:00 | 2023-08-22 16:45:00 | 1903.38000 | 1890.17000 | 153 | 168 | 15 | 0.00694 |
9 | 2023-08-22 19:00:00 | 2023-08-22 21:15:00 | 1898.08000 | 1896.25000 | 177 | 186 | 9 | 0.00096 |
10 | 2023-08-23 04:45:00 | 2023-08-23 06:00:00 | 1901.46000 | 1900.25000 | 212 | 217 | 5 | 0.00064 |
11 | 2023-08-23 11:30:00 | 2023-08-23 13:30:00 | 1904.84000 | 1901.42000 | 239 | 247 | 8 | 0.00180 |
12 | 2023-08-23 19:45:00 | 2023-08-23 23:30:00 | 1919.61000 | 1915.05000 | 272 | 287 | 15 | 0.00238 |
13 | 2023-08-24 09:30:00 | 2023-08-25 09:45:00 | 1921.91000 | 1912.93000 | 323 | 416 | 93 | 0.00467 |
14 | 2023-08-25 15:00:00 | 2023-08-25 16:30:00 | 1919.88000 | 1913.30000 | 437 | 443 | 6 | 0.00343 |
15 | 2023-08-28 04:15:00 | 2023-08-28 07:15:00 | 1916.92000 | 1915.07000 | 486 | 498 | 12 | 0.00097 |
您还可以通过函数“pts.vizplot.plot_trend()”得到结果图:
pts.vizplot.plot_trend(td_data,trends)
添加图片注释,不超过 140 字(可选)
同样,我们可以通过代码来查看上升趋势:
td="uptrend" wd=120 limit=6 trends=pts.detecttrend(td_data,trend=td,limit=limit,window=wd) print(trends.head(15)) pts.vizplot.plot_trend(td_data,trends)