生成模拟外汇或股票 OHLC 数据,用于 pandas 问题的可重现示例

ade*_*e1e 3 python numpy pandas

概括

如何使用 Numpy/Pandas 创建 OHLC 数据框

  • ATR或交易范围约为.0075.02范围可以指定为变量。希望看到随机价格大致在这些边界内波动。
  • Close第一行的值位于(1.1904参见下面的示例)。
  • 并且可以使用种子值(即np.random.seed),因此数据帧是可重现的。

概述

我正在尝试生成模拟外汇数据,以使用 Numpy/Pandas 为 pandas 问题创建可重现的示例。该问题涵盖了类似的数据要求,但使用开盘价、最高价、最低价、收盘价数据的外汇数据示例可能很有用,有助于避免将大量数据粘贴到问题中。

作为数据框外观的示例,我看到周五的欧元/美元汇率如下:

eur = {"open" : 1.19160,
"high" : 1.19371,
"low" : 1.18739,
"close" : 1.1904}

pd.DataFrame(eur,index=['19/3/2021'])
Run Code Online (Sandbox Code Playgroud)

欧元

到目前为止我尝试过什么?

这是一个基于前面提到的问题的假/模拟数据示例,它给出了我在如何使用np.random. 我添加了重新采样并转换为 OHLC,但不确定如何使用 Numpy 生成/控制数据。

periods = 250

    eurusd = pd.DataFrame({ 
        'ticker':np.repeat( ['eurusd'], periods ),
        'date':np.tile( pd.date_range('1/1/2011', periods=periods, freq='H'), 1 ),
        'price':(np.random.randn(periods).cumsum() + 10) })
    eurusd.index = pd.to_datetime(eurusd.date)
    eurusd.price.resample('D').ohlc()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

我已经更新了生成此数据的尝试(请参阅下面的“到目前为止我尝试过什么”),方法是从每小时数据重新采样为“每日”后生成 OHLC 列。我仍在研究 Numpy 数据生成元素,以生成.0075每天某个地方的一系列数据。

ade*_*e1e 6

这是我的答案,但我很高兴看到代码被细化/最小化的其他答案。

def genMockDataFrame(days,startPrice,colName,startDate,seed=None): 
   
    periods = days*24
    np.random.seed(seed)
    steps = np.random.normal(loc=0, scale=0.0018, size=periods)
    steps[0]=0
    P = start_price+np.cumsum(steps)
    P = [round(i,4) for i in P]

    fxDF = pd.DataFrame({ 
        'ticker':np.repeat( [colName], periods ),
        'date':np.tile( pd.date_range(startDate, periods=periods, freq='H'), 1 ),
        'price':(P)})
    fxDF.index = pd.to_datetime(fxDF.date)
    fxDF = fxDF.price.resample('D').ohlc()
    return fxDF
Run Code Online (Sandbox Code Playgroud)

生成带有种子的数据帧以允许其他人重现数据

df = genMockDataFrame(100,1.1904,'eurusd','19/3/2020',seed=1)
Run Code Online (Sandbox Code Playgroud)

如果需要,绘制数据:

import plotly.graph_objects as go

fig = go.Figure(data=go.Ohlc(x=df.index,
                    open=df['open'],
                    high=df['high'],
                    low=df['low'],
                    close=df['close']))
fig.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述