生成模拟外汇或库存OHLC数据,用于可复制的问题示例

2024-04-26 06:33:58 发布

您现在位置:Python中文网/ 问答频道 /正文

总结

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

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

概述

我正在尝试生成模拟外汇数据,以便使用Numpy/pandas为pandas问题创建可复制的示例。本question涵盖了类似的数据要求,但使用开放、高、低、封闭数据的外汇数据示例可能很有用,并有助于避免将大量数据粘贴到问题中

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

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

pd.DataFrame(eur,index=['19/3/2021'])

eurusd

到目前为止我试过什么

这是一个基于前面提到的question的伪/模拟数据示例,它给出了关于如何使用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()

enter image description here

编辑

我已经更新了我生成这些数据的尝试(请参阅下面的“到目前为止我尝试了什么”),在从小时数据重新采样到每日数据后生成OHLC列。我仍在研究Numpy数据生成元素,以便每天生成大约.0075的数据


Tags: 数据numpy示例dataframepandasdatenprandom
3条回答

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

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

生成带有种子的dataframe,以允许其他人复制数据

df = genMockDataFrame(100,1.1904,'eurusd','19/3/2020',seed=1)

如果需要,绘制数据:

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()

enter image description here

变化不大。只是让代码更简洁而已

def genMockDataFrame(days, startPrice, colName, startDate, seed= None): 
    
    periods = days*24
    np.random.seed(seed)
    
    P    = np.around(np.random.normal(scale= 0.0018, size= periods).cumsum(), 4)
    P[0] = np.around(startPrice, 4)
    
    fxDF = pd.DataFrame({
        'ticker': [colName] * periods,
        'price' : P,
    },
        index= pd.date_range(startDate, periods= periods, freq='H')
    )
    
    return fxDF.price.resample('D').ohlc()

您可以像上面那样随机抽取欧元/美元样本,或者使用免费quandl API获取历史中点值作为起点,然后从正态分布中抽取'True Range'值,平均值0.0075和适当的标准偏差,并从中模拟高点和低点:

import quandl as q
import numpy as np

df = q.get('ECB/EURUSD',
         start_date='2020-06-01',
         end_date='2021-01-06',
         api_key=API_KEY)
df['Sampled True Range'] = 0
df['Sampled True Range'] = df[['Sampled True Range']].apply(lambda x: x + 
np.random.normal(loc = .0075, scale = 0.005), axis = 1).clip(0.001, np.inf)
df['High'] = df['Value'] + df['Sampled True Range'] / 2
df['Low'] = df['Value'] - df['Sampled True Range'] / 2
df.describe()

result 您还可以以类似的方式应用随机正态误差来模拟'Open'

相关问题 更多 >

    热门问题