我每天都在使用加密货币进行交易,并希望找到哪些是最受欢迎的交易密码。 我有每个加密的CSV文件,包含以下字段:
Date Sell Buy
43051.23918 1925.16 1929.83
43051.23919 1925.12 1929.79
43051.23922 1925.12 1929.79
43051.23924 1926.16 1930.83
43051.23925 1926.12 1930.79
43051.23926 1926.12 1930.79
43051.23927 1950.96 1987.56
43051.23928 1190.90 1911.56
43051.23929 1926.12 1930.79
我想查一下:
有多少报价以利润结束:
获得理论职位需要多长时间才能盈利。
什么是潜在利润。
我使用以下代码:
#converting from OLE to datetime
OLE_TIME_ZERO = dt.datetime(1899, 12, 30, 0, 0, 0)
def ole(oledt):
return OLE_TIME_ZERO + dt.timedelta(days=float(oledt))
#variables initialization
buy_time = ole(43031.57567) - ole(43031.57567)
sell_time = ole(43031.57567) - ole(43031.57567)
profit_buy_counter = 0
no_profit_buy_counter = 0
profit_sell_counter = 0
no_profit_sell_counter = 0
max_profit_buy_positions = 0
max_profit_buy_counter = 0
max_profit_sell_positions = 0
max_profit_sell_counter = 0
df = pd.read_csv("C:/P/Crypto/bitcoin_test_normal_276k.csv")
#comparing to max
for index, row in df.iterrows():
a = index + 1
df_slice = df[a:]
if df_slice["Sell"].max() - row["Buy"] > 0:
max_profit_buy_positions += df_slice["Sell"].max() - row["Buy"]
max_profit_buy_counter += 1
for index1, row1 in df_slice.iterrows():
if row["Buy"] < row1["Sell"] :
buy_time += ole(row1["Date"])- ole(row["Date"])
profit_buy_counter += 1
break
else:
no_profit_buy_counter += 1
#comparing to sell
for index, row in df.iterrows():
a = index + 1
df_slice = df[a:]
if row["Sell"] - df_slice["Buy"].min() > 0:
max_profit_sell_positions += row["Sell"] - df_slice["Buy"].min()
max_profit_sell_counter += 1
for index2, row2 in df_slice.iterrows():
if row["Sell"] > row2["Buy"] :
sell_time += ole(row2["Date"])- ole(row["Date"])
profit_sell_counter += 1
break
else:
no_profit_sell_counter += 1
num_rows = len(df.index)
buy_avg_time = buy_time/num_rows
sell_avg_time = sell_time/num_rows
if max_profit_buy_counter == 0:
avg_max_profit_buy = "There is no profitable buy positions"
else:
avg_max_profit_buy = max_profit_buy_positions/max_profit_buy_counter
if max_profit_sell_counter == 0:
avg_max_profit_sell = "There is no profitable sell positions"
else:
avg_max_profit_sell = max_profit_sell_positions/max_profit_sell_counter
该代码适用于10K-20K线路,但数量较多(276K)需要很长时间(超过10小时)
我可以做些什么才能改善它?
有没有&#34; Pythonic&#34;将数据框中的每个值与所有后续值进行比较的方法?
注意 - CSV中的日期在OLE中,因此我需要将其转换为Datetime。
测试文件: 谢谢你的评论。 Here您可以找到我使用过的文件:
答案 0 :(得分:0)
首先,我想为每行Sell
和Buy
创建累计最大值/最小值,因此很容易与之比较。 pandas
有cummax
和cummin
,但它们走错了方向。所以我们会这样做:
df['Max Sell'] = df[::-1]['Sell'].cummax()[::-1]
df['Min Buy'] = df[::-1]['Buy'].cummin()[::-1]
现在,我们可以比较每一行:
df['Buy Profit'] = df['Max Sell'] - df['Buy']
df['Sell Profit'] = df['Sell'] - df['Min Buy']
我很肯定这并不是你想要的,因为我不能完全理解你想要做的事情,但希望它能引导你朝着正确的方向前进。
在比较你的函数和我的函数之后,会有一点点差别,因为你的a
偏离索引一个。删除该偏移量后,您将看到我的方法产生的结果与您的相同,只是在非常短的时间内完成:
for index, row in df.iterrows():
a = index
df_slice = df[a:]
assert (df_slice["Sell"].max() - row["Buy"]) == df['Max Sell'][a] - df['Buy'][a]
else:
print("All assertions passed!")
请注意,这仍然需要您的功能所需的很长时间。请注意,这可以通过shift
修复,但我不想长时间运行您的功能以找出改变它的方法。